Python - как интуитивно понять слово из сокращенного текста с помощью НЛП?

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

wtrbtl = water bottle
bwlingbl = bowling ball
bsktball = basketball

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

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

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

обновление:

У меня также была идея объединить пару строковых метрических алгоритмов, таких как алгоритм рейтинга соответствия, чтобы определить набор связанных терминов, а затем вычислить расстояние Левенштейна между каждым словом в наборе целевой аббревиатуры. Тем не менее, я все еще в неведении, когда дело доходит до аббревиатур для слов не в мастер-словаре. В принципе, вывод конструкции слова-может наивная модель Байеса может помочь, но я обеспокоен тем, что любая ошибка в точности, вызванная использованием приведенных выше алгоритмов, приведет к недействительности любого процесса обучения модели.

любая помощь будет оценили, как я действительно застрял на этом.

4 ответов


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

для ваших сокращений вы можете построить "модель шума", которая предсказывает вероятность пропусков символов. Он может узнать из корпуса (вы должны пометить его вручную или наполовину вручную), что согласные пропущены реже, чем гласные.

имея сложную языковую модель и простую модель шума, вы можете объединить их с помощью шумный канал подхода (см., например,статья Jurafsky для более подробной информации), чтобы предложить предложения кандидатов.

обновление. Я с энтузиазмом отнесся к этой проблеме и реализовал этот алгоритм:

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

мое решение реализовано в этом Python notebook. С обученными моделями, он имеет интерфейс, как noisy_channel('bsktball', language_model, error_model), который, кстати, возвращается {'basket ball': 33.5, 'basket bally': 36.0}. Значения словаря-это оценки предложений (чем ниже, тем лучше).

С другими примерами он работает хуже: для "wtrbtl" он возвращает {'water but all': 23.7, 'water but ill': 24.5, 'water but lay': 24.8, 'water but let': 26.0, 'water but lie': 25.9, 'water but look': 26.6}.

для 'bwlingbl' это дает {'bwling belia': 32.3, 'bwling bell': 33.6, 'bwling below': 32.1, 'bwling belt': 32.5, 'bwling black': 31.4, 'bwling bling': 32.9, 'bwling blow': 32.7, 'bwling blue': 30.7}. Однако при обучении на соответствующем корпусе (например, спортивных журналах и блогах; может быть, с передискретизацией существительных), а может быть, и с более щедрой шириной поиска луча, эта модель предоставит более релевантные предложения.


поэтому я посмотрел на аналогичную проблему и наткнулся на фантастический пакет под названием PyEnchant. Если вы используете сборку в spell-checker, вы можете получить предложения word, что было бы хорошим и простым решением. он будет предлагать только отдельные слова (насколько я могу судить), и поэтому ситуация у вас есть:

wtrbtl = water bottle

не будет работать.

вот код:

import enchant

wordDict = enchant.Dict("en_US")

inputWords = ['wtrbtl','bwlingbl','bsktball']
for word in inputWords:
    print wordDict.suggest(word)

выход:

['rebuttal', 'tribute']
['bowling', 'blinding', 'blinking', 'bumbling', 'alienable', 'Nibelung']
['basketball', 'fastball', 'spitball', 'softball', 'executable', 'basketry']

возможно, если вы знаете, какие аббревиатуры есть вы можете разделить строку на два слова, например,

'wtrbtl' -> ['wtr', 'btl']

там также набор обработки естественного языка (в nltk), что удивительно, и вы можете использовать это в сочетании с приведенным выше кодом, посмотрев, насколько распространено каждое предлагаемое слово, например.

удачи!


один из вариантов-отправиться назад во времени и вычислить Алгоритм Soundex эквивалентны.

Soundex отбрасывает все гласные, обрабатывает общие искажения и хруст написания. Алгоритм упрощен и используется для выполнения вручную. Недостатком является то, что нет специального слова stemming или stop work support.


... аббревиатуры для слов, не входящих в основной словарь.

Итак, вы ищете модель НЛП, которая может придумать действительные английские слова, не видя их раньше?

вероятно, легче найти более исчерпывающий словарь слов или, возможно, сопоставить каждое слово в существующем словаре с общими расширениями, такими как +"es" или word[:-1] + "ies".