基于fastText的基础中文情感极性分析
目录
- fastText基础原理简介
- 任务介绍
- python代码实现过程
- 缺点分析
1.fastText基本原理简述
fastText是Facebook开发的一款快速文本分类器,提供简单而高效的文本分类和表征学习的方法,性能比肩深度学习而且速度更快。
fastText 方法包含三部分:模型架构、层次 Softmax 和 N-gram 特征。
模型架构:fastText 模型输入一个词的序列(一段文本或者一句话),输出这个词序列属于不同类别的概率。序列中的词和词组组成特征向量,特征向量通过线性变换映射到中间层,中间层再映射到标签。fastText 在预测标签时使用了非线性激活函数,但在中间层不使用非线性激活函数。
层次softmax:在某些文本分类任务中类别很多,计算线性分类器的复杂度高。为了改善运行时间,fastText 模型使用了层次 Softmax 技巧。层次 Softmax 技巧建立在哈夫曼编码的基础上,对标签进行编码,能够极大地缩小模型预测目标的数量。
N-gram 特征:fastText 可以用于文本分类和句子分类。不管是文本分类还是句子分类,我们常用的特征是词袋模型。但词袋模型不能考虑词之间的顺序,因此 fastText 还加入了 N-gram 特征。
2.任务介绍
收集京东购物评论,并主观给每条京东评论赋值,0代表消极评论,1代表积极评论,如商品很赞赋值1、商品有瑕疵赋值0,然后将数据带入fasttext模型训练,用于预测新的评论的情感极性。
3.python代码实现过程
3.1准备数据
数据来源:
https://github.com/cgq666/Chinese-text-sentiment-classification-dataset
其中有4000+条京东购物评论。
数据格式:
“1/0”,“评论”
其中,1代表好评,0代表差评
但是fastText要求输入的数据需要有个标签前缀__label__YOURLABEL,所以我们要对数据进行预处理,像上面的评论要转换为:
__label__1 电脑 用 着 很 流畅
3.2数据处理
from pathlib import Path import re import random reviews_data = Path(r" fasttext_dataset.txt") training_data = Path(r" fasttext_dataset_training.txt") test_data = Path(r" fasttext_dataset_test.txt") # What percent of data to save separately as test data percent_test_data = 0.10 with reviews_data.open(encoding='UTF-8') as input, \ training_data.open("w",encoding='UTF-8') as train_output, \ test_data.open("w",encoding='UTF-8') as test_output: for line in input: rating = re.compile('"(.*?)"').findall(line)[0] text = re.compile('"(.*?)"').findall(line)[1] fasttext_line = "__label__{} {}".format(rating, text) if random.random() <= percent_test_data: test_output.write(fasttext_line + "\n") else: train_output.write(fasttext_line + "\n")
3.3数据训练与测试
考虑上下文之间的联系,我们可以用参数wordNgrams来进行模拟,把N个单词捆绑在一起进行训练.考虑到时间成本,我们取wordNgrams=2,训练模型的同时,我们通过测试数据进行计算模型的精确率与召回率。
import fasttext model = fasttext.train_supervised(input=r" fasttext_dataset_training.txt", lr=1.0, epoch=25, wordNgrams=2) model.save_model("model_reviews.bin") def print_results(N, p, r): print("样本数N\t" + str(N)) print("精确率P@{}\t{:.3f}".format(1, p)) print("召回率R@{}\t{:.3f}".format(1, r)) print_results(*model.test(r" fasttext_dataset_test.txt"))
精确率在90%以上,模型的可靠性得到了验证。
3.4运用模型预测和GUI编程
import tkinter as tk import fasttext # 设置窗口 window = tk.Tk() window.title('基于京东评论的中文情感分析') window.geometry('500x300') # 设置输入窗口 e = tk.Entry() e.pack(ipady = 20 ) # 该函数的功能是在光标处插入字符串 def analysis(): model = fasttext.load_model("model_reviews.bin") sent = e.get() test = model.predict(sent) if test[0] == ('__label__1',): t.insert('insert', ' positive\n') else: t.insert('insert', ' passive\n') b = tk.Button(text='极性分析', width=20, height=2, command=analysis) b.pack(ipady = 20 ) # 设置文本显示框 t = tk.Text(width=20, height=5) t.pack() widget1 = tk.Label(text = '可靠性:\n样本数N 508\n精确率P@1 0.904\n召回率R@1 0.904') widget1.pack(side = 'left') window.mainloop()
3.5程序打包
运用pyinstaller把程序打包成exe文件,方便操作。
4.缺点分析
用于训练的数据类型单一、参数设置不一定最优是此次模型可以考虑的改进方向。