当我们处理包含数百万个单词的文本文档时, 我们需要将它们转换成某种数字表示形式. 其原因是使其可用于机器学习算法. 这些算法需要数值数据, 以便它们可以分析它们并输出有意义的信息. 这就是袋子的方法. 这基本上是一个从所有文件中的所有单词中学习词汇的模型. 之后, 它通过构建文档中所有单词的直方图来为每个文档建模.
怎么做?
- 创建一个文件, 导入需要的包:
import numpy as np
from nltk.corpus import brown
from chunking import splitter
- 定义主函数:
if __name__=='__main__':
# Read the data from the Brown corpus
data = ' '.join(brown.words()[:10000])
- 分割数据:
# Number of words in each chunk
num_words = 2000
chunks = []
counter = 0
text_chunks = splitter(data, num_words)
- 创建一个基于这些文本块的字典
for text in text_chunks:
chunk = {'index': counter, 'text': text}
chunks.append(chunk)
counter += 1
- 下一步是提取文档术语矩阵. 这个矩阵用于计算文档中每个单词的出现次数. 我们将使用scikit-learn来做到这一点, 因为与NLTK相比, 该项任务具有更好的效果. 导入以下包
from sklearn.feature_extraction.text import CountVectorizer
- 定义对象, 并提取文档项矩阵
vectorizer = CountVectorizer(min_df=5, max_df=.95)
doc_term_matrix = vectorizer.fit_transform(
[chunk['text'] for chunk in chunks]
)
- 从矢量化对象中提取词汇并打印
vocab = np.array(vectorizer.get_feature_names())
print("Vocabulary:")
print(vocab)
- 打印文档矩阵
print("Document term matrix:")
chunk_names = ['Chunk-0', 'Chunk-1', 'Chunk-2', 'Chunk-3', 'Chunk-4']
formatted_row = '{:>12}' * (len(chunk_names) + 1)
print('\n', formatted_row.format('Word', *chunk_names), '\n')
- 用单词迭代, 并打印每个单词在不同块中发生的次数
for word, item in zip(vocab, doc_term_matrix.T):
# 'item' is a 'csr_matrix' data structure
output = [str(x) for x in item.data]
print(formatted_row.format(word, *output))
工作原理...?
考虑以下句子:
- Sentence 1: The brown dog is running.
- Sentence 2: The black dog is in the black room.
- Sentence 3: Running in the room is forbidden.
如果你考虑所有这三个句子, 我们有以下九个独特的词语:
- the
- brown
- dog
- is
- running
- black
- in
- room
- forbidden
现在, 我们用每个句子中的单词数将每个句子转换为直方图. 每个特征向量将是9维, 因为我们有九个独特的单词:
- Sentence 1: [1, 1, 1, 1, 1, 0, 0, 0, 0]
- Sentence 2: [2, 0, 1, 1, 0, 2, 1, 1, 0]
- Sentence 3: [0, 0, 0, 1, 1, 0, 1, 1, 1]
一旦我们提取这些特征向量, 我们可以使用机器学习算法来分析它们.