[Искусственный интеллект для обработки печи] Машинное обучение 038-NLP создает модель мешка слов
(Библиотеки Python и номера версий, используемые в этой статье: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2, NLTK 3.3)
Мешок слов (Bag Of Words, BOW) и вектор слов (Word Embedding, также известный как вложение слов и т. д.) являются двумя наиболее часто используемыми моделями для обработки естественного языка и анализа текста.
Модель мешка слов рассматривает фрагмент текста как набор слов, поскольку слов много, текст эквивалентен мешку, содержащему ряд слов. Следовательно, НЛП-анализ компьютера заключается в анализе сумки, но компьютер не знает текста, только число, затем нам нужен механизм преобразования текста в сумке в число, этим механизмом может быть Dict-отображение (ключ — число), значение — текст и т. д.), или массив (индекс — число, значение — текст), или HashCode можно использовать для вычисления цифрового представления текста, а моделирование НЛП — использовать эти числа для моделирования. . Как только набор слов выучен, каждый документ можно смоделировать, построив гистограмму всех слов в документе.
Модель слова-вектора заключается в отображении одного слова в многомерное пространство (размерность может достигать десятков тысяч или даже сотен тысяч).Это многомерное пространство представлено массивом или вектором, поэтому слово-вектор устанавливается отношение отображения, поэтому оно становится векторной моделью слов. Однако эта модель может представлять только одно слово. Для предложения, состоящего из нескольких слов, требуется дальнейшая обработка. Например, слово — это вектор, а предложение, состоящее из N слов, — это N одномерных векторов. матрица, составленная из N одномерных векторов, может использоваться для представления предложения, но количество строк матрицы различно для предложений разной длины.
Ниже мы только научимся создавать модель мешка слов с помощью НЛП, Процесс создания в основном заключается в извлечении признаков текста и построении вектора признаков. Есть два способа построения векторов признаков: CountVectorizer и TfidfVectorizer.
1. Извлечение текстовых функций с помощью CountVectorizer
Метод CountVectorizer в модуле sklearn может напрямую извлекать текстовые признаки.Эта функция учитывает только частоту появления слов в тексте.Эта функция имеет один параметр: stop_words, указывающий, следует ли удалять стоп-слова.Так называемые стоп-слова относятся к сохранению пространство и слова, которые автоматически фильтруются для повышения эффективности, такие как the, is, at, which и т. д., для разных слов стоп-слова по умолчанию не удаляются стоп-слова.
# 数据集暂时用简·奥斯丁的《爱玛》中的文本
dataset=nltk.corpus.gutenberg.words('austen-emma.txt')
# print(len(dataset)) # 192427 代表读入正常
chunks=split(" ".join(dataset[:10000]), 2000) # 将前面的10000个单词分成五个词袋,每个袋子装2000个单词
# 构建一个文档-词矩阵,该矩阵记录了文档中每个单词出现的频次
# 用sk-learn的CountVectorizer函数来实现这种构建过程
from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer(min_df=4, max_df=.99)
# fit_transform函数需要输入一维数组,且数组元素是用空格连起来的文本
chunks=[" ".join(chunk) for chunk in chunks] # 故而需要转换一下
doc_term_matrix = vectorizer.fit_transform(chunks)
feature_names=vectorizer.get_feature_names() # 获取
print(len(feature_names))
print(doc_term_matrix.shape)
# print(doc_term_matrix.T.toarray())
Первые 10 000 слов в «Эмме» Джейн Остин разделены на пять наборов слов, каждый набор слов содержит 2000 слов, а затем CountVectorizer используется для создания вектора текстовых признаков, который находится внутри объекта CountVectorizer после fit_transform. Эта матрица слова-документа установлен, и результат можно увидеть по распечатке.
Для того, чтобы более четко увидеть матрицу документа-слова внутри, вы можете распечатать ее с помощью следующего кода:
# 打印看看doc_term_matrix这个文档-词矩阵里面的内容
print('Document Term Matrix------>>>>')
bag_names=['Bag_'+str(i) for i in range(5)] # 5个词袋
formatted_row='{:>12}'*(1+len(bag_names)) # 每一行第一列是单词,后面是每个词袋中的频率
print(formatted_row.format('Word', *bag_names))
for word, freq in zip(feature_names,doc_term_matrix.T.toarray()): # 需要装置矩阵
# 此处的freq是csr_matrix数据结构
output = [str(x) for x in freq.data]
print(formatted_row.format(word,*output))
----------------------- потерять ----------------------- выход ---------------- ----
Document Term Matrix------>>>> Word Bag_0 Bag_1 Bag_2 Bag_3 Bag_4 about 3 4 0 1 1 among 1 1 1 1 0 because 1 1 0 1 1 believe 0 1 1 1 3 believed 0 1 1 1 2 best 1 2 1 1 0 better 0 3 1 1 2 beyond 1 0 1 2 3
...
-----------------------Заканчивать-------------------------- ------
Выше приведен частичный результат: видно, что about встречается 3 раза в Bag_0, 4 раза в Bag_1 и так далее.
Если у вас есть какие-либо сомнения относительно количества вхождений этой матрицы, вы можете посмотреть мойкод в моем гитхабе, что объясняется более подробно.
Стоит отметить, что CountVectorizer также можно использовать для извлечения признаков китайского языка, но пользовательскую функцию разделения необходимо изменить.Исходная функция использует пробел в качестве разделителя, который можно использовать для сегментации английских слов, но он недействителен для китайского языка. , поэтому китайский В случае , вам нужно изменить метод сегментации слова в разделении на сегментацию слова jieba.
2. Извлечение текстовых функций с помощью TfidfVectorizer
Главной особенностью TfidfVectorizer является то, что помимо учета частотности определенного слова в тексте, он также обращает внимание на количество всех текстов, содержащих это слово.Этот метод позволяет уменьшить влияние высокочастотных бессмысленных слов и добывать больше значимые черты. В целом, когда текстовых записей больше, эффект от этого метода более значителен.
С точки зрения кода использование TfidfVectorizer почти такое же, как и CountVectorizer выше, просто замените имя класса.
# 数据集暂时用简·奥斯丁的《爱玛》中的文本
dataset=nltk.corpus.gutenberg.words('austen-emma.txt')
# print(len(dataset)) # 192427 代表读入正常
chunks=split(" ".join(dataset[:10000]), 2000) # 将前面的10000个单词分成五个词袋,每个袋子装2000个单词
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer()
# fit_transform函数需要输入一维数组,且数组元素是用空格连起来的文本
chunks=[" ".join(chunk) for chunk in chunks] # 故而需要转换一下
doc_term_matrix = vectorizer.fit_transform(chunks)
feature_names=vectorizer.get_feature_names() # 获取
print(len(feature_names))
print(doc_term_matrix.shape)
Выводимый результат — это не частота слова в наборе слов, а вес tf-idf.Этот вес имеет формулу расчета tf-idf=tf*idf, что означает, что tf и idf — это две разные вещи. Среди них tf — количество вхождений слова в обучающий текст, то есть частота термина; idf — обратная частота документа (Inverse Document Frequency), весовой поправочный коэффициент для частоты термина.
########################резюме########################## ######
1. Существует два основных метода извлечения текстовых признаков в модели мешка слов: CountVectorizer и TfidfVectorizer.Матрица слова-документа, построенная CountVectorizer, представляет собой частоту слов, появляющихся в мешке слов, а матрица, построенная TfidfVectorizer, представляет собой слово веса tf-idf.
2. В обычных условиях текст документа относительно длинный, поэтому лучше использовать TfidfVectorizer, и этот метод рекомендуется.
#################################################################
Примечание. Эта часть кода была загружена в (мой гитхаб), добро пожаловать на скачивание.
Использованная литература:
1. Классические примеры машинного обучения Python, Пратик Джоши, перевод Тао Цзюньцзе и Чена Сяоли.