Есть ли простой способ генерировать вероятный список слов из несложенного предложения в python?

У меня есть текст:

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

Я хотел бы разобрать это на отдельные слова. Я быстро заглянул в чары и nltk, но не увидел ничего, что выглядело бы сразу же полезным. Если бы у меня было время инвестировать в это, я бы задумал написать динамическую программу с возможностью зачарования, чтобы проверить, было ли слово английским или нет. Я бы подумал, что будет что-то делать онлайн, я не прав?

Ответ 1

Жадный подход с использованием trie

Попробуйте использовать 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)

Результаты

>>> 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

Предостережения

На английском языке есть дегенеративные случаи, для которых это не сработает. Вам нужно использовать backtracking, чтобы справиться с ними, но это должно заставить вас начать.

Обязательный тест

>>> main("expertsexchange")
experts
exchange

Ответ 2

Это своего рода проблема, которая часто встречается в азиатских НЛП. Если у вас есть словарь, вы можете использовать этот http://code.google.com/p/mini-segmenter/ (Отказ от ответственности: я написал его, надеюсь, что вы не против).

Обратите внимание, что пространство поиска может быть чрезвычайно большим, потому что количество символов в алфавитном английском языке, несомненно, длиннее слоговой китайской/японской.