Найти предмет в неполном предложении с помощью NLTK - PullRequest
3 голосов
/ 13 января 2012

У меня есть список товаров, которые я пытаюсь классифицировать по категориям.Они будут описаны с неполными предложениями, такими как:

"Корпус твердотельного диска"

"Кабель жесткого диска"

"Жесткий диск 1 ТБ"

"Жесткий диск на 500 ГБ, восстановленный от производителя "

Как я могу использовать python и NLP для получения вывода, такого как" Корпус, кабель, диск, диск "или дерево, которое описывает, какое слово изменяет какое?Заранее спасибо

Ответы [ 3 ]

2 голосов
/ 14 января 2012

Методы НЛП относительно плохо приспособлены для работы с этим видом текста.

По-другому: вполне возможно построить решение, которое включает в себя процессы НЛП для реализации желаемого классификатора, но дополнительная сложность не даетобязательно окупается с точки зрения скорости разработки или улучшения точности классификатора.
Если кто-то действительно настаивает на использовании методов НЛП, POS-тегирование и его способность идентифицировать существительные являются наиболее очевидной идеей, но Chunking и доступ к WordNet или другой лексическойИсточниками являются другие возможные варианты использования NLTK.

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

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

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

Несколько идей:

  • Подсчитайте все слова (и, возможно, все биграммы и триграммы) в значительной части корпуса руки.Эта информация может влиять на дизайн классификатора, позволяя распределять наибольшее количество усилий и самые жесткие правила для наиболее распространенных шаблонов.
  • вручную вводит краткий словарь, который связывает наиболее популярные слова с:
    • их функцией POS (в основном это бинарный вопрос: т. Е. Существительные против модификаторов и другие не существительные.
    • их корень синонима [если применимо]
    • их класс [если применимо]
  • Если шаблон подходит для большей части входного текста, рассмотрите возможность использования последнего слова передконец текста или перед первой запятой в качестве основного ключа для выбора класса. Если шаблон не удерживается, просто уделите больше внимания первому и последнему слову.
  • рассмотрите первый проход, гдетекст переписывается с использованием наиболее распространенных биграмм, заменяемых одним словом (даже искусственным кодовым словом), которое будет в словаре
  • , а также замените наиболее распространенные опечатки или синонимы соответствующим корнем синонимовДобавление регулярности во входные данные помогает повысить точность, а также помогает сделать несколько правил / несколько записей в словаре имеют большую отдачу от precision.
  • для слов, не найденных в словаре, предположим, что слова, которые смешаны с числами и / или предшествуют числам, являются модификаторами, а не существительными.Предположим, что
  • учитывает двухуровневую классификацию, в соответствии с которой входные данные, которые не могут быть правдоподобно присвоены классу, помещаются в «ручную кучу», чтобы вызвать дополнительный обзор, который приводит к дополнительным правилам и / или словарным статьям.После нескольких итераций классификатор должен все меньше и меньше улучшений и настроек.
  • ищет неочевидные возможности.Например, некоторые корпуса сделаны из комбинации источников, но некоторые из источников могут включать определенные закономерности, которые помогают идентифицировать источник и / или могут быть использованы в качестве подсказок классификации.Например, некоторые источники могут содержать только, например, верхний регистр текста (или текст, как правило, длиннее 50 символов, или усеченные слова в конце и т. Д.)

Боюсь, что в этом ответе не дадут фрагментов Python / NLTK в качестве учебного пособия для решения, но, честно говоря, такие простые подходы на основе NLTK, вероятно, в лучшем случае будут разочаровывающими. Кроме того, у нас должен быть гораздо больший выборочный набор входного текста, чтобы руководствоваться при выборе правдоподобных подходов, включая те, которые основаны на методах NLTK или NLP в целом.

1 голос
/ 13 января 2012

Я бы создал список существительных, либо вручную, со всеми существительными, которые вы ищете, либо проанализировал бы словарь, такой как этот .Фильтрация всех, кроме существительных, по крайней мере, приведет вас к «State Drive», «Drive Cable» или «Drive», игнорируя все после первого знака препинания.

0 голосов
/ 27 июня 2019

pip install spacy

python -m spacy скачать ru Пространство импорта

nlp = spacy.load('en')
sent = "INCOMEPLETE SENTENCE HERE"
doc=nlp(sent)
sub_toks = [tok for tok in doc if (tok.dep_ == "ROOT") ]

Примеры:

sent = "Solid State Drive Housing"
doc=nlp(sent)
sub_toks = [tok for tok in doc if (tok.dep_ == "ROOT") ]

выход: [Корпус]

sent = "Hard Drive Cable"
doc=nlp(sent)
sub_toks = [tok for tok in doc if (tok.dep_ == "ROOT") ]

выход: [Кабель]

sent = "1TB Hard Drive"
doc=nlp(sent)
sub_toks = [tok for tok in doc if (tok.dep_ == "ROOT") ]

вывод: [Drive]

sent = "500GB Hard Drive, Refurbished from Manufacturer"
doc=nlp(sent)
sub_toks = [tok for tok in doc if (tok.dep_ == "ROOT") ]

вывод: [Drive]

...