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.
Da GMail die Zeichenfolge see the attached
in 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.
Antworten:
Eine richtige Lösung wäre wahrscheinlich ein gelerntes / statistisches Modell, aber hier sind einige lustige Ideen:
myFunc()
foo.bar = ptr->val
while (true) { bar[i]; }
/* multi-line comment */
+, *, &, &&, |, ||, <, >, ==, !=, >=, <=, >>, <<, ::, __
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.
quelle
SELECT DISTINCT name FROM people WHERE id IS NOT NULL
.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.
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
wc
des Textteils und des Codeteils dieser beiden Beispiele hatte ich Folgendes:Schauen wir uns zuerst den englischen Teil an :
Ziemlich ähnlich findest du nicht
Schauen wir uns nun den Codeteil an !
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?
quelle
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:
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:
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:
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.
quelle
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 ¢ ...
quelle
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:
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:
Beispiel:
quelle
{}
Knopf um das Textfeld markieren, könnte ausreichen.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).
quelle
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
quelle
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.
quelle
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;$something
wosomething
ist 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.
quelle
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):
quelle
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:
Das ist Code und Englisch und sollte mit einem Back-Tick versehen werden:
quelle
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 :
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-agnostic
Tag 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.
quelle
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.
quelle
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
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
Viele englische Texte aus Artikeln im Web
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.
quelle