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
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
Interessante Frage. Ich denke, die Antwort ("einfacher Weg") wird "nein" sein. –
Ä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 –