NLP之词嵌入---(2.2)FastText:文本分类

目录

一、关于fasttext下载和安装

1.存在问题

 2.下载安装步骤

 二、数据获取和处理

1.fasttext要求数据格式

2.数据格式处理

三、训练fasttext模型

1.训练模型

2.训练结果

3.模型调优

1)增加训练轮数:epoch

2)调整学习率:lr

3)增加n-gram特征:wordNgrams

4)修改损失计算方式:loss

5)自动超参数调优:autotuneValidationFile

4.模型保存与重加载

1)模型保存

2)模型重用

3)多标签多分类问题


一、关于fasttext下载和安装

1.存在问题

1) 从gensim中导入fasttext 怎么引用都没有train_supervised()接口

AttributeError: type object 'FastText' has no attribute 'train_supervised'

查半天也没有查到 是不是gensim封装的fasttext只有训练词向量模块,没有文本分类模块

解决:自行下载fasttext包

2)若直接pip install 会报错:error: Microsoft Visual C++ 14.0 or greater is required.

原因: fastText 使用了 c++11 的特征,所以如果要使用 fastText 需要一个支持 c++11 的编译器

解决方案:fasttext安装 - 知乎 (zhihu.com)

 2.下载安装步骤

1)官网下载对应版本:Archived: Python Extension Packages for Windows - Christoph Gohlke (uci.edu)

例:我的python是3.8 就下载给对应版本(一般都是64位) 

2)下载路径:对应的python环境下 

例:我需要在我创建的虚拟环境中安装该包 我就把它存在该路径:

 3)在该路径下pip刚刚下载的whl文件,后面记得改成刚刚下载的文件名

(xuni1) D:\python_venv\xuni1\Scripts>pip install fasttext-0.9.2-cp38-cp38-win_amd64.whl

 4)安装成功

 二、数据获取和处理

1.fasttext要求数据格式

格式:__label__类名,text...

__label__1 , georgia south ossetia negotiate details truce forged despite reports village attack
__label__2 , avoiding late trouble knocked contenders track vijay singh held one stroke lead justin leonard heading final round championship
__label__4 , google ipo bidding opens google ipo bidding officially open google underwriters expect open auction shares google rsquo class common stock 00 est press time friday august 13 2004 google bidders must obtained bidder id ipo google com ...
2.数据格式处理

参考:NLP实战之Fasttext中文文本分类_使用fasttext进行中文文本分类-CSDN博客

1)本实验继续使用AG新闻数据集,其中包含四个类别的新闻:

        World、Sports、Business、Sci/Tec

2)该数据集包含三列了内容:label、title、text(本实验只取label和text两列

3)按照fasttext格式处理

4)保存数据

import fasttext
import csv
import nltk
import jieba

"""----------------一、处理文本-----------------------"""
"""---------1.读文件:仅提取label和text----------------"""
agnews_train = csv.reader(open("./dataset/train.csv",'r'))
agnews_label = []
agnews_text = []

for line in agnews_train:
    agnews_label.append(line[0])
    agnews_text.append(line[2].lower())

"""---------------------2.数据预处理------------------"""
stoplist = nltk.corpus.stopwords.words('english')
sentences =[]

def preprocess_text(agnews_text, sentences, agnews_label):
    segs=jieba.lcut(agnews_text)
    # 去标点、停用词等
    segs = list(filter(lambda x:len(x)>1, segs))
    segs = list(filter(lambda x:x not in stoplist, segs))
    # 将句子处理成  __label__1 词语 词语 词语 ……的形式
    sentences.append("__label__"+str(agnews_label)+" , "+" ".join(segs))

for i in range(len(agnews_text)):
    preprocess_text(agnews_text[i], sentences, agnews_label[i])


"""---------------------3.数据保存------------------"""
print("Writing data to fasttext format...")
out = open('./dataset/train_data.txt', 'w', encoding='utf-8')
for sentence in sentences:
    out.write(sentence+"\n")
print("WELL DONE!")

处理前:

处理后:

三、训练fasttext模型

1.训练模型

使用有监督的方式进行训练

news_model = fasttext.train_supervised(input='./dataset/train_data.txt')

参数:

  • input: 训练数据文件路径
  • lr: 学习率
  • dim: 向量维度
  • ws: cbow模型时使用
  • epoch: 次数
  • minCount: 词频阈值, 小于该值在初始化时会过滤掉
  • minCountLabel: 类别阈值,类别小于该值初始化时会过滤掉
  • neg: 负采样
  • wordNgrams: n-gram个数
  • loss: 损失函数类型, softmax, ns: 负采样, hs: 分层softmax
2.训练结果

Read 2M words
Number of words:  61911
Number of labels: 5
Progress: 100.0% words/sec/thread: 1686806 lr:  0.000000 avg.loss:  0.253772 ETA:   0h 0m 0s

  • Progress: 训练进度, 因为我们这里显示的是最后的训练完成信息, 所以进度是100%
  • words/sec/thread: 每个线程每秒处理的平均词汇数
  • lr: 当前的学习率, 因为训练完成所以学习率是0
  • avg.loss: 训练过程的平均损失 
  • ETA: 预计剩余训练时间, 因为已训练完成所以是0

1)测试: "With an eye on the Paris Olympics, China is sending 886 athletes to the upcoming Asian Games, targeting a medal-laden campaign in Hangzhou to boost its prospects next year."

pred1 = news_model.predict("With an eye on the Paris Olympics, China is 
sending 886 athletes to the upcoming Asian Games, targeting a medal-laden 
campaign in Hangzhou to boost its prospects next year.")
print(pred1)

(('__label__4',), array([0.55746382]))

分析:明显该新闻是属于SPORT类,但是模型分类结果为4(SCI/TEC)---结果错误

2)在测试集上测试

ps:对原始数据测试集"test.csv"也进行了格式处理-->得到”test_data.txt“

print(news_model.test('./dataset/test_data.txt'))

(7601, 0.9050124983554796, 0.9050124983554796)        #测试数据行 准确率  召回率

3.模型调优
1)增加训练轮数:epoch
news_model = fasttext.train_supervised(input='./dataset/train_data.txt',epoch=25)

结果:

Read 2M words
Number of words:  61911
Number of labels: 5
Progress: 100.0% words/sec/thread: 1722290 lr:  0.000000 avg.loss:  0.132675 ETA:   0h 0m 0s
(('__label__4',), array([0.76675224]))
(7601, 0.8896197868701486, 0.8896197868701486)

句子预测依旧是label4:SCI/TEC ---依旧是错误的

整体:精确率还稍有下降,召回率耶稍有下降

2)调整学习率:lr

默认的学习率大小是0.1,调整为1.0

增大学习率意味着增大了梯度下降的步长使其在有限的迭代步骤下更接近最优点

news_model = fasttext.train_supervised(input='./dataset/train_data.txt',
epoch=25,lr=1.0)

Read 2M words
Number of words:  61911
Number of labels: 5
Progress: 100.0% words/sec/thread: 1655079 lr:  0.000000 avg.loss:  0.151264 ETA:   0h 0m 0s
(('__label__4',), array([0.85975349]))
(7601, 0.883436389948691, 0.883436389948691)

结果:好像越来越离谱了就是说。。。

3)增加n-gram特征:wordNgrams
news_model = fasttext.train_supervised(input='./dataset/train_data.txt',
epoch=25,lr=1.0,wordNgrams=2)

Read 2M words
Number of words:  61911
Number of labels: 5
Progress: 100.0% words/sec/thread:  967511 lr:  0.000000 avg.loss:  0.044271 ETA:   0h 0m 0s
(('__label__2',), array([0.4255034]))
(7601, 0.9131693198263386, 0.9131693198263386)

结果:句子分类预测准确了!!!终于是label_2:SPORTS

整体测试集结果 准确率和召回率也都上升了。

4)修改损失计算方式:loss
news_model = fasttext.train_supervised(input='./dataset/train_data.txt',
epoch=25,lr=1.0,wordNgrams=2,loss='hs')

Read 2M words
Number of words:  61911
Number of labels: 5
Progress: 100.0% words/sec/thread: 1029960 lr:  0.000000 avg.loss:  0.046345 ETA:   0h 0m 0s
(('__label__2',), array([0.5371415]))
(7601, 0.9054071832653598, 0.9054071832653598)

5)自动超参数调优:autotuneValidationFile
news_model= fasttext.train_supervised(input='./dataset/train_data.txt',
 autotuneValidationFile='./dataset/test_data.txt', autotuneDuration=600)
  •  使用fasttext的autotuneValidationFile参数进行自动超参数调优.
  • autotuneValidationFile:参数需要指定验证数据集所在路径, 它将在验证集上使用随机搜索方法寻找可能最优的超参数.
  • autotuneDuration:可以控制随机搜索的时间, 默认是300s

Progress: 100.0% Trials:   25 Best score:  0.915801 ETA:   0h 0m 0s
Training again with best arguments
Read 2M words
Number of words:  61911
Number of labels: 5
Progress: 100.0% words/sec/thread:  255385 lr:  0.000000 avg.loss:  0.041175 ETA:   0h 0m 0s
(('__label__4',), array([0.4139201]))  ---又错咯 玄学昂

4.模型保存与重加载
1)模型保存
model.save_model("./model_agnews.bin")
2)模型重用
 model = fasttext.load_model("./model_agnews.bin")

pred1 = model.predict('The death toll from the devastating earthquake in Morocco
 has risen to 2,901, and the injuries to 5,530, according to the latest statement
 released by the Moroccan government on Tuesday')

print(pred1)

(('__label__1',), array([0.91412246]))

这句话是在China Daily ”WORLD“板块摘的头条-->对应就是label_1 -->说明模型效果不错。

3)多标签多分类问题

尽可能多的输出预测类型:k=-1 

 阈值threshold=0.5   概率大于阈值才会输出

pred2 = model.predict('Mingsha Mountain and Yueya Spring attracted 5.31 
million tourists from home and abroad in the first eight months of this 
year, an increase of 26.95 percent compared with the same period in 2019, 
and a rise of 379.63 percent from a year earlier.',k=-1, threshold=0.5)

(('__label__3',), array([0.74411893])

这句话是在China Daily ”BUSINESS“板块摘的头条-->对应就是label_3 -->说明模型效果不错。 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值