文本分类(六):使用fastText对文本进行分类--小插曲
http://blog.csdn.net/lxg0807/article/details/52960072
环境说明:python2.7、linux
自己打自己脸,目前官方的包只能在linux,mac环境下使用。误导大家了,对不起。
测试facebook开源的基于深度学习的对文本分类的fastText模型
fasttext python包的安装:
pip install fasttext
- 1
第一步获取分类文本,文本直接用的清华大学的新闻分本,可在文本系列的第三篇找到下载地址。
输出数据格式: 样本 + 样本标签
说明:这一步不是必须的,可以直接从第二步开始,第二步提供了处理好的文本格式。写这一步主要是为了记忆当时是怎么处理原始文本的。
import jieba
import os
basedir = "/home/li/corpus/news/" #这是我的文件地址,需跟据文件夹位置进行更改
dir_list = ['affairs','constellation','economic','edu','ent','fashion','game','home','house','lottery','science','sports','stock']
##生成fastext的训练和测试数据集
ftrain = open("news_fasttext_train.txt","w")
ftest = open("news_fasttext_test.txt","w")
num = -1
for e in dir_list:
num += 1
indir = basedir + e + '/'
files = os.listdir(indir)
count = 0
for fileName in files:
count += 1
filepath = indir + fileName
with open(filepath,'r') as fr:
text = fr.read()
text = text.decode("utf-8").encode("utf-8")
seg_text = jieba.cut(text.replace("\t"," ").replace("\n"," "))
outline = " ".join(seg_text)
outline = outline.encode("utf-8") + "\t__label__" + e + "\n"
# print outline
# break
if count < 10000:
ftrain.write(outline)
ftrain.flush()
continue
elif count < 20000:
ftest.write(outline)
ftest.flush()
continue
else:
break
ftrain.close()
ftest.close()
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
第二步:利用fasttext进行分类。使用的是fasttext的python包。
整理好的数据:百度网盘下载
news_fasttext_train.txt
news_fasttext_test.txt
# _*_coding:utf-8 _*_
import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
import fasttext
#训练模型
classifier = fasttext.supervised("news_fasttext_train.txt","news_fasttext.model",label_prefix="__label__")
#load训练好的模型
#classifier = fasttext.load_model('news_fasttext.model.bin', label_prefix='__label__')
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
#测试模型
result = classifier.test("news_fasttext_test.txt")
print result.precision
print result.recall
- 1
- 2
- 3
- 4
- 5
0.92240420242
0.92240420242
- 1
- 2
- 3
由于fasttext貌似只提供全部结果的p值和r值,想要统计不同分类的结果,就需要自己写代码来实现了。
# -*- coding: utf-8 -*-
"""
Created on Wed Oct 18 14:17:27 2017
@author: xiaoguangli
"""
import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
import fasttext
classifier = fasttext.load_model('news_fasttext.model.bin', label_prefix='__label__')
labels_right = []
texts = []
with open("news_fasttext_test.txt") as fr:
for line in fr:
line = line.decode("utf-8").rstrip()
labels_right.append(line.split("\t")[1].replace("__label__",""))
texts.append(line.split("\t")[0])
# print labels
# print texts
# break
labels_predict = [e[0] for e in classifier.predict(texts)] #预测输出结果为二维形式
# print labels_predict
text_labels = list(set(labels_right))
text_predict_labels = list(set(labels_predict))
print text_predict_labels
print text_labels
A = dict.fromkeys(text_labels,0) #预测正确的各个类的数目
B = dict.fromkeys(text_labels,0) #测试数据集中各个类的数目
C = dict.fromkeys(text_predict_labels,0) #预测结果中各个类的数目
for i in range(0,len(labels_right)):
B[labels_right[i]] += 1
C[labels_predict[i]] += 1
if labels_right[i] == labels_predict[i]:
A[labels_right[i]] += 1
print A
print B
print C
#计算准确率,召回率,F值
for key in B:
try:
r = float(A[key]) / float(B[key])
p = float(A[key]) / float(C[key])
f = p * r * 2 / (p + r)
print "%s:\t p:%f\t r:%f\t f:%f" % (key,p,r,f)
except:
print "error:", key, "right:", A.get(key,0), "real:", B.get(key,0), "predict:",C.get(key,0)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
实验数据分类
[u'affairs', u'fashion', u'lottery', u'house', u'science', u'sports', u'game', u'economic', u'ent', u'edu', u'home', u'constellation', u'stock']
['affairs', 'fashion', 'house', 'sports', 'game', 'economic', 'ent', 'edu', 'home', 'stock', 'science']
{'science': 8415, 'affairs': 8257, 'fashion': 3173, 'house': 9491, 'sports': 9739, 'game': 9506, 'economic': 9235, 'ent': 9665, 'edu': 9491, 'home': 9315, 'stock': 9015}
{'science': 10000, 'affairs': 10000, 'fashion': 3369, 'house': 10000, 'sports': 10000, 'game': 10000, 'economic': 10000, 'ent': 10000, 'edu': 10000, 'home': 10000, 'stock': 10000}
{u'affairs': 8562, u'fashion': 3585, u'lottery': 96, u'science': 9088, u'edu': 10068, u'sports': 10099, u'game': 10151, u'economic': 10131, u'ent': 10798, u'house': 10000, u'home': 10103, u'constellation': 432, u'stock': 10256}
- 1
- 2
- 3
- 4
- 5
- 6
#实验结果
science: p:0.841500 r:0.925946r: f:0.881706
affairs: p:0.825700 r:0.964377r: f:0.889667
fashion: p:0.941822 r:0.885077r: f:0.912568
house: p:0.949100 r:0.949100r: f:0.949100
sports: p:0.973900 r:0.964353r: f:0.969103
game: p:0.950600 r:0.936459r: f:0.943477
economic: p:0.923500 r:0.911559r: f:0.917490
ent: p:0.966500 r:0.895073r: f:0.929416
edu: p:0.949100 r:0.942690r: f:0.945884
home: p:0.931500 r:0.922003r: f:0.926727
stock: p:0.901500 r:0.878998r: f:0.890107
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
从结果上,看出fasttext的分类效果还是不错的,没有进行对fasttext的调参,结果都基本在90以上,不过在预测的时候,不知道怎么多出了一个分类constellation。难道。。。。查找原因中。。。。
2016/11/7更正:从集合B中可以看出训练集的标签中是没有lottery和constellation的数据的,说明在数据准备的时候,每类选取10000篇,导致在测试数据集中lottery和constellation不存在数据了。因此在第一步准备数据的时候可以根据lottery和constellation类的数据进行训练集和测试集的大小划分,或者简单粗暴点,这两类没有达到我们的数量要求,可以直接删除掉
文本分类(六):使用fastText对文本进行分类--小插曲的更多相关文章
- 文本分类学习(六) AdaBoost和SVM
直接从特征提取,跳到了BoostSVM,是因为自己一直在写程序,分析垃圾文本,和思考文本分类用于识别垃圾文本的短处.自己学习文本分类就是为了识别垃圾文本. 中间的博客待自己研究透彻后再补上吧. 因为获 ...
- 文本分类学习 (五) 机器学习SVM的前奏-特征提取(卡方检验续集)
前言: 上一篇比较详细的介绍了卡方检验和卡方分布.这篇我们就实际操刀,找到一些训练集,正所谓纸上得来终觉浅,绝知此事要躬行.然而我在躬行的时候,发现了卡方检验对于文本分类来说应该把公式再变形一般,那样 ...
- 文本分类学习 (七)支持向量机SVM 的前奏 结构风险最小化和VC维度理论
前言: 经历过文本的特征提取,使用LibSvm工具包进行了测试,Svm算法的效果还是很好的.于是开始逐一的去了解SVM的原理. SVM 是在建立在结构风险最小化和VC维理论的基础上.所以这篇只介绍关于 ...
- 文本分类学习 (十)构造机器学习Libsvm 的C# wrapper(调用c/c++动态链接库)
前言: 对于SVM的了解,看前辈写的博客加上读论文对于SVM的皮毛知识总算有点了解,比如线性分类器,和求凸二次规划中用到的高等数学知识.然而SVM最核心的地方应该在于核函数和求关于α函数的极值的方法: ...
- 使用libsvm实现文本分类
@Hcy(黄灿奕) 文本分类,首先它是分类问题,应该对应着分类过程的两个重要的步骤,一个是使用训练数据集训练分类器,另一个就是使用测试数据集来评价分类器的分类精度.然而,作为文本分类,它还具有文本这样 ...
- 文本分类实战(十)—— BERT 预训练模型
1 大纲概述 文本分类这个系列将会有十篇左右,包括基于word2vec预训练的文本分类,与及基于最新的预训练模型(ELMo,BERT等)的文本分类.总共有以下系列: word2vec预训练词向量 te ...
- 使用PyTorch建立你的第一个文本分类模型
概述 学习如何使用PyTorch执行文本分类 理解解决文本分类时所涉及的要点 学习使用包填充(Pack Padding)特性 介绍 我总是使用最先进的架构来在一些比赛提交模型结果.得益于PyTorch ...
- 文本分类:Keras+RNN vs传统机器学习
摘要:本文通过Keras实现了一个RNN文本分类学习的案例,并详细介绍了循环神经网络原理知识及与机器学习对比. 本文分享自华为云社区<基于Keras+RNN的文本分类vs基于传统机器学习的文本分 ...
- fastText、TextCNN、TextRNN……这里有一套NLP文本分类深度学习方法库供你选择
https://mp.weixin.qq.com/s/_xILvfEMx3URcB-5C8vfTw 这个库的目的是探索用深度学习进行NLP文本分类的方法. 它具有文本分类的各种基准模型,还支持多标签分 ...
随机推荐
- 【转载】VC IME 通信
文本输入框作为一个最基本的UI控件,被众多UI框架默认支持.Windows下最简单的就是CEdit(WTL封装),也有更为复杂的CRichEdit(WTL封装).文本输入框是基本控件中最难实现的控件之 ...
- 使用httpclient需要的maven依赖
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore --> <dependency& ...
- ConcurrentHashMap内存溢出问题
写在前面 上周,同事写了一段ConcurrentHashMap的测试代码,说往map里放了32个元素就内存溢出了,我大致看了一下他的代码及运行的jvm参数,觉得很奇怪,于是就自己捣鼓了一下.首先上一段 ...
- Java调用OCR进行图片识别
使用Java语言,通过Tesseract-OCR对图片进行识别. 1.Tesseract-OCR 下载windows版本并安装. 2.程序如下: a.ImageIOHelper类 package OC ...
- 三星打印机SCX-4824HN全套驱动(打印/扫描)
链接: https://pan.baidu.com/s/1EUXsti4niHlYcMHMJqqnXA 密码: r91a
- x270
https://thinkpad.lenovo.com.cn/product/93964.html
- java学习:JMM(java memory model)、volatile、synchronized、AtomicXXX理解
一.JMM(java memory model)内存模型 从网上淘来二张图: 上面这张图说的是,在多核CPU的系统中,每个核CPU自带高速缓存,然后计算机主板上也有一块内存-称为主内(即:内存条).工 ...
- 使用Puppeteer进行数据抓取(一)——安装和使用
Puppeteer是 Google Chrome 团队官方的Chrome 自动化工具.它本身是基于Chrome Dev Protocol协议实现的,但它提供了更高层次API封装,使用起来更加方便快捷. ...
- ARM LDR/STR, LDM/STM 指令
这里比较下容易混淆的四条指令,已经在这4条指令的混淆上花费了很多精力,现在做个小结,LDR,STR,LDM,STM这四条指令, 关于LDM和STM的说明,见另外一个说明文件,说明了这两个文件用于栈操作 ...
- The .NET weak event pattern in C#
Introduction As you may know event handlers are a common source of memory leaks caused by the persis ...