用 Python 实现文本情感分析:从数据到词向量的完整流程

文本数据中蕴含着大量有价值的信息,而情感分析作为自然语言处理的重要应用,能帮助我们快速了解文本背后的情感倾向。本文将通过一段完整的 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 等),以及选择更合适的分类算法来提高情感分析的准确性。希望本文能够为大家开展文本情感分析相关工作提供一些帮助和启发。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值