2010-02-01 12 views
12

Gibt es eine gute Bibliothek kann Wörter aus einer kombinierten Zeichenfolge erkennen und aufteilen?Erkennen am wahrscheinlichsten Wörter aus Text ohne Leerzeichen/kombinierte Wörter

Beispiel:

"cdimage" -> ["cd", "image"] 
"filesaveas" -> ["file", "save", "as"] 
+1

Ich habe keine Erfahrung in diesem Bereich, aber vielleicht möchten Sie mit einem Blick auf das Natural Language Toolkit beginnen. http://www.nltk.org/ –

+3

Und FileSaveAs konnte * Dateien ave als * nicht nur * Datei Speichern unter * aufgeteilt werden hart Es wäre nur auf Wort Möglichkeiten zu teilen, wenn Sie einen Fachwortschatz haben. .. – Sparky

+4

Und ["c", "dim", "Alter"], ["cd", "ich", "Magier"], etc ... es ist nicht einfach, das richtig zu verstehen, ohne den Kontext zu kennen. Es wird noch schwieriger, die richtige Option auszuwählen, wenn es viele domänenspezifische Begriffe und Abkürzungen gibt, die im normalen Text selten sind, aber in den typischen erwarteten Eingaben üblich sind. Sie müssten wahrscheinlich den Algorithmus trainieren. –

Antwort

11

Hier ist eine dynamische Programmierlösung (implementiert als memoized-Funktion) zu lösen.Wenn ein Wörterverzeichnis mit ihren Häufigkeiten gegeben wird, teilt es den Eingabetext an den Positionen auf, die die wahrscheinlichste Phrase ergeben. Sie müssen eine echte Wortliste finden, aber ich habe einige erfundene Frequenzen für einen einfachen Test aufgenommen.

WORD_FREQUENCIES = { 
    'file': 0.00123, 
    'files': 0.00124, 
    'save': 0.002, 
    'ave': 0.00001, 
    'as': 0.00555 
} 

def split_text(text, word_frequencies, cache): 
    if text in cache: 
     return cache[text] 
    if not text: 
     return 1, [] 
    best_freq, best_split = 0, [] 
    for i in xrange(1, len(text) + 1): 
     word, remainder = text[:i], text[i:] 
     freq = word_frequencies.get(word, None) 
     if freq: 
      remainder_freq, remainder = split_text(
        remainder, word_frequencies, cache) 
      freq *= remainder_freq 
      if freq > best_freq: 
       best_freq = freq 
       best_split = [word] + remainder 
    cache[text] = (best_freq, best_split) 
    return cache[text] 

print split_text('filesaveas', WORD_FREQUENCIES, {}) 

--> (1.3653e-08, ['file', 'save', 'as']) 
7

Ich weiß nicht, von jeder Bibliothek für sie, aber es sollte nicht schwer sein, grundlegende Funktionalität zu implementieren.

  1. Holen Sie sich eine Wörterliste, wie UNIX words.
  2. Füllen Sie den Inhalt Ihrer Wortliste in einen Trie.
  3. Nehmen Sie die Zeichenfolge, die Sie teilen möchten, und folgen Sie deren Pfad im Trie. Jedes Mal, wenn Sie ein gültiges Wort erreichen, erstellen Sie einen neuen Zweig, der nach einem Wort sucht, beginnend mit dem Punkt der Zeichenfolge, die Sie erhalten haben. Sobald Sie Ihre aktuelle Zweigstelle beendet haben, gehen Sie zu der von Ihnen erstellten zurück, wie in einer Tiefensuche.
  4. Die resultierenden Listen manuell unter Verwendung von Heuristiken oder über einen Parser für natürliche Sprache disambiguieren.

Beispiel:

  1. Wort: "filesaveasstring"
  2. Erstes gültiges Wort ist "file". Versuchen Sie es mit "saveas". Das erste gültige Wort ist "speichern". Versuchen Sie es mit "Asstring". Das erste gültige Wort ist "as". Versuchen Sie es mit "String". Das erste gültige Wort ist "String". Matched bis zum Ende; Setzen Sie die [Datei speichern als Zeichenfolge] in Ihre Ergebnisliste.
  3. Zurück zum passenden "String" - keine anderen Möglichkeiten. Zurück zu "Asstring". Das erste nicht besuchte gültige Wort ist "Arsch". Versuchen Sie es mit "tring". Keine möglichen Übereinstimmungen Zurück zu "Asstring". Keine möglichen Übereinstimmungen Zurück zu "filesaveasstring".
  4. Die erste nicht besuchte Übereinstimmung ist "Dateien". Versuchen Sie, "aveasstring" zu finden. Das erste Spiel ist "Ave". Versuchen Sie, "asstring" (gleiche Ergebnisse wie Schritt 2/3) zu finden, fügen Sie [files ave as string] zu Ihrer Ergebnisliste hinzu und gehen Sie zum Anfang zurück.
  5. Versuchen Sie, "filesaveasstring" zu entsprechen. Keine unbesuchten Spiele. Erledigt.
  6. Wählen Sie die wahrscheinlichste aus [[Datei als Zeichenfolge speichern] [Dateien als Zeichenfolge]] mit einer Heuristik oder einem Parser für natürliche Sprache.
+0

Was ist die Laufzeit davon? Ich bin irgendwie nicht in der Lage, dieses Problem zu verallgemeinern, um seine genaue Big-O-Komplexität zu finden. –

2

Ich weiß nicht, eine Bibliothek, die dies tut, aber es ist nicht allzu schwer zu schreiben, wenn Sie eine Liste von Wörtern haben:

wordList = file('words.txt','r').read().split() 
words = set(s.lower() for s in wordList) 

def splitString(s): 
    found = [] 

    def rec(stringLeft, wordsSoFar): 
     if not stringLeft: 
      found.append(wordsSoFar) 
     for pos in xrange(1, len(stringLeft)+1): 
      if stringLeft[:pos] in words: 
       rec(stringLeft[pos:], wordsSoFar + [stringLeft[:pos]]) 

    rec(s.lower(), []) 
    return found 

Dadurch werden alle Möglichkeiten geben die Zeichenfolge in aufzuspalten die gegebenen Wörter.

Beispiel:

>>> splitString('filesaveas') 
[['file', 'save', 'as'], ['files', 'ave', 'as']] 
-1

, wenn Sie tun dies nicht zum Spaß, sondern ist tatsächlich etwas für die Arbeit tun, etc, ist mein Rat ist dies an der Quelle zu bekämpfen. Warum haben Sie diese Saiten so kombiniert? Wo hast du diese Saiten? Wenn es möglich ist, fügen Sie Leerzeichen an der Quelle ein, woher diese Zeichenfolgen stammen.

+1

Entschuldigung, aber das ist eine Antwort für jedes Problem. (F: "Wie male ich das Haus in Weiß?" -> A: "füge weißem Kalzium hinzu und komme 1 Million Jahre später und grabe weiße Ziegel an erster Stelle") –

3

Erhalten Sie Leute sie als Captcha auf Ihrer Webseite :)

-1

Ich weiß, dass diese Frage für Python markiert ist, aber ich brauchte eine JavaScript-Implementierung. Ich ging von den vorherigen Antworten weg und dachte, ich würde meinen Code teilen. Scheint anständig zu funktionieren.

Hinweis: "_dictionary" wird erwartet, eine Reihe von Wörtern sortiert nach Häufigkeit zu sein. Ich verwende eine Wortliste von Project Gutenberg.

Verwandte Themen