Подтвердить что ты не робот

Python - Как вводить слово из сокращенного текста с помощью NLP?

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

wtrbtl = water bottle
bwlingbl = bowling ball
bsktball = basketball

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

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

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

ОБНОВЛЕНО:

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Мое решение реализовано в этом ноутбуке Python. С обучаемыми моделями он имеет интерфейс типа 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}. Тем не менее, при обучении на соответствующем корпусе (например, в спортивных журналах и блогах, возможно, с передискретизацией существительных) и, возможно, с более широкой шириной поиска луча, эта модель предоставит более релевантные предложения.

Ответ 2

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

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), который является AMAZING, и вы можете использовать его в сочетании с приведенным выше кодом например, глядя на то, насколько распространено каждое предложенное слово.

Удачи!

Ответ 3

Один из вариантов - вернуться во времени и вычислить эквивалент Soundex Algorithm.

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

Ответ 4

... аббревиатуры для слов, не содержащихся в главном словаре.

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

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