文本分类(六):使用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类的数据进行训练集和测试集的大小划分,或者简单粗暴点,这两类没有达到我们的数量要求,可以直接删除掉

时间: 2024-10-09 04:44:18

文本分类(六):使用fastText对文本进行分类--小插曲的相关文章

文本分类,数据挖掘和机器学习

转自:http://blog.chinaunix.net/uid-446337-id-94440.html 分类: 机器学习的有概率分类器(probabilistic) ,贝叶斯推理网络(bayesian inference networks) , 决策树分类器(decision tree) ,决策规则分类器(decision rule) ,基于回归的线性最小二乘llsf(regression based on linearleast squares fit ) , 符号规则归纳法( symbo

使用libsvm实现文本分类

文本分类,首先它是分类问题,应该对应着分类过程的两个重要的步骤,一个是使用训练数据集训练分类器,另一个就是使用测试数据集来评价分类器的分类精度.然而,作为文本分类,它还具有文本这样的约束,所以对于文本来说,需要额外的处理过程,我们结合使用libsvm从宏观上总结一下,基于libsvm实现文本分类实现的基本过程,如下所示: 选择文本训练数据集和测试数据集:训练集和测试集都是类标签已知的: 训练集文本预处理:这里主要包括分词.去停用词.建立词袋模型(倒排表): 选择文本分类使用的特征向量(词向量):

文本分类学习 (七)支持向量机SVM 的前奏 结构风险最小化和VC维度理论

前言: 经历过文本的特征提取,使用LibSvm工具包进行了测试,Svm算法的效果还是很好的.于是开始逐一的去了解SVM的原理. SVM 是在建立在结构风险最小化和VC维理论的基础上.所以这篇只介绍关于SVM的理论基础. 目录: 文本分类学习(一)开篇 文本分类学习(二)文本表示 文本分类学习(三)特征权重(TF/IDF)和特征提取        文本分类学习(四)特征选择之卡方检验 文本分类学习(五)机器学习SVM的前奏-特征提取(卡方检验续集) 文本分类学习(六)AdaBoost和SVM(残)

中文文本分类大概的步骤

文本分类问题:给定文档p(可能含有标题t),将文档分类为n个类别中的一个或多个 文本分类应用:常见的有垃圾邮件识别,情感分析 文本分类方向:主要有二分类,多分类,多标签分类 文本分类方法:传统机器学习方法(贝叶斯,svm等),深度学习方法(fastText,TextCNN等) 文本分类的处理大致分为文本预处理.文本特征提取.分类模型构建等.和英文文本处理分类相比,中文文本的预处理是关键技术. 一.中文分词:针对中文文本分类时,很关键的一个技术就是中文分词.特征粒度为词粒度远远好于字粒度,其大部分

【搜索引擎(四)】文本分类

Q1. 为什么搜索引擎要用到文本分类? 搜索引擎要处理海量文本,人工分类不现实,机器的自动分类对提高文本的分类效率至少起到了一个基准的效果.另外,文本分类跟搜索引擎系统可以进行信息互通,文本分类的输入是文本,输出可以是标签或者是否从属于某个分类. Q2.文本分类基础算法 文本分类基础算法与机器学习.人工智能.数据挖掘中用到的算法都是联系紧密的,它从属的自然语言处理也正是人工智能的分支.你可能会想到文本分类肯定要用到基础的分类器,而且在更复杂的情况下可能还要用到人工智能的一些学习方法,比如双向LS

文本分类需要CNN?No!fastText完美解决你的需求(后篇)

http://blog.csdn.net/weixin_36604953/article/details/78324834 想必通过前一篇的介绍,各位小主已经对word2vec以及CBOW和Skip-gram有了比较清晰的了解.在这一篇中,小编带大家走进业内最新潮的文本分类算法,也就是fastText分类器.fastText与word2vec的提出者之所以会想到用fastText取代CNN(卷积神经网络)等深度学习模型,目的是为了在大数据情况下提高运算速度. 其实,文本的学习与图像的学习是不同的

带监督的文本分类算法FastText

该算法由facebook在2016年开源,典型应用场景是"带监督的文本分类问题". 模型 模型的优化目标如下: 其中,$<x_n,y_n>$是一条训练样本,$y_n$是训练目标,$x_n$是normalized bag of features.矩阵参数A是基于word的look-up table,也就是A是词的embedding向量.$Ax_n$矩阵运算的数学意义是将word的embedding向量找到后相加或者取平均,得到hidden向量.矩阵参数B是函数f的参数,函数f

文本分类需要CNN?No!fastText完美解决你的需求(前篇)

http://blog.csdn.net/weixin_36604953/article/details/78195462?locationNum=8&fps=1 文本分类需要CNN?No!fastText完美解决你的需求(前篇) fastText是个啥?简单一点说,就是一种可以得到和深度学习结果准确率相同,但是速度快出几个世纪的文本分类算法.这个算法类似与CBOW,可爱的读着是不是要问CBOW又是个什么鬼?莫急,听小编给你慢慢到来,一篇文章,让你了解word2vec的原理,CBOW.Skip-

step by step带你fastText文本分类

本文参考原文-http://bjbsair.com/2020-03-25/tech-info/6300/ **写在前面 ** 今天的教程是基于FAIR的Bag of Tricks for Efficient Text Classification[1].也就是我们常说的fastText. 最让人欣喜的这篇论文配套提供了fasttext工具包.这个工具包代码质量非常高,论文结果一键还原,目前已经是包装地非常专业了,这是fastText官网和其github代码库,以及提供了python接口,可以直接