文本分类--普通分类
1 基本概念
文本分類
文本分類(text classification),指的是將一個文檔歸類到一個或多個類別的自然語言處理任務。文本分類的應用場景非常廣泛,包括垃圾郵件過濾、自動打標等任何需要自動歸檔文本的場合。
文本分類在機器學習中屬于監督學習,其流程是:人工標注文檔類別、利用語料訓練模型、利用模型訓練文檔的類別。
2 問題
總結文本分類的一般流程;
3 解決思路
3.1 文本的特征提取
特征選擇是特征工程中的重要一環,其主要目的是從所有特征中選出相關特征 (relevant feature),或者說在不引起重要信息丟失的前提下去除掉無關特征 (irrelevant feature) 和冗余特征 (redundant feature)。進行特征選擇的好處主要有以下幾種:
在向量空間模型中,表示文本的特征項可以選擇文字、詞、短語、甚至“概念”等多種元素,目前常用的特征提取方法有:基于文檔頻率的特征提取法、信息增益法、 χ2
統計量法、互信息法等。
3.2 卡方特征選擇
在文本分類時會有這樣一個問題,比如漢語中的虛詞“的”,這些詞在所有類別的文檔中均勻出現,為了消除這些單詞的影響,一方面可以用停用詞表,另一方面可以用卡方非參數檢驗來過濾掉與類別相關程度不高的詞語。
在統計學上,卡方檢驗常用于檢驗兩個事件的獨立性,如果兩個隨機事件 A 和 B 相互獨立,則兩者同時發生的概率P(AB)= P(A)P(B)。如果將詞語的出現與類別的出現作為兩個隨機事件則類別獨立性越高的詞語越不適合作為特征。如果將某個事件的期望記作 E,實際出現(觀測)的頻次記作 N,則卡方檢驗衡量期望與觀測的相似程度。卡方檢驗值越高,則期望和觀測的計數越相化也更大程度地否定了獨立性。
具體細節可參考宗成慶《統計自然語言處理》第二版13.3.3 χ2\chi^2χ2t統計量
3.3 分類器的選擇和訓練
理論上講,在文本特征抽取之后,就進入了常規機器學習分類模型的框架,但作為文本分類也有其特殊性,主要有以下幾點:
所以在分類模型選擇上主要考慮以下幾點:
基于上面兩個方面的考慮,文本分類的模型通常使用樸素貝葉斯、svm兩個模型。
關于Naive Bayes、svm數學細節參考《統計學習方法》;
3.4 非常規方法
文本分類不一定需要分詞,根據清華大學2016年的工作THUCTC:An Efficient Chinese Text Classifier,將文中相鄰兩個字符構成的所有二元語法作為“詞”,反而可以取得更好的分類準確率;
4 實現
4.1 準備文本分類語料庫
數據的目錄結構如下:
搜狗門戶數據(汽車(1000個txt文檔)、教育(1000個txt文檔)、健康(1000個txt文檔)、軍事(1000個txt文檔)、體育(1000個txt文檔))
運行結果:
標注集:[教育, 汽車, 健康, 軍事, 體育] 第一篇文檔的類別:教育4.2 準備分詞器
BigramTokenizer = JClass('com.hankcs.hanlp.classification.tokenizers.BigramTokenizer') HanLPTokenizer = JClass('com.hankcs.hanlp.classification.tokenizers.HanLPTokenizer') BlankTokenizer = JClass('com.hankcs.hanlp.classification.tokenizers.BlankTokenizer') tokenizer = BigramTokenizer()4.3 準備訓練集
FileDataSet = JClass('com.hankcs.hanlp.classification.corpus.FileDataSet') training_corpus = FileDataSet().setTokenizer(tokenizer).load(corpus_path, "UTF-8", 0.9)4.4 卡方特征選擇
這個方法和相應的參數都被隱藏的模型中,用戶只需知道分詞后需要進行卡方特征選擇。
4.5 準備分類器
NaiveBayesClassifier = JClass('com.hankcs.hanlp.classification.classifiers.NaiveBayesClassifier') LinearSVMClassifier = JClass('com.hankcs.hanlp.classification.classifiers.LinearSVMClassifier') model_class = LinearSVMClassifier4.6 訓練模型
IOUtil = SafeJClass('com.hankcs.hanlp.corpus.io.IOUtil') model_path = r'/Users/kitty/anaconda3/envs/nlp/lib/python3.6/site-packages/pyhanlp/static/data/test/' def train_or_load_classifier(model_class, model_path, training_corpus):classifier = model_class()model_path += classifier.getClass().getSimpleName() + '.ser'if os.path.isfile(model_path):print(model_path)return model_class(IOUtil.readObjectFrom(model_path))classifier.train(training_corpus)model = classifier.getModel()IOUtil.saveObjectTo(model, model_path)return model_class(model)classifier = train_or_load_classifier(model_class, model_path, training_corpus)4.7 評測訓練效果
精細評測:對于每個分類都有一套P、R、F1P、R、F_1P、R、F1?;
整體評測:衡量模型在所有類目上的整體性能,則可以利用這些指標在文檔顆粒度進行微平均,具體如下:
P ̄=∑ci∈CTP∑ci∈CTP+∑ci∈CFPP ̄=∑ci∈CTP∑ci∈CTP+∑ci∈CFNF1 ̄=2×P ̄×R ̄P ̄+R ̄\begin{aligned} \overline{P} &= \frac{\sum_{c_i \in C}TP}{\sum_{c_i \in C}TP + \sum_{c_i \in C}FP} \\ \overline{P} &= \frac{\sum_{c_i \in C}TP}{\sum_{c_i \in C}TP + \sum_{c_i \in C}FN} \\ \overline{F_1} &= \frac{2 \times \overline{P} \times \overline{R}}{\overline{P} + \overline{R}} \end{aligned} PPF1???=∑ci?∈C?TP+∑ci?∈C?FP∑ci?∈C?TP?=∑ci?∈C?TP+∑ci?∈C?FN∑ci?∈C?TP?=P+R2×P×R??
下面實現采用后一種方式:
Evaluator = JClass('com.hankcs.hanlp.classification.statistics.evaluations.Evaluator')def evaluate(classifier, corpus_path, tokenizer):testing_corpus = MemoryDataSet(classifier.getModel()).load(corpus_path, "UTF-8", -0.1)result = Evaluator.evaluate(classifier, testing_corpus)print(classifier.getClass().getSimpleName() + "+" + tokenizer.getClass().getSimpleName())print(result)evaluate(classifier, corpus_path, tokenizer)運行結果:
LinearSVMClassifier+BigramTokenizerP R F1 A 93.27 97.00 95.10 98.00 教育98.02 99.00 98.51 99.40 汽車98.97 96.00 97.46 99.00 健康98.00 98.00 98.00 99.20 軍事 100.00 98.00 98.99 99.60 體育97.65 97.60 97.63 97.60 avg. data size = 500, speed = 7936.51 doc/s4.8 {NB, SVM} ? {中文分詞、二元語法}
中文文本分類的確不需要分詞,不分詞直接用元語法反而能夠取得更高的準確率。只不過由于二元語法數量比單詞多,導致參與運算的特征更多,相應的分類速度減半。
線性支持向量機的分類準確率更高,而且分類速度更快,推薦使用。
5 參考文獻
6 需要解決的問題
總結
以上是生活随笔為你收集整理的文本分类--普通分类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python3 json文件_Pytho
- 下一篇: php 掌握jquery,完全掌握jqu