Einfache Methode zum zuverlässigen Erkennen von Code im Text?


142

GMail hat diese Funktion , wo es wird Sie warnen , wenn Sie versuchen , eine E - Mail zu senden , dass sie denkt , dass eine Anlage haben könnte.

Meinten Sie Dateien anhängen?

Da GMail die Zeichenfolge see the attachedin der E-Mail, aber keinen tatsächlichen Anhang gefunden hat, wird beim Klicken auf die Schaltfläche Senden ein OK / Abbrechen-Dialogfeld angezeigt.

Wir haben ein ähnliches Problem beim Stapelüberlauf. Das heißt, wenn ein Benutzer einen Beitrag wie diesen eingibt :

Mein Problem ist, dass ich die Datenbank ändern muss, aber nicht erstellen möchte 
eine neue Verbindung. Beispiel:

DataSet dsMasterInfo = new DataSet ();
Datenbank db = DatabaseFactory.CreateDatabase ("ConnectionString");
DbCommand dbCommand = db.GetStoredProcCommand ("uspGetMasterName");

Dieser Benutzer hat seinen Code nicht als Code formatiert !

Das heißt, sie haben nicht um 4 Leerzeichen pro Markdown eingerückt oder die Code-Taste (oder die Tastenkombination ctrl+ k) verwendet, die das für sie erledigt.

Aus diesem Grund akzeptiert unser System viele Änderungen, bei denen Benutzer Code eingeben und manuell formatieren müssen, wenn sie dies nicht herausfinden können. Dies führt zu viel Bauchweh . Wir haben die Editor-Hilfe mehrmals verbessert, aber wenn wir nicht zum Haus des Benutzers fahren und die richtigen Tasten auf seiner Tastatur drücken, wissen wir nicht, was als nächstes zu tun ist.

Aus diesem Grund ziehen wir eine Google GMail-Warnung in Betracht:

Meinten Sie postleitzahl?

Sie haben Dinge geschrieben, von denen wir glauben, dass sie wie Code aussehen, aber Sie haben sie nicht als Code formatiert, indem Sie 4 Leerzeichen mit der Symbolleisten-Code-Schaltfläche oder dem ctrl+ kCode-Formatierungsbefehl eingerückt haben.

Um diese Warnung anzuzeigen, müssen wir jedoch feststellen, ob in einer Frage unformatierter Code enthalten ist . Was ist ein einfacher, halbzuverlässiger Weg, dies zu tun?

  • Pro Markdown wird der Code immer um 4 Leerzeichen oder innerhalb von Backticks eingerückt, sodass alles, was korrekt formatiert ist, sofort aus dem Scheck entfernt werden kann.
  • Dies ist nur eine Warnung und gilt nur für Benutzer mit geringer Reputation, die ihre ersten Fragen stellen (oder ihre ersten Antworten geben). Daher sind einige Fehlalarme in Ordnung, sofern sie etwa 5% oder weniger betragen.
  • Fragen zu Stack Overflow können in jeder Sprache gestellt werden, obwohl wir unsere Prüfung realistisch auf beispielsweise die "Big Ten" -Sprachen beschränken können. Pro Tags-Seite wäre das C #, Java, PHP, JavaScript, Objective-C, C, C ++, Python, Ruby.
  • Verwenden Sie das Creative-Commons-Data-Dump " Stapelüberlauf", um Ihre potenzielle Lösung zu überprüfen (oder wählen Sie einfach ein paar Fragen in den Top-10-Tags zu "Stapelüberlauf" aus) und sehen Sie, wie dies funktioniert.
  • Pseudocode ist in Ordnung, aber wir verwenden c #, wenn Sie besonders freundlich sein möchten.
  • Je einfacher, desto besser (solange es funktioniert). KUSS! Wenn Ihre Lösung erfordert, dass wir versuchen, Posts in 10 verschiedenen Compilern zu kompilieren, oder eine Armee von Leuten, um eine bayesianische Inferenz-Engine manuell zu trainieren, ist das nicht genau das, was wir im Sinn hatten.

34
Ich denke, wenn Sie nur immer die Warnung anzeigen, wenn keine Einrückung vorhanden ist, werden Sie weit unter der 5% Fehlergrenze sein. Dies ist nur zur Hälfte als Scherz gemeint.
Konrad Rudolph

59
@Konrad Dies würde sogar noch besser funktionieren, wenn die Meldung lautet: "Entweder fehlen in Ihrer Frage Codebeispiele, die anderen helfen, sie zu verstehen, oder Sie haben vergessen, sie richtig einzurücken." Dies sollte 99% aller Fälle abdecken.
thorsten müller

3
Dies ist eine gute Frage, aber ich glaube, es hat keine Antwort. Sie zeigen mir ein idiotensicheres System und ich zeige Ihnen einen besseren Idioten. Selbst wenn dieses Problem durch CODE behoben werden könnte, sollte es das vielleicht nicht? Es sind diese unwissenden Leute, die sich nicht die Mühe machen, eine richtige Frage zu stellen, die diese Seite für Leute wie mich ruinieren, die richtige Fragen stellen UND IMHO richtige Antworten beisteuern.
maple_shaft

2
Ein verbreitetes Muster, das ich gesehen habe, ist ein Codeblock, der ordnungsgemäß in sich eingerückt wurde, bei dem jedoch die erste und die letzte Zeile (normalerweise nur die beiden, manchmal mehr, wenn beispielsweise mehrere Funktionen angezeigt werden) nicht als Code gekennzeichnet sind. Dies sollte wahrscheinlich auch erkannt werden.
3Doubloons

3
Nebenbei bemerkt ist der GMail-Bestätigungstext ziemlich verwirrend. Wenn Ihre Antwort auf die erste Frage "Ja" lautet, lautet die Antwort auf die zweite Frage "Nein" ...
pimvdb

Antworten:


147

Eine richtige Lösung wäre wahrscheinlich ein gelerntes / statistisches Modell, aber hier sind einige lustige Ideen:

  1. Semikolons am Ende einer Zeile . Dies allein würde eine ganze Reihe von Sprachen fangen.
  2. Klammern direkt nach dem Text ohne Leerzeichen: myFunc()
  3. Ein Punkt oder Pfeil zwischen zwei Wörtern: foo.bar = ptr->val
  4. Vorhandensein von geschweiften Klammern, Klammern: while (true) { bar[i]; }
  5. Vorhandensein der Syntax "comment" (/ *, //, etc): /* multi-line comment */
  6. Gelegentliche Zeichen / Operatoren: +, *, &, &&, |, ||, <, >, ==, !=, >=, <=, >>, <<, ::, __
  7. Führen Sie Ihren Syntax-Textmarker für den Text aus. Wenn ein hoher Prozentsatz davon hervorgehoben wird, handelt es sich wahrscheinlich um Code.
  8. camelCase Text in der Post.
  9. geschachtelte Klammern, Klammern und / oder Klammern.

Man könnte die Häufigkeit verfolgen, mit der jedes dieser Elemente angezeigt wird, und diese Elemente könnten wie SpamAssassin als Funktionen in einem maschinellen Lernalgorithmus wie Perceptron verwendet werden.


25
Tipps: 3 hat ein sehr geringes Gewicht, da ein Punkt zwischen Wörtern das Ergebnis eines Tippfehlers sein kann. 5 sollte nicht mit URLs übereinstimmen. Bei 6 wird das kaufmännische Und häufig auch außerhalb des Codekontexts verwendet, sodass Sie das Zeichen möglicherweise auch weniger gewichten. Überprüfen Sie nochmals, ob der Textmarker funktioniert, da er nicht-codierten Text hervorheben kann, wie ich es manchmal in Notepad ++ sehe.
Tamara Wijsman

8
sind die . als Tippfehler - es wäre nicht schlimm, wenn man das als Autor ohnehin editieren müsste.
user151019


6
Fügen Sie "Verwendung von $ vor nicht numerischen Wörtern: $ var ist in Perl und PHP (und Ruby?) Üblich."
PhiLho

4
Sie werden meine nicht erkennen SELECT DISTINCT name FROM people WHERE id IS NOT NULL.
Benoit

54

Ich wäre gespannt, wie hoch die durchschnittlichen Werte für geschriebenes Englisch auf der einen Seite und für Code auf der anderen Seite sind.

  • Länge der Absätze
  • Länge der Zeilen
  • Größe der Wörter
  • Zeichen verwendet
  • Verhältnis zwischen alphabetischen, numerischen und anderen Symbolzeichen
  • Anzahl der Symbole pro Wort
  • usw.

Vielleicht könnte das allein schon zwischen Code und dem Rest unterscheiden. Zumindest glaube ich, dass Code, unabhängig von der Sprache, in vielen Fällen einige merklich unterschiedliche Metriken aufweisen würde.

Die gute Nachricht ist: Sie haben bereits viele Daten, auf denen Sie Ihre Statistiken aufbauen können.


Ok, ich bin mit ein paar Daten zurück, um meine Vermutungen zu stützen. :-)

Ich habe einen schnellen und schmutzigen Test auf Ihrem eigenen Beitrag und auf dem ersten Beitrag fand ich auf Stackoverflow , mit einem hübschen fortgeschrittenen Werkzeug: wc.

Nach dem Ausführen wcdes Textteils und des Codeteils dieser beiden Beispiele hatte ich Folgendes:

Schauen wir uns zuerst den englischen Teil an :

  • Der englische Teil Ihres Beitrags (2635 Zeichen, 468 Wörter, 32 Zeilen)
    • 5 Zeichen / Wort, 82 Zeichen / Zeile, 14 Wörter / Zeile
  • Der englische Teil des anderen Beitrags (1499 Zeichen, 237 Wörter, 12 Zeilen)
    • 6 Zeichen / Wort, 124 Zeichen / Zeile, 19 Wörter / Zeile

Ziemlich ähnlich findest du nicht

Schauen wir uns nun den Codeteil an !

  • Der Code-Teil Ihres Beitrags (174 Zeichen, 13 Wörter, 3 Zeilen)
    • 13 Zeichen / Wort, 58 Zeichen / Zeile, 4 Wörter / Zeile
  • Der Codeteil des anderen Beitrags (4181 Zeichen, 287 Wörter, 151 Zeilen)
    • 14 Zeichen / Wort, 27 Zeichen / Zeile, 2 Wörter / Zeile

Sehen Sie, wie nicht so unterschiedlich diese Metriken sind, aber was noch wichtiger ist, wie unterschiedlich sie von den englischen Metriken sind? Und das nur mit einem begrenzten Werkzeug. Ich bin mir jetzt sicher, dass Sie etwas wirklich Genaues erreichen können, indem Sie mehr Metriken messen (ich denke insbesondere an die Statistik der Zeichen).

Kann ich Kekse machen?


6
Die Linienlänge, insbesondere wenn Sie Aufzählungspunkte ausschließen und nach gruppierten Linien suchen, die kürzer als eine bestimmte Länge sind und bestimmte Interpunktionszeichen enthalten, scheint ein gutes Maß zu sein.
Jon Hopkins

Dies würde für Codeblöcke funktionieren, aber es scheint sehr viel schwieriger zu sein, nach Inline-CDs zu suchen. Ich bin mir jedoch nicht sicher, wie wichtig das ist - das größere Problem sind ohnehin große Blöcke unformatierten Codes.
CHAO

3
Keine Kekse. Der Link in Ihrem Beitrag ist 404.
james.garriss

@ james.garriss: Das Internet hat meine Keksdose gestohlen. :( Vielen Dank für den Hinweis.
Julien Guertault

23

In der Regel werden Markov-Ketten zum Generieren von Text verwendet, sie können jedoch auch verwendet werden, um die Ähnlichkeit von Text (gemäß CE Shannon 1950 ) mit einem trainierten Modell vorherzusagen . Ich empfehle mehrere Markov-Ketten.

Trainieren Sie für jede vorherrschende Sprache eine Markov-Kette mit einem großen, repräsentativen Codebeispiel in der Sprache. Führen Sie dann für einen Stapelüberlauf-Post, für den Sie Code erkennen möchten, für jede der Ketten die folgenden Schritte aus:

  • Durchlaufen Sie die Zeilen in der Post.
    • Deklarieren Sie zwei Variablen: ACTUAL = 1.0 und HIGHEST = 1.0
    • Durchlaufen Sie jedes Zeichen in der Zeile.
      • Bestimmen Sie für jedes Zeichen die Wahrscheinlichkeit in der Markov-Kette, dass das aktuelle Zeichen auf die vorherigen N Zeichen folgt. Stellen Sie ACTUAL = ACTUAL * PROB 1 ein . Wenn das aktuelle Zeichen nicht in der Kette vorhanden ist, verwenden Sie einen kleinen Wert für PROB 1 , z. B. 0,000001.
      • Suchen Sie nun das Zeichen, das den vorherigen N Zeichen am wahrscheinlichsten (dh mit der höchsten Wahrscheinlichkeit) folgt. Stellen Sie HIGHEST = HIGHEST * PROB 2 ein .
      • Offensichtlich ist PROB 2 > = PROB 1

Für jede Zeile sollten Sie einen IST- und einen HÖCHSTEN Wert haben. Teilen Sie IST durch HÖCHST. Dadurch erhalten Sie den Fitness-Score, um festzustellen, ob es sich bei einer bestimmten Zeile um Quellcode handelt. Das würde jeder der Zeilen in dem von Ihnen angegebenen Beispiel eine Nummer zuordnen:

my problem is I need to change the database but I don't won't to create // 0.0032
a new connection. example: // 0.0023

DataSet dsMasterInfo = new DataSet(); // 0.04
Database db = DatabaseFactory.CreateDatabase("ConnectionString");   // 0.05
DbCommand dbCommand = db.GetStoredProcCommand("uspGetMasterName");  // 0.04

Schließlich müssen Sie einen Schwellenwert auswählen, um festzustellen, wann der Beitrag Code enthält. Dies könnte einfach eine durch Beobachtung ausgewählte Zahl sein, die eine hohe Leistung erbringt. Es könnte auch die Anzahl der Zeilen mit einer hohen Punktzahl berücksichtigen.

Ausbildung

Besorgen Sie sich zum Trainieren ein großes, repräsentatives Codebeispiel in der Sprache. Schreiben Sie ein Programm, um den Codetext zu durchlaufen und jedes N-Gramm in der Datei (der Bereich für N sollte parametrisiert werden) mit der statistischen Häufigkeit des nachfolgenden Zeichens zu verknüpfen. Dies ergibt mehrere mögliche Zustände von Zeichen, die dem Bigram folgen, wobei jeder eine Wahrscheinlichkeit zugeordnet ist. Das Bigram "()" könnte beispielsweise folgende Zeichenwahrscheinlichkeiten haben:

"()" 0.5-> ";"
"()" 0.2-> "."
"()" 0.3-> "{"

Die erste sollte zum Beispiel lauten: "Die Wahrscheinlichkeit, dass ein Semikolon einem leeren Klammerzeichen folgt, beträgt 0,5."

Für das Training empfehle ich N-Gramm der Größe zwei bis fünf. Als ich darüber recherchierte , stellten wir fest, dass N-Gramme von zwei bis fünf gut für Englisch geeignet sind. Da ein Großteil des Quellcodes englischsprachig ist, würde ich vorschlagen, mit diesem Bereich zu beginnen und ihn dann anzupassen, um die optimalen Parameterwerte zu finden, sobald Sie herausfinden, was funktioniert.

Eine Einschränkung: Das Modell wird durch Bezeichner, Methodennamen, Leerzeichen usw. beeinflusst. Sie können das Training jedoch so einstellen, dass bestimmte Funktionen des Trainingsbeispiels weggelassen werden. Sie könnten beispielsweise alle unnötigen Leerzeichen reduzieren. Das Vorhandensein von Leerzeichen in der Eingabe (der Stapelüberlauf-Post) kann ebenfalls ignoriert werden. Sie können auch alphabetische Groß- und Kleinschreibung ignorieren, was angesichts unterschiedlicher Namenskonventionen für Bezeichner widerstandsfähiger ist.

Während meiner Recherche stellten wir fest, dass unsere Methoden sowohl für Spanisch als auch für Englisch gut funktionierten. Ich verstehe nicht, warum dies auch für Quellcode nicht gut funktionieren würde. Der Quellcode ist noch strukturierter und vorhersehbarer als die menschliche Sprache.


2
Das einzige Problem, das ich sehe, ist, dass die Wahrscheinlichkeiten erheblich geringer sind als in Ihrem Spielzeugbeispiel. Bei einer gegebenen numerischen Instabilität bedeutet dies, dass bald alle Wahrscheinlichkeiten 0 sind. Die Verwendung von log odds löst dies jedoch. Außerdem würde ich größere Token verwenden (dh keine Zeichen, sondern Wörter / Interpunktion).
Konrad Rudolph

2
@Konrad: Hier geht es nicht darum, absolute Wahrscheinlichkeiten zu testen, sondern um relative Wahrscheinlichkeiten. Ist es wahrscheinlicher, dass der Text dieser Zeile für jede Zeile von einem englischen Sprachmodell oder von einem Codesprachenmodell generiert wurde?
Ken Bloom

5
Sie können dieses Modell auf vorhandenen SO-Posts trainieren (insbesondere, weil Sie möglicherweise die Markdown-Syntax berücksichtigen müssen). Wenn Sie davon ausgehen, dass die meisten Posts korrekt formatiert sind (oder Sie eine große Anzahl von Posts in der Größenordnung von Zehntausenden durchsuchen, um nicht korrekt formatierte Posts zu entfernen), gehen Sie davon aus, dass es sich bei den nicht codierten Inhalten um englischen Text handelt Wenn Code formatiert ist, können Sie anhand der tatsächlichen SO-Antworten trainieren.
Ken Bloom

1
Ein Tutorial dazu (mit LingPipe in Java) finden Sie auf der LingPipe-Website . Am Ende des Tutorials finden Sie eine Reihe von Artikeln zu Techniken, mit denen dieses Problem gelöst werden kann. Ich schlage vor, sie zu lesen.
Ken Bloom

1
Es ist interessant zu sehen, dass die Lösung auf dem neuesten Stand der Technik nur eine sehr geringe Stimmenzahl aufweist und bei weitem nicht so gut ist wie alle Ad-hoc-Lösungen, die zwar nur gut genug sind, sich jedoch stark auf Spezialgehäuse stützen und von Natur aus von Natur aus sind anfällig für Überanpassung.
Konrad Rudolph

13

Darf ich einen radikal anderen Ansatz vorschlagen? In SO ist nur Englisch als Sprache für den Menschen zulässig, und alles, was nicht Englisch ist, hat eine Wahrscheinlichkeit von 99,9%, dass es sich um ein Code-Snippet handelt .

Meine Lösung wäre also: Verwenden Sie einen der vielen englischen Sprachprüfer (stellen Sie nur sicher, dass sie - neben Rechtschreibfehlern - auch Syntaxfehler wie Doppelpunkte oder nicht-sprachliche Symbole wie #oder anzeigen ~). Dann sollte jede Zeile / jeder Absatz, der eine große Menge an Fehlern und Warnungen ausgibt, den "Ist das dieser Code?" Frage.

Dieser Ansatz kann natürlich auch für diese StackExchange-Sites angepasst werden, die andere Sprachen als Englisch verwenden.

Nur meine 2 ¢ ...


16
Das Problem ist, dass viele der eingehenden Fragen auch nicht englisch sind (obwohl sie ähnlich sind).
Brendan Long

3
@Brendan - Zusätzlicher Vorteil dieses Vorschlags: Unterstreichen (oder markieren) Sie die Fehler in den wahrscheinlich beabsichtigten englischen Teilen des Beitrags und helfen Sie dem Verfasser dabei, ... auf Englisch zu schreiben! ;)
Mac

1
Ich bin Holländer und alles, was ich codiere, ist in englischer Sprache, nach Kommentaren nicht (je nach Projekt). Also muss nicht englisch sein Code würde nicht ausreichen. Das oder du meinst, dass gebrochenes Englisch Code sein muss.
Ivo Limmen

@Ivo - Mein Kommentar wurde scherzhaft an die kaputte englische Ausgabe gerichtet! ;) Allerdings würde ich sagen, dass mit meinem Vorschlag Kommentare in einer anderen Sprache gut funktionieren würden ... OTOH-Blockkommentare in Englisch lösen nicht das " Ist dieser Code?" Frage, aber das ist in Ordnung, weil der Code, für den der Kommentar geschrieben wurde, ihn bereits ausgelöst hätte ...
Mac

11

Ich werde wahrscheinlich ein paar Abwärtsstimmen dafür bekommen, aber ich denke, Sie nähern sich dem aus dem falschen Blickwinkel.

Diese Zeile hat mich:

Leute müssen hineingehen und Code für Leute, die dies irgendwie nicht herausfinden können, manuell formatieren

IMO dieser Standpunkt ist ein bisschen arrogant. Ich finde das sehr im Software-Design, wo Programmierer und Designer sich über Benutzer ärgern, die nicht herausfinden können, wie man die Software richtig verwendet, wenn das Problem nicht der Benutzer, sondern die Software selbst ist - oder zumindest die Benutzeroberfläche.

Die Hauptursache für dieses Problem ist nicht der Benutzer, sondern die Tatsache, dass es für ihn nicht offensichtlich ist, dass er dies kann.

Wie wäre es mit einer Änderung der Benutzeroberfläche, um dies deutlicher zu machen? Dies wird sicherlich sein:

  1. Für neue Benutzer ist klarer ersichtlich, was sie genau tun müssen
  2. Es ist einfacher für Sie, komplexe Algorithmen zu erstellen, als sie zu schreiben, um die Codelogik einer Vielzahl von Sprachen zu erkennen

Beispiel:

Bildbeschreibung hier eingeben


26
Tatsächlich erzwingt diese IMO schlechte Fragen wie "Ich habe ein Problem, bitte helfen Sie mir, der Code ist unten" - ziemlich selten muss Code von der Frage getrennt werden. Die besten Fragen lauten wie folgt: "Ich möchte dies erreichen und habe diese beiden Codezeilen geschrieben, aber der Effekt ist der folgende: Was ist das Problem?" - Es gibt nur sehr wenig Code, der stark mit Klartext verschachtelt ist.
Sharptooth

4
Ihre Wurzel Beobachtung ist richtig , aber Ihre Diagnose ist immer noch falsch: In der Tat, Jeff wird versucht , die Benutzeroberfläche über diesen Ansatz zu verbessern. Darüber hinaus hat die aktuelle Benutzeroberfläche bereits mehrere Zyklen durchlaufen, und obwohl ich nicht bezweifle, dass sie (drastisch) verbessert werden könnte, bezweifle ich, dass dies gegen faule Idioten helfen würde. Weder würde Ihre vorgeschlagene Lösung. @sharptooth hat dies abgedeckt.
Konrad Rudolph

2
Ich würde +1 für das Ausdenken der Box geben, aber ich bin mit dem konkreten Vorschlag nicht einverstanden, da das Posten von "unterstützendem Code" einen möglicherweise unnatürlichen Fragenfluss erzwingt. Ich habe noch nie einen Code eingegeben, der am Ende meiner Frage steht. Ich poste fast immer ein Intro, den Beispielcode, dann die eigentliche Frage. Wenn Sie die Voraussetzung akzeptieren, dass Inline-Code unabdingbar ist, ist eine Formatierung erforderlich - eine Formatierung, die vom Benutzer eingegeben oder vom System empfohlen werden muss. Und genau darum bittet Jeff.
Nicole

1
@Konrad: Zusätzlich zu meinem obigen Kommentar und als Antwort auf Ihren Kommentar glaube ich nicht, dass Jeff die Benutzeroberfläche verbessert, indem er diesen Weg einschlägt, sondern lediglich die Symptome eines zugrunde liegenden Problems behandelt. Wenn die Benutzeroberfläche so verbessert würde, dass der Fehler nicht gemacht werden kann, wäre die Lösung, den Benutzer zu warnen, nicht erforderlich. Ich mache mir keine Illusionen darüber, dass mein Beispiel die endgültige Lösung ist, aber einige Überlegungen müssen sich mit der Frage befassen, ob wir dies auf die bestmögliche Weise präsentieren.
matt_asbury

1
Der einfache Satz, bitte Code mit dem {}Knopf um das Textfeld markieren, könnte ausreichen.
Paŭlo Ebermann

11

Pseudocode wäre eine echte Herausforderung, da alle Programmiersprachen von Sonderzeichen wie '[]', ';', '()' usw. abhängen. Zählen Sie einfach das Vorkommen dieser Sonderzeichen. Genau wie Sie eine Binärdatei erkennen würden (mehr als 5% eines Samples enthalten den Bytewert 0).


Ich würde das genauso verbessern wie Gruppen mit diesen Sonderzeichen wie [] (); {} =. Jede Zeile, in der mehr als 2-3 dieser Gruppen enthalten sind, ist eine Codezeile.
Honza

... und suchen Sie auch nach allgemeinen Zeichenfolgen in den gebräuchlichsten Sprachen, z. B. "= someword ();" Für die meisten geschweiften Klammersprachen XML-ähnliche Syntax wie "<something>" und "<ab: cde>" sowie andere gebräuchliche Zeichenfolgen in anderen Sprachen. Ich glaube, eine Art Nachschlagetabelle mit allgemeiner Syntax wäre eine gute Lösung, da Sie sie erweitern können, wenn Sie neue zu implementierende Sprachen finden.
Arve Systad,

Sie sollten wahrscheinlich Pseudocode löschen. Einige Leute mögen es als C-Sprache zu schreiben, aber andere Leute werden normales Englisch mit etwas verwenden, das näher an VB6 aussieht
James P.

4

Ich denke, Sie müssen dies möglicherweise nur auf bestimmte Sprachen ausrichten . Im Allgemeinen ist dieses Problem wahrscheinlich nicht lösbar, da Sie Sprachen erhalten können, die dem Englischen ziemlich ähnlich sind (z . B. inform7 ). aber zum Glück konnten die am häufigsten verwendeten ziemlich leicht abgedeckt werden.

Mein erster Schritt wäre, nach der Sequenz "; \ n" zu suchen, die zu C, C ++, Java, C # und jeder anderen Sprache passt, die eine ähnliche Syntax verwendet und wirklich einfach ist. Es wird auch seltener auf Englisch verwendet als a; ohne newline


plus vielleicht eine Fülle von geschweiften Klammern; p
Marc Gravell

1
Wie Jeff in seinem Post sagt, würden sie wahrscheinlich nur die Hauptsprachen ansprechen. Und auf jeden Fall vermute ich, dass neue Benutzer (für die diese Funktionalität bestimmt ist) mit größerer Wahrscheinlichkeit C # oder Javascript posten als beispielsweise INTERCAL ;-)
Ben

Ja, aber das würde mit der Programmiersprache BRAINFUCK oder BLANK nicht funktionieren. ;-)
Ivo Limmen

4

Jemand erwähnte, dass er sich die Tags ansah und danach nach der Syntax dafür suchte, aber das wurde abgeschossen, weil es sich an neue Benutzer richtete.

Eine mögliche bessere Lösung wäre, im Hauptteil der Frage nach Sprachnamen zu suchen und dann dieselbe Strategie anzuwenden. Wenn ich "Javascript", "Java" oder "C #" erwähne, geht es wahrscheinlich darum, und der Code in der Frage ist wahrscheinlich in dieser Sprache.


Vor allem, wenn der Titel so etwas wie "vb c # .net dot net hilf mir, hilf mir !!!"
NickAldwin

1

Führen Sie zunächst die Rechtschreibprüfung durch. Es werden nur sehr wenige richtige englische Wörter gefunden. Es sollte jedoch eine Vielzahl von Wörtern geben, die die Rechtschreibprüfung aufteilt.

Dann gibt es Satzzeichen / Sonderzeichen, die nicht typisch für Klartext sind, typisch für Code:

  • something(); kann einfach nicht einfach Englisch sein;
  • $somethingwo somethingist nicht alles numerisch;
  • -> zwischen Wörtern ohne Leerzeichen;
  • . zwischen Wörtern ohne Leerzeichen;

Natürlich sollten Sie einen Bayesianischen Klassifikator auf diesen Merkmalen aufbauen, damit es gut funktioniert.


1
Erkennen einer nicht eingerückten Zeile mit (); wäre ein guter grund die nachricht vorzuschlagen.

Welche Rechtschreibprüfung verschluckt sich nicht, bevor der Code eingefügt wird?
Tim Post

Mit einigen Nachrichten, die von nicht-einheimischen englischen Schriftstellern verfasst wurden, wird die Rechtschreibprüfung jedes andere Wort
unterdrücken

@Ph: Diese Fragen / Antworten werden auf SO sowieso nicht akzeptiert.
Vartec

1

Es gibt mehrere Sprachensätze mit ähnlicher Syntax. Die meisten Sprachen wurden von einigen wenigen Sprachen beeinflusst, so dass die Sprachen [AMPL, AWK, csh, C ++, C--, C #, Objective-C, BitC, D, Go, Java, JavaScript, Pike, Processing [wurden alle von C beeinflusst. Wenn Sie also C erkennen, werden Sie wahrscheinlich alle diese Sprachen erkennen. Sie müssen also nur ein einfaches Muster schreiben, um diese Sprachgruppen zu erkennen.

Ich würde den Text auch in Blöcke aufteilen, da der meiste Code durch zwei Zeilenumbrüche oder ähnliches von den anderen Textblöcken im Beitrag getrennt wird.

Dies kann einfach mit Javascript geschehen (ein supersimple unvollständiges Beispiel für die c-Familie):

var txt = "my problem is I need to change the database but I don't won't to create a new connection. example:\n\nDataSet dsMasterInfo = new DataSet();Database db = DatabaseFactory.CreateDatabase(&quot;ConnectionString&quot;);DbCommand dbCommand = db.GetStoredProcCommand(&quot;uspGetMasterName&quot;);";
var blocks = txt.split(/\n\n/gi); console.dir(blocks);
var i = blocks.length;
var cReg = /if\s*\(.+?\)|.*(?:int|char|string|short|long).*?=.+|while\s*\(.+?\)/gi;

while ( i-- ){
   var current = blocks[i];
   if ( cReg.test( current ) ){
      console.log("found code in block[" +  i + "]");
   }
}

0

Zählen Sie einfach Wörter / Interpunktionszeichen für jede Zeile. Englisch hat in der Regel 4 oder mehr, Code weniger als 2.

Der obige Absatz enthält beispielsweise 18 Wörter und 4 Interpunktionszeichen. Dieser Absatz enthält 19 Wörter und 4 Interpunktionszeichen.

Natürlich müsste dies gegen Fragen von Neulingen mit schlechtem Englisch getestet werden, und es kann sein, dass in diesen Fällen die Statistiken verzerrt sind.

Ich gehe davon aus, dass [Nicht-Whitespace]. [Whitespace oder Newline] im Code sehr selten vorkommt, im Englischen jedoch häufig vorkommt.

Ich denke, das größte Problem wird Inline-Code sein, bei dem jemand eine Frage stellt wie:

Wenn ich für (i = 0; i> 100; i ++) {} sage, was bedeutet das?

Das ist Code und Englisch und sollte mit einem Back-Tick versehen werden:

Wenn ich sage, for (i=0; i>100; i++) {}was heißt das?


0

Ich denke, Sie sollten zuerst unterscheiden zwischen (ausreichend) formatiertem Code, der nur als solcher gekennzeichnet werden muss, und (zu) schlecht formatiertem Code, der ohnehin manuell formatiert werden muss.

Formatierter Code enthält Bruchkanten und Einrückungen. Das heißt: Wenn vor einer Zeile eine einzelne Trennlinie steht, haben Sie einen guten Kandidaten. Wenn es darüber hinaus führende Leerzeichen gibt, haben Sie einen sehr guten Kandidaten.

Normaler Text verwendet zwei Bruchkanten oder zwei Leerzeichen und eine Bruchkante für die Formatierung, daher gibt es ein klares Unterscheidungskriterium.

Im LISP-Code finden Sie keine Semikolons, im Ruby-Code finden Sie möglicherweise keine Klammern, im Pseudocode finden Sie möglicherweise überhaupt nicht viel. Aber in jeder (nicht esoterischen) Sprache finden Sie anständigen Code, der mit Bruchzeilen und Einrückungen formatiert werden kann. Es gibt nichts so universelles wie das. Denn am Ende steht der Code, geschrieben, um von Menschen gelesen zu werden.

So zuerst, die Suche nach potentiellen Linien des Codes . Außerdem werden Codezeilen normalerweise in Gruppen zusammengefasst. Wenn Sie eine haben, besteht eine gute Chance, dass die darüber oder darunter liegende Zeile ebenfalls eine Codezeile ist.

Sobald Sie potenzielle Codezeilen herausgegriffen haben, können Sie sie anhand quantifizierbarer Kriterien überprüfen und einen Schwellenwert auswählen :

  • Häufigkeit von Nicht-Wort-Zeichen
  • Häufigkeit von Bezeichnern: sehr kurze Wörter oder sehr lange Wörter mit CamelCase- oder under_score-Stil
  • Wiederholung ungewöhnlicher Wörter

Da es jetzt auch Programmierer und cs gibt, wird der Umfang von stackoverflow deutlich eingegrenzt. Man könnte in Betracht ziehen, alle Sprach-Tags als Sprachen zu bezeichnen. Und beim Posten werden Sie aufgefordert, entweder mindestens ein Sprach-Tag auszuwählen, das language-agnosticTag auszuwählen oder es explizit wegzulassen.

Im ersten Fall wissen Sie, nach welchen Sprachen Sie suchen müssen, im zweiten Fall möchten Sie möglicherweise nach Pseudocode suchen, und im letzten Fall wird es wahrscheinlich keinen Code geben, da es sich um eine Frage handelt, die mit irgendeiner Technologie oder zusammenhängt Rahmen oder so.


0

Sie könnten einen Parser für jede Sprache erstellen, die Sie erkennen möchten (Sprachdefinitionen für ANTLR sind normalerweise leicht zu finden), und dann jede Zeile der Frage durch jeden Parser führen. Wenn eine Zeile korrekt analysiert wird, haben Sie wahrscheinlich Code.

Das Problem dabei ist, dass einige englische Sätze (Sätze in natürlicher Sprache) möglicherweise als Code analysiert werden. Daher möchten Sie möglicherweise auch einige andere Ideen einbeziehen, oder Sie können die positiven Ergebnisse nur einschränken, wenn mehr als eine oder zwei aufeinanderfolgende Zeilen korrekt analysiert werden der gleiche Sprachparser.

Das andere mögliche Problem ist, dass dies wahrscheinlich keinen Pseudocode aufnimmt, aber das kann in Ordnung sein.


Oft haben Leute Syntaxfehler in ihrem Code (und fragen danach).
Paŭlo Ebermann

0

Was möglicherweise am zukunftssichersten ist und auf lange Sicht die geringste manuelle Anpassung erfordert, da andere Sprachen (die etwas anders aussehen als die derzeit am häufigsten verwendeten Programmiersprachen) populärer werden und die derzeit verwendeten Sprachen weniger populär sind, ist zu tun So etwas wie das, was Google Translate macht (siehe Abschnitt "Wie funktioniert es?"), anstatt nach bestimmten Dingen wie ab und a () usw. zu suchen.

Mit anderen Worten, anstatt manuell an Muster zu denken, die im zu suchenden Code gefunden wurden, kann der Computer dies selbst herausfinden . Dies kann getan werden, indem man

  1. viel Code in vielen verschiedenen Programmiersprachen

    • Vorschlag: Nehmen Sie automatisch Codebeispiele aus webbasierten Quellcode-Repositorys wie Google Code oder Github oder sogar aus Dingen auf Stackoverflow, die bereits als Code markiert sind

    • Hinweis: Es kann eine gute Idee sein, Codekommentare auszublenden

  2. Viele englische Texte aus Artikeln im Web

    • wenn auch nicht aus Artikeln über Programmierung (ansonsten könnten sie Code enthalten und das System durcheinander bringen :-))

Ein Algorithmus findet automatisch Muster im Code, die nicht in Englisch sind, und umgekehrt. Mithilfe dieser Muster können Sie erkennen, was Code ist und was nicht, indem Sie den Algorithmus für Posts ausführen.

(Ich bin mir jedoch nicht sicher, wie ein solcher Algorithmus funktionieren würde. Andere Antworten auf die aktuelle Frage enthalten möglicherweise nützliche Informationen dazu.)

Dann kann das System den Code von Zeit zu Zeit erneut scannen, um Änderungen in der Art und Weise zu berücksichtigen, in der der Code zu diesem Zeitpunkt angezeigt wird.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.