2014-02-11 4 views
5

Ich habe ein Korpus von Text, der einige Zeichenfolgen enthält. In diesen Strings sind einige englische Wörter, einige sind zufällig wie VmsVKmGMY6eQE4eMI, es gibt keine Begrenzung für die Anzahl der Zeichen in jeder Zeichenfolge.Wie wird eine Zeichenfolge zufällig oder plausibel ein englisches Wort generiert?

Gibt es eine Möglichkeit zu testen, ob eine Zeichenfolge ein englisches Wort ist oder nicht? Ich suche nach einer Art von Algorithmus, der diese Aufgabe erfüllt. Dies ist in Java, und ich möchte lieber kein zusätzliches Wörterbuch implementieren.

+1

Sie müssen nicht wirklich ein Wörterbuch implementieren, Sie müssen nur eines verwenden. –

+0

Erwarten Sie auch, Dinge wie die Goldmediallisten in 'foo1oksana0grishuk3evgeny1platov1' zu finden? –

+0

Ich bin nur eine Methode, um eine Zeichenfolge zu bestimmen, ist Englisch Wort – ikel

Antwort

2

Wenn Sie eine Art Regel des Daumens meinen, die das englische Wort vom zufälligen Text unterscheidet, gibt es keines. Für eine angemessene Genauigkeit müssen Sie eine externe Quelle abfragen, sei es das Web, das Wörterbuch oder ein Service.

Wenn Sie nur auf eine Existenz des Wortes überprüfen müssen, würde ich vorschlagen Wordnet. Es ist ziemlich einfach zu bedienen und es gibt eine nette Java-API namens JWNL, die das Abfragen des Wordnet-Wörterbuchs zu einem Kinderspiel macht.

+0

wordnet wurde seit Jahren nicht aktualisiert, nicht sicher, wie gut es funktioniert – ikel

0

Sie können dies nicht tun, ohne eine Art Wörterbuch zu verwenden.

1) Eine Sache, die mir in den Sinn kommt, ist eine Google-Suche programmgesteuert für dieses Wort auszuführen. Wenn es ein englisches Wort ist, erhalten Sie eine gute Anzahl von Seiten. Wenn es eine zufällige Zeichenfolge ist, werden Sie nicht so viele Seiten bekommen. Aber trotzdem verwenden Sie Google als Wörterbuch. Sie müssen einige Heuristiken verwenden und einen Schwellenwert für die Anzahl der zurückgegebenen Seiten angeben.

2) Ein weiterer möglicher Ansatz ist es, einen englischen Wörterbuch-Webdienst zu finden (entweder kostenlos oder kostenpflichtig), den Sie von Ihrem Programm aus aufrufen. Dann behalten Sie kein Wörterbuch in Ihrem Programm, Sie rufen nur diesen externen Webservice an. Überprüfen Sie dieses. Dictionary webservice recommendation

0

Leider können Sie keine Grammatik implementieren, die gültige englische Wörter ohne ein Wörterbuch identifiziert. Die englische Sprache kann einfach nicht so modelliert werden.

Wenn Sie dies erreichen möchten, können Sie eine Datenbank mit gültigen englischen Wörtern erstellen und diese einfach abfragen, um die Gültigkeit zu überprüfen. Um den Prozess zu beschleunigen, können Sie reguläre Ausdrücke verwenden, um Wörter zu auszusondern, die:

  1. enthalten Zahlen und Buchstaben
  2. enthalten mehr als einen Großbuchstaben

Ich bin sicher, es gibt auch bestehende API Sie könnte verwenden, um dies selbst zu implementieren. Aber im Allgemeinen ist das der Prozess.

0

Ich würde vorschlagen, ein Plugin wie Jazzy http://jazzy.sourceforge.net/demo.html zu verwenden. Es ist eine Rechtschreibprüfung, aber es kann feststellen, ob sich zufällige Zeichenfolgen im Wörterbuch befinden oder nicht. Leider ist das Wörterbuch um mehrere Jahre veraltet, so dass Sie es manuell hinzufügen müssen.

2

Wenn Sie Dinge unterscheiden wollen, die wortähnlich sind, aber möglicherweise nicht populär genug sind, um in einem Wörterbuch aus Kauderwelsch/zufälligem Text zu sein, ist es nicht wirklich so schwer. Sie sollten meine Antwort auf diese Frage sehen. Is there any way to detect strings like putjbtghguhjjjanika?. Es enthält eine Implementierung Python und PHP.

0

Ich musste ein nah verwandtes Problem für ein Quellcode-Mining-Projekt lösen, und obwohl das Paket in Python und nicht Java geschrieben ist, schien es hier erwähnenswert, falls es irgendwie nützlich sein könnte.Das Paket ist Nostril (für "Nonsense String Evaluator") und es soll ermittelt werden, ob im Quellcode-Mining extrahierte Strings wahrscheinlich Klasse/Funktion/Variable/etc. Identifikatoren oder zufälliges Kauderwelsch. Nostril verwendet kein Wörterbuch, aber es enthält eine ziemlich große Tabelle von N-Gramm-Häufigkeiten, um seine probabilistische Bewertung von Textzeichenfolgen zu unterstützen.

Beispiel: Der folgende Code,

from nostril import nonsense 
real_test = ['bunchofwords', 'getint', 'xywinlist', 'ioFlXFndrInfo', 
      'DMEcalPreshowerDigis', 'httpredaksikatakamiwordpresscom'] 
junk_test = ['faiwtlwexu', 'asfgtqwafazfyiur', 'zxcvbnmlkjhgfdsaqwerty'] 
for s in real_test + junk_test: 
    print('{}: {}'.format(s, 'nonsense' if nonsense(s) else 'real')) 

die folgende Ausgabe erzeugen:

bunchofwords: real 
getint: real 
xywinlist: real 
ioFlXFndrInfo: real 
DMEcalPreshowerDigis: real 
httpredaksikatakamiwordpresscom: real 
faiwtlwexu: nonsense 
asfgtqwafazfyiur: nonsense 
zxcvbnmlkjhgfdsaqwerty: nonsense 

Das Projekt auf GitHub ist und ich Beiträge willkommen. Wenn Sie wirklich eine Java-Implementierung benötigen, können wir vielleicht Nostril mit Python 2.7 kompatibel machen und Sie können versuchen, Jython zu verwenden, um es von Java auszuführen.