文本分类--普通分类
1 基本概念
文本分類
文本分類(text classification),指的是將一個(gè)文檔歸類到一個(gè)或多個(gè)類別的自然語(yǔ)言處理任務(wù)。文本分類的應(yīng)用場(chǎng)景非常廣泛,包括垃圾郵件過(guò)濾、自動(dòng)打標(biāo)等任何需要自動(dòng)歸檔文本的場(chǎng)合。
文本分類在機(jī)器學(xué)習(xí)中屬于監(jiān)督學(xué)習(xí),其流程是:人工標(biāo)注文檔類別、利用語(yǔ)料訓(xùn)練模型、利用模型訓(xùn)練文檔的類別。
2 問(wèn)題
總結(jié)文本分類的一般流程;
3 解決思路
3.1 文本的特征提取
特征選擇是特征工程中的重要一環(huán),其主要目的是從所有特征中選出相關(guān)特征 (relevant feature),或者說(shuō)在不引起重要信息丟失的前提下去除掉無(wú)關(guān)特征 (irrelevant feature) 和冗余特征 (redundant feature)。進(jìn)行特征選擇的好處主要有以下幾種:
在向量空間模型中,表示文本的特征項(xiàng)可以選擇文字、詞、短語(yǔ)、甚至“概念”等多種元素,目前常用的特征提取方法有:基于文檔頻率的特征提取法、信息增益法、 χ2
統(tǒng)計(jì)量法、互信息法等。
3.2 卡方特征選擇
在文本分類時(shí)會(huì)有這樣一個(gè)問(wèn)題,比如漢語(yǔ)中的虛詞“的”,這些詞在所有類別的文檔中均勻出現(xiàn),為了消除這些單詞的影響,一方面可以用停用詞表,另一方面可以用卡方非參數(shù)檢驗(yàn)來(lái)過(guò)濾掉與類別相關(guān)程度不高的詞語(yǔ)。
在統(tǒng)計(jì)學(xué)上,卡方檢驗(yàn)常用于檢驗(yàn)兩個(gè)事件的獨(dú)立性,如果兩個(gè)隨機(jī)事件 A 和 B 相互獨(dú)立,則兩者同時(shí)發(fā)生的概率P(AB)= P(A)P(B)。如果將詞語(yǔ)的出現(xiàn)與類別的出現(xiàn)作為兩個(gè)隨機(jī)事件則類別獨(dú)立性越高的詞語(yǔ)越不適合作為特征。如果將某個(gè)事件的期望記作 E,實(shí)際出現(xiàn)(觀測(cè))的頻次記作 N,則卡方檢驗(yàn)衡量期望與觀測(cè)的相似程度。卡方檢驗(yàn)值越高,則期望和觀測(cè)的計(jì)數(shù)越相化也更大程度地否定了獨(dú)立性。
具體細(xì)節(jié)可參考宗成慶《統(tǒng)計(jì)自然語(yǔ)言處理》第二版13.3.3 χ2\chi^2χ2t統(tǒng)計(jì)量
3.3 分類器的選擇和訓(xùn)練
理論上講,在文本特征抽取之后,就進(jìn)入了常規(guī)機(jī)器學(xué)習(xí)分類模型的框架,但作為文本分類也有其特殊性,主要有以下幾點(diǎn):
所以在分類模型選擇上主要考慮以下幾點(diǎn):
基于上面兩個(gè)方面的考慮,文本分類的模型通常使用樸素貝葉斯、svm兩個(gè)模型。
關(guān)于Naive Bayes、svm數(shù)學(xué)細(xì)節(jié)參考《統(tǒng)計(jì)學(xué)習(xí)方法》;
3.4 非常規(guī)方法
文本分類不一定需要分詞,根據(jù)清華大學(xué)2016年的工作THUCTC:An Efficient Chinese Text Classifier,將文中相鄰兩個(gè)字符構(gòu)成的所有二元語(yǔ)法作為“詞”,反而可以取得更好的分類準(zhǔn)確率;
4 實(shí)現(xiàn)
4.1 準(zhǔn)備文本分類語(yǔ)料庫(kù)
數(shù)據(jù)的目錄結(jié)構(gòu)如下:
搜狗門(mén)戶數(shù)據(jù)(汽車(chē)(1000個(gè)txt文檔)、教育(1000個(gè)txt文檔)、健康(1000個(gè)txt文檔)、軍事(1000個(gè)txt文檔)、體育(1000個(gè)txt文檔))
運(yùn)行結(jié)果:
標(biāo)注集:[教育, 汽車(chē), 健康, 軍事, 體育] 第一篇文檔的類別:教育4.2 準(zhǔn)備分詞器
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 準(zhǔn)備訓(xùn)練集
FileDataSet = JClass('com.hankcs.hanlp.classification.corpus.FileDataSet') training_corpus = FileDataSet().setTokenizer(tokenizer).load(corpus_path, "UTF-8", 0.9)4.4 卡方特征選擇
這個(gè)方法和相應(yīng)的參數(shù)都被隱藏的模型中,用戶只需知道分詞后需要進(jìn)行卡方特征選擇。
4.5 準(zhǔn)備分類器
NaiveBayesClassifier = JClass('com.hankcs.hanlp.classification.classifiers.NaiveBayesClassifier') LinearSVMClassifier = JClass('com.hankcs.hanlp.classification.classifiers.LinearSVMClassifier') model_class = LinearSVMClassifier4.6 訓(xùn)練模型
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íng)測(cè)訓(xùn)練效果
精細(xì)評(píng)測(cè):對(duì)于每個(gè)分類都有一套P、R、F1P、R、F_1P、R、F1?;
整體評(píng)測(cè):衡量模型在所有類目上的整體性能,則可以利用這些指標(biāo)在文檔顆粒度進(jìn)行微平均,具體如下:
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??
下面實(shí)現(xiàn)采用后一種方式:
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)運(yùn)行結(jié)果:
LinearSVMClassifier+BigramTokenizerP R F1 A 93.27 97.00 95.10 98.00 教育98.02 99.00 98.51 99.40 汽車(chē)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} ? {中文分詞、二元語(yǔ)法}
中文文本分類的確不需要分詞,不分詞直接用元語(yǔ)法反而能夠取得更高的準(zhǔn)確率。只不過(guò)由于二元語(yǔ)法數(shù)量比單詞多,導(dǎo)致參與運(yùn)算的特征更多,相應(yīng)的分類速度減半。
線性支持向量機(jī)的分類準(zhǔn)確率更高,而且分類速度更快,推薦使用。
5 參考文獻(xiàn)
6 需要解決的問(wèn)題
總結(jié)
以上是生活随笔為你收集整理的文本分类--普通分类的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python3 json文件_Pytho
- 下一篇: 堆排序时间复杂度的计算过程