За последние несколько месяцев у меня была возможность поработать над несколькими проектами НЛП. Практически во всех этих проектах мои задачи были прямыми и простыми. Подайте векторы слов (представление слов в виде числовых значений) в мою модель НЛП, займитесь настройкой параметров и затем получите соответствующий результат.
Все это может показаться сложным, но если у вас есть предварительно обученная модель с фиксированной архитектурой, то вы практически ничего не делаете. Суть работы заключается в самом коде. Как разработчик, вы отвечаете за мониторинг статистики, следя за тем, чтобы количество ошибок уменьшалось с разумной скоростью. Если этого не происходит, вы настраиваете гиперпараметры ровно настолько, чтобы получить правильные результаты, а об остальном позаботятся сами модули Python.
Честно говоря, я особо не задавался вопросом, потому что раньше все всегда работало, как положено. Зачем изобретать велосипед? Верно ? Большая ошибка. Большая... новичок... ошибка

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

Что такое лемматизация?

Лемматизация включает в себя анализ слова и приведение его к его основной корневой форме. Например, если у вас есть слово «бег», лемматизация сокращает его до слова «бег»
Итак, как же мы получаем от «бег» слово «бег»?

1)Портер Стемминг

Зачем нам нужен стемминг в первую очередь? Какие преимущества я получаю от стемминга?
Что ж, лемматизация — это трудоемкая операция. Может показаться, что это не так уж много для одного выполнения, но по мере того, как вы продолжаете подсчитывать все больше и больше запросов на выполнение, вы начнете замечать запросы между стеммингом и лемматизацией. Допустим, вы размещаете веб-сайт, и на ваш сервер поступают миллионы запросов, скажем, масштабирование ваших серверов не вариант (возможно, у вас есть ограничения по ресурсам). В таком сценарии, если вы можете разгрузить часть этой рабочей нагрузки для обмена точностью, очень хорошим вариантом будет стемминг. Это может значительно сократить время и получить достаточно близкий результат. Было бы полезнее работать над лемматизацией в долгосрочной перспективе, но если у вас связаны руки, то стемминг может быть действительно хорошим вариантом. На мой взгляд, это средство поиска базовых слов для бедняков.
Прежде чем мы углубимся в это, несколько предварительных знаний в порядке.
Слово состоит из двух частей: аффикса и основы.

Основа считается основным словом, очищенным до минимума слов без потери большей части его сущности или значения. Небольшое примечание: корень (базовый корень, упомянутый ранее) и стебель — это два совершенно разных слова. В зависимости от контекста или варианта использования проекта вам придется использовать базовые или корневые слова для вашей модели ML. Например, если вам нужна модель машинного обучения, которая хорошо работает благодаря своей способности ассоциироваться с как можно большим количеством вариантов одних и тех же слов, то корневое слово будет более подходящим. Но если вы хотите, чтобы область действия была привязана к основному слову, сохраните вектор основного слова в качестве входных данных для модели ML.

Отлично, теперь вы готовы к стеммингу Портера.

Основа Портера проверяет наличие аффиксов и избавляется от них. Это гарантирует, что слово освобождено до его основной формы, прежде чем отправить его на обработку ML. Вы можете рассматривать этот этап как часть предварительной обработки.
Как только это будет сделано, слово будет готово для сопоставления с соответствующим соседним словом.
Например, после удаления аффикса для «попыток» оно станет «три», что не является четким словом, которое мы ищем. Мы бы предпочли «попробовать»

2) Алгоритм Левенштейна

Этот алгоритм используется для поиска близкого соседнего слова для входного слова. Позволяет вам иметь следующее предложение

«Быстрая коричневая лиса перепрыгнула через забор»

Затем можно использовать алгоритм Левенштейна для исправления предложения.

«Быстрая коричневая лиса перепрыгнула через забор»

Где это может понадобиться?
Одно слово : Автокоррекция
Если вы когда-либо печатали сообщение своим друзьям или родственникам, то знаете, насколько эффективнее стал ваш набор текста с тех пор, как вы внедрили автокоррекцию .

Этот алгоритм выходит за рамки автокоррекции. Этот алгоритм также является основой для поисковой оптимизации.

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

После захвата ближайшего совпадающего слова нам нужно будет найти, к какому варианту оно принадлежит.
Например, если алгоритм Левенштейна дает вам «попытаться» в качестве выходных данных, вы захотите связать его с усилием. Как это сделать?

3) Полная лексика

Полная форма Лексикон — это ресурс, который содержит
1)Основное слово
2)Части речи
3)Флексии (различные варианты одного и того же слова. Вы также можете создать свои собственные синонимы для более быстрого поиска! )
4)Определение

Как только слово подставлено в полный словарь, полный словарь
1) проверит слова в словоизменении (варианты)
2) вернет вам основное слово
Например, если «попытка» найдена как вариант «усилие», то «усилие» предоставляется в качестве вывода. На основе этого извлекается ключевое слово, вот и все!

Примечание. Если вы не предоставите базовый корень для библиотеки Lexicon, вам будет трудно понять фактическое значение слова. Это связано с тем, что ваша модель машинного обучения будет обучаться на ложных данных. Поэтому всегда следите за тем, чтобы предоставляемое слово было в его базовой форме, когда оно работает лучше всего, в полной лексике.

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

import nltk
from nltk.stem import PorterStemmer
import Levenshtein

# Sample lexicon (you would replace this with your full-form lexicon database)
lexicon = ["run", "running", "runs", "runner", "swim", "swimming", "swims", "swimmer", "jump", "jumping", "jumps", "jumper"]

# Function to perform lemmatization using Levenshtein distance
def lemmatize_word(word, lexicon):
    # Step 1: Get the stem word
    stemmer = PorterStemmer()
    stem_word = stemmer.stem(word)

    # Step 2: Find the most relevant word in the lexicon using Levenshtein distance
    min_distance = float('inf')
    lemma = None

    for lexicon_word in lexicon:
        distance = Levenshtein.distance(stem_word, lexicon_word)
        if distance < min_distance:
            min_distance = distance
            lemma = lexicon_word

    return lemma

# Sample input words
input_words = ["running", "swimmer", "jumps", "unknown"]

# Lemmatize each input word
for word in input_words:
    lemma = lemmatize_word(word, lexicon)
    print(f"Word: {word}, Lemma: {lemma}")
Output

Word: running, Lemma: run
Word: swimmer, Lemma: swim
Word: jumps, Lemma: jump
Word: unknown, Lemma: jump

Заключение

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

Если вам понравилась эта статья, то обязательно подпишитесь на меня! Свяжитесь со мной по адресу https://www.linkedin.com/in/amos-eda-839870185/. Как всегда, если у вас есть конструктивная критика. Я хотел бы услышать все об этом!

В бесконечность и дальше…