基于fastText的基础中文情感极性分析

目录

  1. fastText基础原理简介
  2. 任务介绍
  3. python代码实现过程
  4. 缺点分析

1.fastText基本原理简述

   fastTextFacebook开发的一款快速文本分类器,提供简单而高效的文本分类和表征学习的方法,性能比肩深度学习而且速度更快。

   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.缺点分析

  用于训练的数据类型单一、参数设置不一定最优是此次模型可以考虑的改进方向。

 

posted @ 2022-04-25 10:37  嗯嗯魑嗯嗯  阅读(355)  评论(0编辑  收藏  举报