分享

自然语言处理 | FastText:快速的文本分类器

 kieojk 2017-04-27

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

 

       fastText结合了自然语言处理和机器学习中最成功的理念。这些包括了使用词袋以及n-gram袋表征语句,还有使用子字(subword)信息,并通过隐藏表征在类别间共享信息。我们另外采用了一个softmax层级(利用了类别不均衡分布的优势)来加速运算过程。

      这些不同概念被用于两个不同任务:有效文本分类和学习词向量表征。举例来说:fastText能够学会“男孩”、“女孩”、“男人”、“女人”指代的是特定的性别,并且能够将这些数值存在相关文档中。然后,当某个程序在提出一个用户请求(假设是“我女友现在在儿?”),它能够马上在fastText生成的文档中进行查找并且理解用户想要问的是有关女性的问题。

 

     在文本处理领域中深度神经网络近来大受欢迎,但是它们训练以及测试过程十分缓慢,这也限制了它们在大数据集上的应用。

fastText能够解决这个问题,其实现过程如下所示:

对于有大量类别的数据集,fastText使用了一个分层分类器(而非扁平式架构)。不同的类别被整合进树形结构中(想象下二叉树而非 list)。


     考虑到线性以及多种类别的对数模型,这大大减少了训练复杂性和测试文本分类器的时间。fastText 也利用了类别(class)不均衡这个事实(一些类别出现次数比其他的更多),通过使用 Huffman 算法建立用于表征类别的树形结构。因此,频繁出现类别的树形结构的深度要比不频繁出现类别的树形结构的深度要小,这也使得进一步的计算效率更高。

       fastText 另外使用了一个低维度向量来对文本进行表征,通过总结对应文本中出现的词向量进行获得。在 fastText 中一个低维度向量与每个单词都相关。隐藏表征在不同类别所有分类器中进行共享,使得文本信息在不同类别中能够共同使用。这类表征被称为词袋(bag of words)。在fastText中也使用向量表征单词 n-gram来将局部词序考虑在内,这对很多文本分类问题来说十分重要。

     实验表明 fastText 在准确率上与深度学习分类器具有同等水平,特别是在训练和评估速率上要高出几个数量级。使用 fastText能够将训练时间从几天降至几秒,并且在许多标准问题上实现当下最好的表现(例如文本倾向性分析或标签预测)。

 

     文本分类对于商业界来说非常重要。垃圾邮件或钓鱼邮件过滤器可能就是最典型的例子。现在已经有了能为一般分类问题(例如 Vowpal Wabbit libSVM)设计模型的工具,但是 fastText 专注于文本分类。这使得在特别大型的数据集上,它能够被快速训练。我们使用一个标准多核 CPU,得到了在10分钟内训练完超过10亿词汇量模型的结果。此外, fastText还能在五分钟内将50万个句子分成超过30万个类别。


实例解析

1. 数据我们用清华大学的新闻文本,到这里下载http://thuctc./message

下载好后,我们用jieba分词处理好


import jieba

 

# 将目录名,写入列表中

dir_list = ['affairs', 'constellation','economic', 'edu', 'ent', 'fashion', 'game', 'home', 'house', 'lottery','science', 'sports', 'stock']

 

file_train = open('news_fasttext_train.txt','w')

file_test = open('news_fasttext_test.txt', 'w')

 

for label in dir_list:

count = 0

for file in os.listdir(label):   # 用户需要根据自己情况将路径补全

count += 1

    withopen(label+’/’+file, 'r') as f:

       text = f.read()

    seg_text= jieba.cut(text.replace('\t','').replace('\n',' '))

    #词与词之间用空格分开,词语标签默认用__label__分隔

   res = ' '.join(seg_text).encode('utf-8') +'\t__label__' + label + '\n'

if count <>

        file_train.write(res)

       continue

   elif count <>

       file_test.write(res)

       continue

    else:

       break

file_train.close()

file_test.close()

 

2. 利用pythonfasttext包进行分类。


import fasttext

#训练模型

classifier = fasttext.supervised('news_fasttext_train.txt','news_fasttext.model',label_prefix='__label__')


# 也可以导入训练好的模型

# classifier =fasttext.load_model('news_fasttext.model.bin', label_prefix='__label__')

#测试模型

result =classifier.test('news_fasttext_test.txt')

print result.precision

print result.recall

 

# 用模型预测类别

texts = ['example very long text 1','example very longtext 2']

labels = classifier.predict(texts)

print labels


# 预测类别并输出概率

labels = classifier.predict_proba(texts)

print labels

 

更多用法查看文档:https://pypi./pypi/fasttext/

 

 

 

参考文章:

[1] http://www.oschina.net/news/76286/facebook-fasttex

[2] http://blog.csdn.net/thriving_fcl/article/details/53239856?locationNum=15&fps=1

[3] http://blog.csdn.net/lxg0807/article/details/52960072

[4] http://mini.eastday.com/a/160820092722986.html

 

 


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多