文本数据中蕴含着大量有价值的信息,而情感分析作为自然语言处理的重要应用,能帮助我们快速了解文本背后的情感倾向。本文将通过一段完整的 Python 代码,带大家走进文本情感分析的世界,从原始文本数据出发,一步步完成数据处理、特征提取,最终得到可用于模型训练的词向量。
项目背景
随着电商、社交媒体的蓬勃发展,用户评价、评论等文本数据急剧增加。通过对这些文本进行情感分析,企业可以了解用户对产品的满意度,及时改进产品和服务;研究者可以挖掘公众舆论趋势等。本次我们使用好评和差评数据,通过代码实现从数据预处理到词向量转化的全过程,为后续的情感分类模型奠定基础。
代码实现步骤
所需库导入
在开始之前,我们需要导入一些必要的 Python 库,它们将帮助我们完成数据读取、分词、特征提取等操作:
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
import pandas as pd
import jieba
其中,pandas用于数据处理和分析,jieba是优秀的中文分词工具,sklearn库中的TfidfVectorizer用于将文本转化为 TF-IDF 特征向量,LogisticRegression则可用于后续的分类模型构建(本次代码中主要是为了展示,未进行模型训练和预测)。
读取原始数据
我们的原始数据分为好评和差评两类,分别存储在 “好评.txt” 和 “差评.txt” 文件中。使用pandas的read_table函数可以方便地读取这些文本数据:
# 读取原始数据
good_content = pd.read_table(r'D:\pythonProject11\class\词向量转化\好评.txt', encoding='gbk')
bad_content = pd.read_table(r'D:\pythonProject11\class\词向量转化\差评.txt', encoding='gbk')
这里需要注意文件的路径和编码方式,确保数据能够正确读取。如果读取时出现编码错误,可以尝试更换不同的编码方式,如 “utf-8” 等。
分词处理
中文文本与英文文本不同,词语之间没有明显的分隔符,所以在进行文本分析之前,需要先进行分词处理。jieba库提供了便捷的中文分词功能,我们可以利用它对好评和差评内容进行分词:
# 分词处理
bad_segments = []
bad_contents = bad_content.content.values.tolist()
for i in bad_contents:
bad_segment = jieba.lcut(i)
if len(i) > 1:
bad_segments.append(bad_segment)
good_segments = []
good_contents = good_content.content.values.tolist()
for j in good_contents:
good_segment = jieba.lcut(str(j))
if len(j) > 1:
good_segments.append(good_segment)
在上述代码中,我们先将数据集中的内容转化为列表形式,然后遍历每个文本,使用jieba.lcut函数进行分词。同时,我们过滤掉了长度小于等于 1 的文本,避免一些无意义的短文本对后续分析造成干扰。
去除停用词
在分词之后,文本中会存在一些诸如 “的”“是”“在” 等没有实际意义的词语,这些词语被称为停用词。去除停用词可以减少特征维度,提高模型的效率和准确性。我们首先读取停用词表,然后定义一个去除停用词的函数,并应用到分词后的文本中:
stop = pd.read_csv(r"D:\pythonProject11\class\红楼梦\StopwordsCN.txt",
encoding='utf-8', header=None, sep='\n', engine='python')
stopwords = set(stop[0].tolist()) # set将数据转换为集合便于快速查找
def drop_stopwords(contents, stopwords):
segments_clean = []
for content in contents:
line_clean = []
for word in content:
if word in stopwords:
continue
line_clean.append(word)
segments_clean.append(line_clean)
return segments_clean
# 应用去停用词函数
bad_segments_clean = drop_stopwords(bad_segments, stopwords)
good_segments_clean = drop_stopwords(good_segments, stopwords)
将停用词存储在集合中,可以利用集合查找速度快的特性,提高去除停用词的效率。
创建标签数据集
为了便于后续的模型训练,我们需要为好评和差评数据添加标签,通常将好评标记为 1,差评标记为 0。然后将处理后的好评和差评数据合并成一个完整的数据集:
# 创建标签数据集
bad_df = pd.DataFrame({
'label': [0] * len(bad_segments_clean),
'cut': [' '.join(seg) for seg in bad_segments_clean]
})
good_df = pd.DataFrame({
'label': [1] * len(good_segments_clean),
'cut': [' '.join(seg) for seg in good_segments_clean]
})
# 合并数据集
data = pd.concat([good_df, bad_df], axis=0)
在上述代码中,我们将分词并去除停用词后的词语用空格连接起来,形成新的文本特征 “cut”,与标签 “label” 一起组成数据框。使用pd.concat函数可以将两个数据框按行合并。
TF-IDF 向量化
文本数据是一种非结构化数据,无法直接用于机器学习模型的训练,需要将其转化为结构化的数值特征。TF-IDF(词频 - 逆文档频率)是一种常用的文本特征提取方法,它能够反映一个词语在文本集中的重要程度。我们使用TfidfVectorizer将处理后的文本转化为 TF-IDF 特征向量:
# TF-IDF向量化
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(data['cut'])
y = data['label']
fit_transform方法既可以训练模型,也可以将文本数据转化为特征矩阵。其中,X是转化后的 TF-IDF 特征矩阵,y是对应的标签。
保存处理后的数据
为了方便后续的分析和使用,我们将处理后的好评数据、差评数据以及 TF-IDF 特征向量数据保存为 Excel 文件:
# 保存处理后的数据
bad_fc_results = pd.DataFrame({'content': bad_segments_clean})
bad_fc_results.to_excel('bad_content.xlsx', index=False)
good_frame = pd.DataFrame({'content': good_segments_clean})
good_frame.to_excel('good_content.xlsx', index=False)
# 保存词向量转化结果
vector_df = pd.DataFrame(X.toarray(), columns=vectorizer.get_feature_names_out())
vector_df['label'] = y
vector_df.to_excel('tfidf_vectors.xlsx', index=False)
通过to_excel函数可以将数据框保存为 Excel 文件,index=False表示不保存索引列。
总代码
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.linear_model import LogisticRegression
import pandas as pd
import jieba
# 读取原始数据
good_content = pd.read_table(r'D:\pythonProject11\class\词向量转化\好评.txt', encoding='gbk')
bad_content = pd.read_table(r'D:\pythonProject11\class\词向量转化\差评.txt', encoding='gbk')
# 分词处理
bad_segments = []
bad_contents = bad_content.content.values.tolist()
for i in bad_contents:
bad_segment = jieba.lcut(i)
if len(i) > 1:
bad_segments.append(bad_segment)
good_segments = []
good_contents = good_content.content.values.tolist()
for j in good_contents:
good_segment = jieba.lcut(str(j))
if len(j) > 1:
good_segments.append(good_segment)
stop = pd.read_csv(r"D:\pythonProject11\class\红楼梦\StopwordsCN.txt",
encoding='utf-8', header=None, sep='\n', engine='python')
stopwords = set(stop[0].tolist()) #set将数据转换为集合便于快速查找
def drop_stopwords(contents, stopwords):
segments_clean = []
for content in contents:
line_clean = []
for word in content:
if word in stopwords:
continue
line_clean.append(word)
segments_clean.append(line_clean)
return segments_clean
# 应用去停用词函数
bad_segments_clean = drop_stopwords(bad_segments, stopwords)
good_segments_clean = drop_stopwords(good_segments, stopwords)
# 创建标签数据集
bad_df = pd.DataFrame({
'label': [0] * len(bad_segments_clean),
'cut': [' '.join(seg) for seg in bad_segments_clean]
})
good_df = pd.DataFrame({
'label': [1] * len(good_segments_clean),
'cut': [' '.join(seg) for seg in good_segments_clean]
})
# 合并数据集
data = pd.concat([good_df, bad_df], axis=0)
# TF-IDF向量化
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(data['cut'])
y = data['label']
# 保存处理后的数据
bad_fc_results = pd.DataFrame({'content': bad_segments_clean})
bad_fc_results.to_excel('bad_content.xlsx', index=False)
good_frame = pd.DataFrame({'content': good_segments_clean})
good_frame.to_excel('good_content.xlsx', index=False)
# 保存词向量转化结果
vector_df = pd.DataFrame(X.toarray(), columns=vectorizer.get_feature_names_out())
vector_df['label'] = y
vector_df.to_excel('tfidf_vectors.xlsx', index=False)
项目意义
通过本次代码实现,我们完成了从原始文本数据到结构化词向量的转化过程。这为后续的情感分类模型训练提供了高质量的输入数据,使得机器学习模型能够更好地学习文本中的情感特征,从而实现对未知文本情感倾向的准确预测。
无论是在商业决策、用户需求分析还是社会舆情监测等领域,这样的文本情感分析流程都具有重要的应用价值。它能够帮助我们从海量的文本数据中快速挖掘有价值的信息,为决策提供数据支持。
总结
本文详细介绍了使用 Python 进行文本情感分析的完整流程,包括数据读取、分词处理、去除停用词、创建标签数据集、TF-IDF 向量化以及结果保存等步骤。通过这些步骤,我们将原始的文本数据转化为可用于机器学习模型的特征向量。
在实际应用中,我们还可以根据具体需求对代码进行优化和扩展,例如尝试不同的分词工具、调整停用词表、使用其他特征提取方法(如词袋模型、Word2Vec 等),以及选择更合适的分类算法来提高情感分析的准确性。希望本文能够为大家开展文本情感分析相关工作提供一些帮助和启发。
1748

被折叠的 条评论
为什么被折叠?



