2013-03-12 5 views
10

Ich habe einen Text:Gibt es eine einfache Möglichkeit, eine wahrscheinliche Liste von Wörtern aus einem Satz ohne Leerzeichen in Python zu generieren?

s="Imageclassificationmethodscan beroughlydividedinto two broad families of approaches:" 

Ich möchte diese in seine einzelnen Wörter analysieren. Ich schaute schnell in den Zauber und Nltk, aber sah nichts, was sofort nützlich schien. Wenn ich Zeit hätte, in diese Sache zu investieren, würde ich mir ein dynamisches Programm mit der Fähigkeit von enchant überlegen, ob ein Wort englisch ist oder nicht. Ich hätte gedacht, dass es etwas online zu tun gibt, irre ich mich?

+0

Sie könnten Ihr Wörterbuch von Wörtern als Trie codieren und einen Greedy-Algorithmus verwenden: Ziehen Sie das längste Wort, das übereinstimmt, und gehen Sie dann zum nächsten Wort über, bei Fehlern zurück. Wahrscheinlich nicht optimal. Versuchen Sie dies für Empfehlungen zu Datenstrukturen: http://kmike.ru/python-data-structures/ – hughdbrown

+0

Interessante Frage. Ich denke, die Antwort ("einfacher Weg") wird "nein" sein. –

+0

Ähnliche Frage, die zuvor gestellt wurde, hatte nicht viel Glück: http://stackoverflow.com/questions/13034330/how-to-separate-an-engilsh-language-string-without-spaces-to-form-some-meaningfu –

Antwort

9

Greedy-Ansatz trie

Versuchen Sie dies mit Biopython (pip install biopython):

from Bio import trie 
import string 


def get_trie(dictfile='/usr/share/dict/american-english'): 
    tr = trie.trie() 
    with open(dictfile) as f: 
     for line in f: 
      word = line.rstrip() 
      try: 
       word = word.encode(encoding='ascii', errors='ignore') 
       tr[word] = len(word) 
       assert tr.has_key(word), "Missing %s" % word 
      except UnicodeDecodeError: 
       pass 
    return tr 


def get_trie_word(tr, s): 
    for end in reversed(range(len(s))): 
     word = s[:end + 1] 
     if tr.has_key(word): 
      return word, s[end + 1: ] 
    return None, s 

def main(s): 
    tr = get_trie() 
    while s: 
     word, s = get_trie_word(tr, s) 
     print word 

if __name__ == '__main__': 
    s = "Imageclassificationmethodscan beroughlydividedinto two broad families of approaches:" 
    s = s.strip(string.punctuation) 
    s = s.replace(" ", '') 
    s = s.lower() 
    main(s) 

Ergebnisse

>>> if __name__ == '__main__': 
...  s = "Imageclassificationmethodscan beroughlydividedinto two broad families of approaches:" 
...  s = s.strip(string.punctuation) 
...  s = s.replace(" ", '') 
...  s = s.lower() 
...  main(s) 
... 
image 
classification 
methods 
can 
be 
roughly 
divided 
into 
two 
broad 
families 
of 
approaches 

Caveats

Es gibt degenerierte Fälle auf Englisch, dass dies nicht arbeiten für. Sie müssen Backtracking verwenden, um mit diesen umzugehen, aber das sollte Ihnen den Einstieg erleichtern.

obligatorischer Test

>>> main("expertsexchange") 
experts 
exchange 
+0

Wunderbar. Das ist genau das, was ich wollte! – Erotemic

1

Dies ist eine Art von Problem, das häufig in asiatischer NLP auftritt. Wenn Sie ein Wörterbuch haben, dann können Sie dieses verwenden http://code.google.com/p/mini-segmenter/ (Disclaimer: ich schrieb es, ich hoffe, es macht Ihnen nichts aus).

Beachten Sie, dass der Suchraum sehr groß sein kann, da die Anzahl der Buchstaben in alphabetischer Sprache sicherlich länger ist als in der Silbenschrift Chinesisch/Japanisch.

Verwandte Themen