日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

使用python語言編寫常見的文本分類算法

 qqcat5 2019-07-15

       自然語言處理中一個很常見的操作就是文本分類,比如一組新聞文本,通過分類模型,將新聞文本分為政治、體育、軍事、娛樂、財經(jīng)等等幾大類。那么分類第一步就是文本向量化,前一篇博客講了一些,本文可以說是前文的實踐版本。本文主要介紹一些常見的文本分類模型,說是介紹,其實主要以代碼和結果為主,并不會詳細的介紹每個算法的思想、原理、推導過程等,那樣的話,估計可以寫一個7、8篇的系列了,另外我也發(fā)現(xiàn)很多博客都是理論為主,代碼非常少,給人的感覺就是這件事我弄明白了,但具體如何干不知道,講的似乎很難、很神秘,沒有相應代碼,讓人望而生畏。所以本文還是偏工程一些,閱讀本文的同學希望已經(jīng)有了這些文本分類算法的理論基礎。先說說我用的數(shù)據(jù),約20萬短文本,包含8個大類,分別為:餐飲、交通、購物、娛樂、居家等,每個大類約25000條數(shù)據(jù),文本平均20個字左右,最短的文本僅有2個字。如下面所示:

__label__1    天貓 超市 慕滋 五谷 無 添加 糖 粗糧 雜糧 消化 餅干 g 代 早餐 糕點
__label__1    天貓 超市 滿 減 云南 紅 提 kg 提子 葡萄 新鮮 水果
__label__1    天貓 超市 原裝 進口 噓 噓 樂 成長 褲 紙尿褲 拉拉 褲 L19 片 Kg
__label__1    天貓 超市 衛(wèi)龍 小 面筋 g 零食 辣條 辣片 麻辣 素食 豆干 制品 大刀 肉
__label__1    天貓 超市 康師傅 礦物質(zhì) 水 ml 瓶 整箱 飲用水
__label__1    天貓 超市 紅牛 維生素 功能 飲料 整箱 裝 原味 型 ml 罐 箱
__label__1    天貓 超市 香楠 蛋羹 味 麻薯 夾心 麻 糬 糕點 休閑 零食 小吃 g
__label__1    天貓 超市 蒙牛 特侖蘇 醇 纖 牛奶 ml 盒 平衡 搭檔 平衡 好搭檔
__label__1    天貓 超市 味全 每日 C 純 果汁 胡蘿卜 果蔬汁 ml16 截單
__label__1    天貓 超市 金 菜地 豆干 五香 茶 干 g 豆腐干 特色 休閑 零食 豆制品
__label__1    天貓 超市 新 希望 牛奶 香蕉 牛奶 ml 盒 箱 甜蜜 好 滋味
__label__1    天貓 超市 良品 鋪子 爆漿 麻薯 抹 茶味 g 糕點 點心 零食 特產(chǎn) 小吃
__label__1    天貓 超市 森永 嗨 酸酸 噠 酸果 軟糖 青 檸味 g 維 c 水果 糖果 零食
__label__1    天貓 超市 桂格 即食 純 燕麥片 粗糧 原味 沖 飲 谷物 早餐 g 袋裝
__label__1    天貓 超市 滿 減 挪威 冰凍 青花魚 柳 g 包 冷凍 海鮮 魚肉 鯖 魚
__label__1    天貓 超市 甘 竹牌 豆豉 鯪魚 罐頭 g 盒 下 飯菜 特產(chǎn) 小吃 休閑 食品
__label__1    天貓 超市 姚 太太 青口 梅 g 蜜餞 果脯 話梅 肉 梅子 青梅 酸甜 涼果
__label__1    天貓 超市 蒙牛 特侖蘇 醇 纖 牛奶 ml 盒 平衡 搭檔 平衡 好搭檔
       很多文本內(nèi)容都是淘寶體,也就是商品標題,當然上面僅僅是個示例。我這里已經(jīng)分好詞,并且為了方便后面使用fastText分類模型,已經(jīng)按照fastText格式做了排版,也就是第一項__label__1是標簽, 后面是文本正文,這個訓練集需要人工標記好,這是一件費時費力的事情。下面是不同分類模型代碼,因為加了注釋,所以這里就不一一解釋了。
  1. import random
  2. import fasttext
  3. import numpy as np
  4. import tensorflow as tf
  5. from sklearn.svm import SVC
  6. from sklearn.naive_bayes import MultinomialNB
  7. from sklearn.neighbors import KNeighborsClassifier
  8. from sklearn.ensemble import GradientBoostingClassifier
  9. from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer
  10. # 樸素貝葉斯算法
  11. def nb_model(train, train_label, test, test_label):
  12. clf_model = MultinomialNB(alpha=0.01)
  13. clf_model.fit(train, train_label)
  14. predict_results = clf_model.predict(test)
  15. count = 0
  16. predict_list = predict_results.tolist()
  17. for i, pred in enumerate(predict_list):
  18. if (pred == test_label[i]):
  19. count += 1
  20. print("nb_model_precision_score: " + str(float(count) / len(predict_list)))
  21. # K近鄰算法
  22. def knn_model(train, train_label, test, test_label):
  23. knn_model = KNeighborsClassifier(n_neighbors=8)
  24. knn_model.fit(train, train_label)
  25. predict_results = knn_model.predict(test)
  26. count = 0
  27. predict_list = predict_results.tolist()
  28. for i, pred in enumerate(predict_list):
  29. if (pred == test_label[i]):
  30. count += 1
  31. print("knn_model_precision_score: " + str(float(count) / len(predict_list)))
  32. # 支持向量機算法
  33. def svm_model(train, train_label, test, test_label):
  34. svm_clf = SVC(kernel="linear", verbose=False)
  35. svm_clf.fit(train, train_label)
  36. predict_results = svm_clf.predict(test)
  37. count = 0
  38. predict_list = predict_results.tolist()
  39. for i, pred in enumerate(predict_list):
  40. if (pred == test_label[i]):
  41. count += 1
  42. print("svm_model_precision_score: " + str(float(count) / len(predict_list)))
  43. # 使用傳統(tǒng)方法的文本分類
  44. def text_classification():
  45. count = 0
  46. test_text_list = []
  47. train_text_list = []
  48. test_label_list = []
  49. train_label_list = []
  50. total_text_list = []
  51. total_label_list = []
  52. print("start loading data...")
  53. finput = open("data/filter_total_half.txt", encoding='utf-8')
  54. for line in finput:
  55. count += 1
  56. text_array = line.split("\t", 1)
  57. if (len(text_array) != 2):
  58. continue
  59. # 保存全部樣本
  60. total_text_list.append(text_array[1])
  61. total_label_list.append(text_array[0])
  62. # 劃分訓練集和測試集
  63. probability = random.random()
  64. if (probability > 0.2):
  65. train_text_list.append(text_array[1])
  66. train_label_list.append(text_array[0])
  67. else:
  68. test_text_list.append(text_array[1])
  69. test_label_list.append(text_array[0])
  70. finput.close()
  71. print("load data is finished...")
  72. print("start building vector model...")
  73. # 構建詞典
  74. vec_total = CountVectorizer()
  75. vec_total.fit_transform(total_text_list)
  76. # 基于構建的詞典分別統(tǒng)計訓練集/測試集詞頻, 即每個詞出現(xiàn)1次、2次、3次等
  77. vec_train = CountVectorizer(vocabulary=vec_total.vocabulary_)
  78. tf_train = vec_train.fit_transform(train_text_list)
  79. vec_test = CountVectorizer(vocabulary=vec_total.vocabulary_)
  80. tf_test = vec_test.fit_transform(test_text_list)
  81. # 進一步計算詞頻-逆文檔頻率
  82. tfidftransformer = TfidfTransformer()
  83. tfidf_train = tfidftransformer.fit(tf_train).transform(tf_train)
  84. tfidf_test = tfidftransformer.fit(tf_test).transform(tf_test)
  85. print("building vector model is finished...")
  86. # 樸素貝葉斯算法
  87. nb_model(tfidf_train, train_label_list, tfidf_test, test_label_list)
  88. # K近鄰算法
  89. knn_model(tfidf_train, train_label_list, tfidf_test, test_label_list)
  90. # 支持向量機算法
  91. svm_model(tfidf_train, train_label_list, tfidf_test, test_label_list)
  92. print("building predict model is finished...")
  93. # 使用fastText的文本分類
  94. def fastText_model():
  95. foutput_test = open("data/data_test.txt", 'w', encoding='utf-8')
  96. foutput_train = open("data/data_train.txt", 'w', encoding='utf-8')
  97. with open("data/filter_total_half.txt", encoding='utf-8') as finput:
  98. for line in finput:
  99. probability = random.random()
  100. if (probability > 0.2):
  101. foutput_train.write(line.strip() + "\n")
  102. else:
  103. foutput_test.write(line.strip() + "\n")
  104. foutput_train.flush()
  105. foutput_train.close()
  106. foutput_test.flush()
  107. foutput_test.close()
  108. classifier = fasttext.supervised("data/data_train.txt", "data/cooking_fasttext_bkk.model",
  109. label_prefix="__label__", lr=0.25, dim=100,
  110. silent=False, epoch=25, word_ngrams=3, loss="hs", bucket=2000000)
  111. result = classifier.test("data/data_test.txt")
  112. print(result.precision)
  113. if __name__ == '__main__':
  114. print("\n傳統(tǒng)方法文本分類...")
  115. text_classification()
  116. print("\n----------------------------------------------\n")
  117. print("FastText文本分類...")
  118. fastText_model()

       程序運行結果如下:


       我還寫了一個基于卷積神經(jīng)網(wǎng)絡的版本,修改自github,由于公司也有在用,這里就不把代碼貼出來了??傮w看,cnn的準確度最高,fastText次之。不過基于cnn的方法,需要事先訓練詞向量,訓練過程也比較慢。而傳統(tǒng)方法,如svm,準確度達0.95,已經(jīng)很高了,從這一點也說明,不管是基于深度學習的卷積神經(jīng)網(wǎng)絡分類方法,還是傳統(tǒng)的分類方法,其實模型反而是其次,最重要的是數(shù)據(jù)集的質(zhì)量,模型選擇和模型調(diào)參,對最終精度提升都是小幅度的,而數(shù)據(jù)集的質(zhì)量高低則是精度提升的瓶頸,有時真得不怕麻煩,整理出一份高質(zhì)量的數(shù)據(jù)集,才能訓練出精度更準、召回更高的模型??吹竭@里,是不是很多同學覺得文本分類其實沒什么神秘的,有現(xiàn)成的訓練框架使用,如:sklearn,還有那么多文獻資料可供查閱,唯獨沒有適合自己業(yè)務的訓練集,整理訓練集,這可能是整個模型訓練過程中最花時間的事情了。當然,這里面也涉及很多模型調(diào)參細節(jié),需要深入算法原理才能真正玩轉(zhuǎn)。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多