文本特征提取:词袋模型与Scikit-learn的比较

数据科学领域,将文本数据转换为数值特征是机器学习模型处理文本数据的第一步。本文将详细介绍如何使用Python实现词袋模型(Bag-Of-Words),并将其结果与Scikit-learn库中的CountVectorizer进行比较。词袋模型是一种将文本转换为固定长度向量的方法,通过计算文档中每个词的出现次数来实现。这种方法不考虑词的顺序和结构,只关注词是否出现在文档中,因此得名“词袋模型”。

快速示例

让通过一个简单的例子来理解上述概念。假设对《权力的游戏》的评论进行分析:

评论1:《权力的游戏》是一部令人惊叹的电视剧!

评论2:《权力的游戏》是最佳电视剧!

评论3:《权力的游戏》太棒了。

在表格中,展示了如何获得词袋模型方法的所有计算结果:每一行对应一个不同的评论,而列是三个文档中包含的唯一词。

Python实现

首先,需要导入必要的库并定义包含评论的变量:

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()

通过上述代码,得到了每个评论的词袋模型表示。最终,得到了一个数据框,其中每一行对应于每个文档提取的特征。

与Scikit-Learn的比较

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()
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485