Сделано изменение, так что text2int (scale) вернет правильное преобразование. Например, text2int ("сто") => 100.
import re
numwords = {}
def text2int(textnum):
if not numwords:
units = [ "zero", "one", "two", "three", "four", "five", "six",
"seven", "eight", "nine", "ten", "eleven", "twelve",
"thirteen", "fourteen", "fifteen", "sixteen", "seventeen",
"eighteen", "nineteen"]
tens = ["", "", "twenty", "thirty", "forty", "fifty", "sixty",
"seventy", "eighty", "ninety"]
scales = ["hundred", "thousand", "million", "billion", "trillion",
'quadrillion', 'quintillion', 'sexillion', 'septillion',
'octillion', 'nonillion', 'decillion' ]
numwords["and"] = (1, 0)
for idx, word in enumerate(units): numwords[word] = (1, idx)
for idx, word in enumerate(tens): numwords[word] = (1, idx * 10)
for idx, word in enumerate(scales): numwords[word] = (10 ** (idx * 3 or 2), 0)
ordinal_words = {'first':1, 'second':2, 'third':3, 'fifth':5,
'eighth':8, 'ninth':9, 'twelfth':12}
ordinal_endings = [('ieth', 'y'), ('th', '')]
current = result = 0
tokens = re.split(r"[\s-]+", textnum)
for word in tokens:
if word in ordinal_words:
scale, increment = (1, ordinal_words[word])
else:
for ending, replacement in ordinal_endings:
if word.endswith(ending):
word = "%s%s" % (word[:-len(ending)], replacement)
if word not in numwords:
raise Exception("Illegal word: " + word)
scale, increment = numwords[word]
if scale > 1:
current = max(1, current)
current = current * scale + increment
if scale > 100:
result += current
current = 0
return result + current
Базовая проблема здесь - то, что алгоритмы стемминга работают <ударяют> на фонетической основе забастовку> просто на основе правил написания языка без фактического понимания языка, с которым они работают. Для создания реальных слов необходимо будет, вероятно, объединить вывод стеммера с некоторой формой функции поиска для преобразования основ назад в реальные слова. Я могу в основном видеть два потенциальных способа сделать это:
Лично, я думаю способ, которым я сделал бы это, будет динамическая форма № 1, создавая пользовательскую базу данных словаря путем записи каждого слова, исследованного наряду с тем, что это остановило к и затем предположив, что наиболее распространенное слово является тем, которое должно использоваться. (например, Если мое тело исходного текста использует "сообщества" чаще, чем "сообщество", то отобразите сообщество-> сообщества.) Основанный на словаре подход будет более точным в целом, и создание его на основе входа стеммера предоставит результаты, настроенные Вашим текстам с основным недостатком, являющимся требуемым пространством, который является обычно не проблемой в эти дни.
Если я понимаю правильно, то то, в чем Вы нуждаетесь, не является стеммером, а лемматизатором. Лемматизатор является инструментом со знанием об окончаниях как -ies, - редактор , и т.д., и исключительные формы слова как записанный , и т.д. Лемматизатор отображает входную форму слова на свою лемму, которая, как гарантируют, будет "реальным" словом.
существует много лемматизаторов для английского языка, я только использовал morpha
все же. Morpha является просто большим файлом закона, который можно скомпилировать в исполняемый файл. Пример использования:
$ cat test.txt
Community
Communities
$ cat test.txt | ./morpha -uc
Community
Community
можно получить morpha от http://www.informatics.sussex.ac.uk/research/groups/nlp/carroll/morph.html