zoukankan      html  css  js  c++  java
  • fasttext的基本使用 java 、python为例子

    fasttext的基本使用 java 、python为例子

    今天早上在地铁上看到知乎上看到有人使用fasttext进行文本分类,到公司试了下情况在GitHub上找了下,最开始是c++版本的实现,不过有JavaPython版本的实现了,正好拿下来试试手,

    python情况:

    python版本参考,作者提供了详细的实现,并且提供了中文分词之后的数据,正好拿下来用用,感谢作者,代码提供的数据作者都提供了,点后链接在上面有百度盘,可下载,java接口用到的数据也一样:

    [html] view plain copy
     
    1. http://blog.csdn.net/lxg0807/article/details/52960072  

    [python] view plain copy
     
    1. import logging  
    2. import fasttext  
    3. logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)  
    4. #classifier = fasttext.supervised("fasttext/news_fasttext_train.txt","fasttext/news_fasttext.model",label_prefix="__label__")  
    5. #load训练好的模型  
    6. classifier = fasttext.load_model('fasttext/news_fasttext.model.bin', label_prefix='__label__')  
    7. result = classifier.test("fasttext/news_fasttext_test.txt")  
    8. print(result.precision)  
    9. print(result.recall)  
    10. labels_right = []  
    11. texts = []  
    12. with open("fasttext/news_fasttext_test.txt") as fr:  
    13.     lines = fr.readlines()  
    14. for line in lines:  
    15.     labels_right.append(line.split(" ")[1].rstrip().replace("__label__",""))  
    16.     texts.append(line.split(" ")[0])  
    17. #     print labels  
    18. #     print texts  
    19. #     break  
    20. labels_predict = [e[0] for e in classifier.predict(texts)] #预测输出结果为二维形式  
    21. # print labels_predict  
    22. text_labels = list(set(labels_right))  
    23. text_predict_labels = list(set(labels_predict))  
    24. print(text_predict_labels)  
    25. print(text_labels)  
    26. A = dict.fromkeys(text_labels,0)  #预测正确的各个类的数目  
    27. B = dict.fromkeys(text_labels,0)   #测试数据集中各个类的数目  
    28. C = dict.fromkeys(text_predict_labels,0) #预测结果中各个类的数目  
    29. for i in range(0,len(labels_right)):  
    30.     B[labels_right[i]] += 1  
    31.     C[labels_predict[i]] += 1  
    32.     if labels_right[i] == labels_predict[i]:  
    33.         A[labels_right[i]] += 1  
    34. print(A )  
    35. print(B)  
    36. print( C)  
    37. #计算准确率,召回率,F值  
    38. for key in B:  
    39.     p = float(A[key]) / float(B[key])  
    40.     r = float(A[key]) / float(C[key])  
    41.     f = p * r * 2 / (p + r)  
    42.     print ("%s: p:%f %fr: %f" % (key,p,r,f))  

    java版本情况:

    githup上下载地址:
    [html] view plain copy
     
    1. https://github.com/ivanhk/fastText_java  


    看了下sh脚本的使用方法,自己简单些了个text的方法,正好用用,后面会拿xgboost进行对比,看看效果,效果可以的写成service进行上线:
    [java] view plain copy
     
    1. package test;  
    2. import java.util.List;  
    3.   
    4. import fasttext.FastText;  
    5. import fasttext.Main;  
    6. import fasttext.Pair;  
    7.   
    8. public class Test {  
    9.     public static void main(String[] args) throws Exception {  
    10.   
    11.         String[] text = {  
    12.                 "supervised",  
    13.                 "-input",  
    14.                 "/Users/shuubiasahi/Documents/python/fasttext/news_fasttext_train.txt",  
    15.                 "-output", "/Users/shuubiasahi/Documents/faste.model", "-dim",  
    16.                 "10", "-lr", "0.1", "-wordNgrams", "2", "-minCount", "1",  
    17.                 "-bucket", "10000000", "-epoch", "5", "-thread", "4" };  
    18.         Main op = new Main();  
    19.         op.train(text);  
    20.         FastText fasttext = new FastText();  
    21.         String[] test = { "就读", "科技", "学生" ,"学生","学生"};  
    22.         fasttext.loadModel("/Users/shuubiasahi/Documents/faste.model.bin");  
    23.         List<Pair<Float, String>> list = fasttext.predict(test, 6);  //得到最大可能的六个预测概率  
    24.         for (Pair<Float, String> parir : list) {  
    25.             System.out.println("key is:" + parir.getKey() + "   value is:"  
    26.                     + parir.getValue());  
    27.         }  
    28.         System.out.println(Math.exp(list.get(0).getKey()));  //得到最大预测概率  
    29.   
    30.     }  
    31.   
    32. }  


    这里设置bucket不适用设置过大,过大会产生OOM,而且模型保存太大,上面的设置模型保存就有1个g,-wordNgrams可以设置为2比设置为1能提高模型分类的准确性,
     
    结果情况:

    key is:0.0   value is:__label__edu

    key is:-17.75125   value is:__label__affairs

    key is:-17.75125   value is:__label__economic

    key is:-17.75125   value is:__label__ent

    key is:-17.75125   value is:__label__fashion

    key is:-17.75125   value is:__label__game

    1.0


    注意fasttext对输入格式有要求,label标签使用  “__label__”+实际标签的形式,   over

    有问题联系我

    2016年5月26   我的模型已经上线了    效果还不错   

  • 相关阅读:
    Sagit.Framework For IOS 自动布局教程:14、UIScrollView 特殊用法
    Sagit.Framework For IOS 自动布局教程:13、UIImage、UIImageView 图片压缩、(长按)保存、缩放、(列表)放大浏览、生成验证码。
    Sagit.Framework For IOS 自动布局教程:12、UIButton、UILabel、UITextField、UITextView 特殊用法介绍
    Sagit.Framework For IOS 自动布局教程:10、获取px的宽高坐标、元素移动、刷新布局、自适应大小、聊天消息背景图片拉伸。
    Sagit.Framework For IOS 自动布局教程:11、常用宏定义:frame坐标系、获取UI、UI取值、字体颜色、图片
    Sagit.Framework For IOS 自动布局教程:7、底部Tab栏
    Sagit.Framework For IOS 自动布局教程:8、UIView通用事件:点击、双击、长按、拖动、滑动。
    Sagit.Framework For IOS 自动布局教程:9、UI元素的类型转换as
    Sagit.Framework For IOS 自动布局教程:6、导航栏
    Sagit.Framework For IOS 自动布局教程:5、状态栏
  • 原文地址:https://www.cnblogs.com/timssd/p/7163332.html
Copyright © 2011-2022 走看看