对中文商品评论进行二分类(判别好评差评)

时间:2024-01-22 17:30:15

本文是对中文商品评论的二分类的简单实现,主要功能是判别评论信息的好坏(即判断是好评还是差评),调用了gensim和sklearn相关工具包。

数据集使用github上前辈们分享的商品评论数据集,数据集地址:https://github.com/SophonPlus/ChineseNlpCorpus/blob/master/datasets/online_shopping_10_cats/intro.ipynb

内容包含: 1.对原始数据集的预处理(去标点,分词); 2.转为doc2vec向量; 3.使用sklearn的logistic回归模块进行模型训练、分类预测,并计算预测准确率

主要步骤:

(1)提取评论信息

(2)提取评论中的有效信息(这里提取了评论中的所有中文字符)

(3)分词;将每个评论转换为一个分词列表,并合并为一个大列表

(4)训练doc2vec模型并保存

(5)使用训练好的doc2vec模型将所有分词列表转换为doc2vec向量

(6)将上一步的向量数据集分割为训练集和测试集

(7)训练logistic回归分类器

(8)在测试集上测试model的准确率

直接看代码:

import pandas as pd
import jieba
import re
import gensim
import logging
path ='/Users/admin/Documents/Dataset/' 
# 载入数据,csv文件一般是逗号分隔的数据集
data = pd.read_csv(path +'online_shopping_10_cats.csv') 
# 提取“水果类”的评论用作本次实验
data_fruit = data[data.cat == '水果']
# 中文字符提取函数,仅提取评论中的中文字符,忽略标点符号以及英文字母、单词等
def extractChinese(s):
    pattern="[\u4e00-\u9fa5]+"#中文正则表达式
    regex = re.compile(pattern) #生成正则对象 
    results = regex.findall(s) #匹配
    return "". join(results)
# 将原始评论(仅含中文字符)进行分词,最终获得一个corpus列表,列表中的每一项是每个评论对应的分词列表
corpus = []
for rev in data_fruit.review:
    rev = extractChinese(rev)
    corpus.append(list(jieba.cut(rev)))
print(corpus[0])
# 训练并保存doc2vec模型
from gensim.test.utils import common_texts
from gensim.models.doc2vec import Doc2Vec, TaggedDocument

model_path = './fruit_review_d2v.model' #模型保存路径
documents = [TaggedDocument(doc, [i]) for i, doc in enumerate(corpus)] #为corpus数据集打标签
model = Doc2Vec(documents, vector_size=300, window=2, min_count=1, workers=4)
model.save(model_path)
model_d2v = Doc2Vec.load('./fruit_review_d2v.model')
# 使用训练好的模型将所有的review表示为向量,并从原始数据集中获取评论的标签
vectors = []
for review in corpus:
    vectors.append(model_d2v.infer_vector(review))
from sklearn.model_selection import train_test_split
x = vectors # 转化为向量后的数据集
y = list(data_fruit.label) #数据集的标签(好评1/差评0)
x_train,x_test,y_train,y_test = train_test_split(x,y,random_state=1) #将预处理后的数据集分割为训练集和测试集
#  建立和训练模型、使用模型并计算模型预测准确率
from sklearn.linear_model import LogisticRegression
import numpy as np
LRmodel = LogisticRegression() #建立logistic回归模型
LRmodel.fit(x_train,y_train) # 使用训练集训练模型
y_hat = LRmodel.predict(x_test) # 使用测试集进行类别预测
result = y_hat == y_test # 记录测试集中预测准确的数量
acc = np.mean(result) # 计算模型预测准确率
print(acc)

最终的预测结果准确率为74%,效果一般。这里可以优化的地方有很多,在分词、词性加权等地方应该都有优化空间。