Распознавание именованных сущностей в НЛП

Если у вас есть опыт обработки естественного языка, вы, скорее всего, слышали о распознавании именованных сущностей (NER). Короче говоря, это ряд статистических, основанных на правилах и словарях методов, используемых для поиска в неструктурированном тексте и классификации слов по заранее определенным категориям.

Библиотеки Python, такие как NLTK и Spacy, содержат собственные предустановленные словари, которые позволяют классифицировать местоположения, бренды, людей, числовые характеристики, временные характеристики (даты, время, продолжительность) и многое другое. Тем не менее, этих библиотек недостаточно для более конкретных задач, таких как классификация продуктов компании или словарный запас, связанный с услугами. Для таких задач вполне вероятно, что вы в конечном итоге определите свой собственный словарь и либо добавите их к NER-tagger NTLK / Spacy, либо запустите его отдельно как NER на основе словаря.

Нечеткое зрелище ?!

Нечеткое сопоставление строк - также называемое приблизительным сопоставлением строк - это группа методов, используемых для приблизительного, а не точного сопоставления строк или слов. Обычно, если мы должны сопоставить слова или предложения в тексте со словарем, мы будем использовать типичный метод «in / re.search / equals» для поиска точных совпадений.

Однако в большинстве практических приложений сопоставления слов только с их точным словарным «супругом» недостаточно. На самом деле люди допускают опечатки и орфографические ошибки. Следовательно, нам нужно будет найти способ определить, сильно ли похожи слова или предложения, но не полностью. Нам также необходимо знать насколько они разные, если мы хотим выразить определенную степень уверенности в нашем матче. Имея эту информацию, мы также можем поэкспериментировать с уровнями достоверности в зависимости от длины строки / слова, чтобы оптимизировать наши коэффициенты соответствия.

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

Из Осло в снег с Левенштейном

Хотя существуют разные алгоритмы редактирования расстояния, мы ограничимся, пожалуй, самым популярным: Расстояние Левенштейна. Другие методы редактирования расстояния включают расстояние Дамерау-Левенштейна, самую длинную общую подпоследовательность (LCS) и расстояние Хэмминга. Эти методы отличаются от методов Левенштейна в основном разрешенными к выполнению операциями редактирования и связанными с ними затратами. Операции редактирования включают в себя: вставку, удаление, перестановку и замену. Если вы интегрируете нечеткое сопоставление в свое приложение, обязательно проверьте, какой алгоритм лучше всего подходит для вас.

Операции редактирования определяют шаги, необходимые для преобразования слова A в слово B. Чем больше требуется шагов, тем больше расстояние и тем сильнее различие между словом A и B. Давайте посмотрим на расстояние Левенштейна между словами «oslo» и «снег». .

Мы можем вычислить аналогичную оценку как [общая стоимость: 3 / максимальное расстояние: 4] x 100% = 75%. Обратите внимание, что библиотеки Fuzzywuzzy вернут другой результат (50%), поскольку их коэффициент подобия вычисляется по-разному *.

Словарные слова с нечетким соответствием с различными уровнями сходства

Теперь представим, что мы определили наш собственный словарь и хотим расширить NLTK-теггер NER нашим собственным пользовательским словарем. У нас есть несколько вариантов, например, обучить тегировщика по нашему пользовательскому словарю, создать систему на основе правил или создать систему на основе совпадений.

А пока мы воспользуемся системой на основе совпадений, чтобы получить совпадения по словарю. Мы будем использовать реализацию Seatgeek Fuzzywuzzy для обработки опечаток. Сначала мы создаем простой DataFrame pandas, состоящий из длин слов и минимальных коэффициентов сходства (MSR), которых мы хотели бы достичь.

По мере того, как слова становятся крупнее, увеличивается риск опечаток и уменьшается вероятность намеренного значения другого слова. Таким образом, мы ослабляем критерии по мере увеличения длины слова. Обратите внимание, что это произвольные значения.

getFuzzyRatio () используется для возврата минимального отношения сходства. На основе длины строки он ищет соответствующую строку во фрейме данных и возвращает соответствующий показатель сходства.

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

Давайте проверим наш нечеткий NER-теггер с парой объектов, содержащих опечатку, чтобы убедиться, что он работает. Запускаем приведенный выше скрипт и получаем:

'insurence' matches with insurance with a score of: 89
'houze' matches with house with a score of: 80
'libertey' matches with liberty with a score of: 93

Обратите внимание, что также возвращается «houze», поскольку для MSR установлено значение 80, а фактическое соотношение также равно 80. Давайте поиграемся с различными значениями MSR, чтобы поднять планку. Давайте добавим minRatio: [100,100,100,100,100,85,85,85,85,80]. На этот раз теггер возвращает только «insurence» и «libertey», так как 5-буквенные слова теперь должны полностью совпадать, чтобы их можно было распознать.

'insurence' matches with insurance with a score of: 89
'libertey' matches with liberty with a score of: 93

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

Понравился наш блог? Мы ценим ваши аплодисменты. Заинтересованы в крутых вещах, которые мы делаем в сфере НЛП?

Посетите www.tailo.nl для получения дополнительной информации!