Алгоритм стемминга, который производит реальные слова

Сделано изменение, так что 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
36
задан Kaarel 18 March 2009 в 16:43
поделиться

2 ответа

Базовая проблема здесь - то, что алгоритмы стемминга работают <ударяют> на фонетической основе просто на основе правил написания языка без фактического понимания языка, с которым они работают. Для создания реальных слов необходимо будет, вероятно, объединить вывод стеммера с некоторой формой функции поиска для преобразования основ назад в реальные слова. Я могу в основном видеть два потенциальных способа сделать это:

  1. Определяют местоположение или создают большой словарь, который отображает каждую возможную основу назад на фактическое слово. (например, сообщество-> сообщество)
  2. Создают функцию, которая сравнивает каждую основу со списком слов, которые были уменьшены до той основы, и пытается определить, который является самым подобным. (например, выдерживая сравнение "communiti" против "сообщества" и "сообществ" таким способом, которым "сообщество" будет распознано как более подобная опция)

Лично, я думаю способ, которым я сделал бы это, будет динамическая форма № 1, создавая пользовательскую базу данных словаря путем записи каждого слова, исследованного наряду с тем, что это остановило к и затем предположив, что наиболее распространенное слово является тем, которое должно использоваться. (например, Если мое тело исходного текста использует "сообщества" чаще, чем "сообщество", то отобразите сообщество-> сообщества.) Основанный на словаре подход будет более точным в целом, и создание его на основе входа стеммера предоставит результаты, настроенные Вашим текстам с основным недостатком, являющимся требуемым пространством, который является обычно не проблемой в эти дни.

16
ответ дан Dave Sherohman 27 November 2019 в 05:38
поделиться

Если я понимаю правильно, то то, в чем Вы нуждаетесь, не является стеммером, а лемматизатором. Лемматизатор является инструментом со знанием об окончаниях как -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

49
ответ дан Kaarel 27 November 2019 в 05:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: