本文是对中文商品评论的二分类的简单实现,主要功能是判别评论信息的好坏(即判断是好评还是差评),调用了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%,效果一般。这里可以优化的地方有很多,在分词、词性加权等地方应该都有优化空间。