当我们处理包含数百万个单词的文本文档时, 我们需要将它们转换成某种数字表示形式. 其原因是使其可用于机器学习算法. 这些算法需要数值数据, 以便它们可以分析它们并输出有意义的信息. 这就是袋子的方法. 这基本上是一个从所有文件中的所有单词中学习词汇的模型. 之后, 它通过构建文档中所有单词的直方图来为每个文档建模.

怎么做?

  • 创建一个文件, 导入需要的包:
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]

一旦我们提取这些特征向量, 我们可以使用机器学习算法来分析它们.

results matching ""

    No results matching ""