Итак, в предыдущей статье мы узнали об основных концепциях предварительной обработки токенизации и стоп-слов, почему нам нужно их использовать, почему они важны, методах выполнения токенизации и стоп-слов.
Если вы не проверяли предыдущие 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).
- Если размер нашего словаря увеличится, то длина векторов также увеличится, что составляет размер модели BoW.
- Кроме того, матрица также будет содержать много 0, s, что приведет к разреженной матрице.
- И у нас нет информации о грамматике и порядке слов в тексте.
До сих пор мы узнали, как преобразовать текст в вектор, что такое токенизация и стоп-слова, а затем как нормализовать заданный текстовый корпус, если какой-либо из них кажется вам незнакомым, а затем взгляните на предыдущие статьи.
Часть -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.