Justadistraction: токенизация английского без пробелов.Мураками Овчарка - PullRequest
6 голосов
/ 04 октября 2010

Мне было интересно, как вы пойдете по поводу токенизации строк на английском (или других западных языках), если пробелы будут удалены?

Источником вдохновения для этого вопроса является персонаж овчарки из романа Мураками ' Dance Dance Dance '

В романе «Овчарка» переводится как: «1009»

"Точно так же мы скажем, что мы можем. Попробуйте связаться с вами, к вам", - сказал Овчарка. «Но мы не можем делать это в одиночку. Ты тоже работаешь».

Итак, некоторые знаки препинания сохранены, но не все. Достаточно для человека, чтобы прочитать, но несколько произвольно.

Какова будет ваша стратегия создания парсера для этого? Распространенные комбинации букв, числа слогов, условные грамматики, упреждающие / задние регулярные выражения и т. Д .?

В частности, с точки зрения Python, как бы вы структурировали (прощающий) поток перевода? Не спрашивая законченного ответа, просто больше о том, как ваш мыслительный процесс поможет решить проблему.

Я спрашиваю это легкомысленно, но я думаю, что этот вопрос может получить некоторые интересные (nlp / crypto /quency / social) ответы. Спасибо!

Ответы [ 4 ]

3 голосов
/ 04 октября 2010

Я действительно сделал что-то подобное для работы около восьми месяцев назад.Я просто использовал словарь английских слов в хеш-таблице (для O (1) поиска раз).Я бы пошел по буквам, соответствующих целым словам.Это работает хорошо, но есть много неясностей.(задница может быть задницей или как дерьмо).Для устранения этих неясностей потребуется гораздо более сложный грамматический анализ.

2 голосов
/ 04 октября 2010

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

Однаждыу вас есть слова, у вас есть два возможных подхода:

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

С другой стороны, вы могли бы просто взять большой корпусТекст на английском языке и вычислить относительные вероятности того, что определенные слова находятся рядом друг с другом - получить список пар и тройки слов.Поскольку эта структура данных будет довольно большой, вы можете использовать категории слов (грамматические и / или основанные на значении), чтобы упростить ее.Затем вы просто строите автомат и выбираете наиболее вероятные переходы между словами.

Я уверен, что есть еще много возможных подходов.Вы даже можете объединить два упомянутых мною слова, создав некоторую грамматику с весом, привязанным к ее правилам.Это богатое поле для экспериментов.

1 голос
/ 04 октября 2010

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

 textstring = "likewesaid, we'lldowhatwecan. Trytoreconnectyou, towhatyouwant," said the Sheep Man. "Butwecan'tdoit-alone. Yougottaworktoo."

indiv_characters = list(textstring) #splits string into individual characters

teststring = ''
sequential_indiv_word_list = []

for cur_char in indiv_characters:
    teststring = teststring + cur_char
    # do some action here to test the testsring against an English dictionary where you can API into it to get True / False if it exists as an entry
    if in_english_dict == True:
        sequential_indiv_word_list.append(teststring)
        teststring = ''

#at the end just assemble a sentence from the pieces of sequential_indiv_word_list by putting a space between each word

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

Также необходимо учитывать пунктуацию, писать условные выражения, например

if cur_char == ',' or cur_char =='.':
   #do action to start new "word" automatically
1 голос
/ 04 октября 2010

Не знаю, поможет ли это вам, но вы можете каким-то образом использовать этот корректор орфографии .

...