在数据科学领域,将文本数据转换为数值特征是机器学习模型处理文本数据的第一步。本文将详细介绍如何使用Python实现词袋模型(Bag-Of-Words),并将其结果与Scikit-learn库中的CountVectorizer进行比较。词袋模型是一种将文本转换为固定长度向量的方法,通过计算文档中每个词的出现次数来实现。这种方法不考虑词的顺序和结构,只关注词是否出现在文档中,因此得名“词袋模型”。
让通过一个简单的例子来理解上述概念。假设对《权力的游戏》的评论进行分析:
评论1:《权力的游戏》是一部令人惊叹的电视剧!
评论2:《权力的游戏》是最佳电视剧!
评论3:《权力的游戏》太棒了。
在表格中,展示了如何获得词袋模型方法的所有计算结果:每一行对应一个不同的评论,而列是三个文档中包含的唯一词。
首先,需要导入必要的库并定义包含评论的变量:
import pandas as pd
import numpy as np
import collections
import re
doc1 = '《权力的游戏》是一部令人惊叹的电视剧!'
doc2 = '《权力的游戏》是最佳电视剧!'
doc3 = '《权力的游戏》太棒了'
# 文本预处理,去除标点符号,将字符串转换为单词列表
l_doc1 = re.sub(r"[^a-zA-Z0-9]", " ", doc1.lower()).split()
l_doc2 = re.sub(r"[^a-zA-Z0-9]", " ", doc2.lower()).split()
l_doc3 = re.sub(r"[^a-zA-Z0-9]", " ", doc3.lower()).split()
接下来,获得词汇表,即在三个评论中找到的唯一词。然后,定义一个函数来提取每个文档的特征。
def calculateBOW(wordset, l_doc):
tf_diz = dict.fromkeys(wordset, 0)
for word in l_doc:
tf_diz[word] = l_doc.count(word)
return tf_diz
# 获取每个评论的词袋模型表示
wordset = set(word for doc in [l_doc1, l_doc2, l_doc3] for word in doc)
bow1 = calculateBOW(wordset, l_doc1)
bow2 = calculateBOW(wordset, l_doc2)
bow3 = calculateBOW(wordset, l_doc3)
df_bow = pd.DataFrame([bow1, bow2, bow3])
df_bow.head()
通过上述代码,得到了每个评论的词袋模型表示。最终,得到了一个数据框,其中每一行对应于每个文档提取的特征。
from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer()
X = vectorizer.fit_transform([doc1, doc2, doc3])
df_bow_sklearn = pd.DataFrame(X.toarray(), columns=vectorizer.get_feature_names())
df_bow_sklearn.head()