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

Если вы не проверяли предыдущие 2 статьи - › Часть-1 , Часть-2

В этой статье мы узнаем о стемминге, лемматизации, мешке слов (BOG), который помогает нам создавать элементы из текста.

Итак, зачем нам стемминг и лемматизация

По грамматическим причинам в документах будут использоваться разные формы слов, такие как организация, организация и организация. Кроме того, существуют семейства слов, связанных производными, с похожими значениями, например, демократия, демократия и демократизация. Во многих ситуациях кажется, что было бы полезно выполнить поиск по одному из этих слов, чтобы получить документы, содержащие другое слово в наборе. Целью как образования корней, так и лемматизации является сокращение флективных форм, а иногда и словообразовательных форм слова до общей базовой формы. (источник: https://nlp.stanford.edu/)

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

В процессе выделения и лемматизации мы пытаемся получить слово в корневой форме. Давайте рассмотрим несколько примеров.

Нормализация слов

Нормализация предложения

Практическая реализация (стемминг)

Построение # слова

# importing modules
from nltk.stem import PorterStemmer
stemmer = PorterStemmer()
# words
words = ['love','loves','loved','loving','lovely']
# list comprehension
# [stemmer.stem(w) for w in words]
for w in words:
    print(f"{w} --> {stemmer.stem(w)}")

# Основание предложения

# importing modules
from nltk.stem import PorterStemmer
from nltk.tokenize  import word_tokenize
stemmer = PorterStemmer()
# sentence
sentence = "I really loves to do swimming"
# words
words = word_tokenize(sentence)
for w in words:
    print(f"{w} --> {stemmer.stem(w)}")

Практическая реализация (лемматизация)

Лемматизация # слов

from nltk.tokenize  import word_tokenize
lemma = WordNetLemmatizer()
# words
words = ['love','loves','loved','loving','lovely']
for w in words:
    print(f"{w} --> {lemma.lemmatize(w)}")

# Лемматизация предложений

from nltk.stem import WordNetLemmatizer
from nltk.tokenize  import word_tokenize
lemma = WordNetLemmatizer()
# sentence
sentence = "I really loves to do swimming"
# words
words = word_tokenize(sentence)
for w in words:
    print(f"{w} --> {lemma.lemmatize(w)}")

Теперь, как мы можем видеть в приведенном выше примере, стемминг и лемматизация делают примерно одни и те же вещи, так когда использовать стемминг, а когда - лемматизацию?

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

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

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

Мешок слов (BoW)

BoW - это алгоритм, который подсчитывает, сколько раз слово появляется в документе. В модели Bag of Words (BoW) мы представляем текст как число (то есть вхождение слова).

Проще говоря, мы можем сказать

«Мы можем представить предложение как вектор мешка слов».

Во-первых, нам нужно составить словарный запас из всех уникальных слов, которые мы обсуждали в части 1 этой серии.

BoW перечисляет слова в паре с их количеством слов в документе. В таблице, где хранятся слова и документ, которые фактически становятся векторами, каждая строка представляет собой слово, каждый столбец в документе в корпусе представлен столбцами одинаковой длины.

Давайте разберемся на примере: -

# Bag of words
corpus = [
"Natural language processing is the best",
"I want to learn NLP",
"I don't want to learn ",
"I am sad",
]
# importing CountVectorizer
from sklearn.feature_extraction.text import CountVectorizer
# create the vectorizer
vector = CountVectorizer()
# building vocab
vector.fit(corpus)
# vocabulary
print(vector.vocabulary_)
# output
"""
{'natural': 6, 'language': 4, 'processing': 8, 'is': 3, 'the': 10, 'best': 1, 'want': 12, 'to': 11, 'learn': 5, 'nlp': 7, 'don': 2, 'am': 0, 'sad': 9}
"""
# encode document
enc = vector.transform(corpus)
# encoded vector
print(enc.shape)  # (4, 13)
print(enc.toarray())
# output
'''
[[0 1 0 1 1 0 1 0 1 0 1 0 0]
 [0 0 0 0 0 1 0 1 0 0 0 1 1]
 [0 0 1 0 0 1 0 0 0 0 0 1 1]
 [1 0 0 0 0 0 0 0 0 1 0 0 0]]
 '''

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

У нас есть 4 предложения в нашем корпусе, поэтому у нас есть 4 строки и 13 уникальных слов, поэтому у нас есть 13 столбцов, соответствующих каждому уникальному слову, и мы заполняем 1, если уникальное слово встречается в предложении, иначе 0.

Проблема с моделью мешка со словами (лука)?

В приведенном выше примере у нас есть матрица размера (столбец X строки),

который в данном случае равен (4 x 13), и большинство из них равны 0, что не дает значений модели.

Однако в реальном мире данные, которые у нас есть, содержат много предложений и много уникальных слов для словаря. Например, у нас есть 10000 предложений и 10000 уникальных слов, размер которых у нашей модели BoW (10000 X 10000).

  1. Если размер нашего словаря увеличится, то длина векторов также увеличится, что составляет размер модели BoW.
  2. Кроме того, матрица также будет содержать много 0, s, что приведет к разреженной матрице.
  3. И у нас нет информации о грамматике и порядке слов в тексте.

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

Часть -1: - https://medium.datadriveninvestor.com/nlp-master-part-1-93cec31a457

Часть 2: - https://iamhimanshutripathi0.medium.com/nlp-master-part-2-a2c0f28b25d3

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

На этом пока все 👏👏. Увидимся в следующей статье.

Ссылка: - https://www.coursera.org/specializations/natural-language-processing

Читайте больше интересных проектов по машинному обучению, глубокому обучению и анализу данных на моем YouTube 👉: - YouTube (👍)

Также давайте подключимся к Linkedin, Twitter, Instagram, Github и Facebook.