實戰是學習一門技術最好的方式,也是深入了解一門技術唯一的方式。因此,NLP專欄計劃推出一個實戰專欄,讓有興趣的同學在看文章之餘也可以自己動手試一試。
本篇介紹自然語言處理中一種比較簡單,但是有效的文本分類手段:樸素貝葉斯模型。
作者 | 小Dream哥
編輯 | 言有三
貝葉斯決策論是在統計機率框架下進行分類決策的基本方法。對於分類任務來說,在所有相關機率都已知的情況下,貝葉斯決策論考慮如何基於這些機率和誤判損失來預測分類。
樸素貝葉斯模型在訓練過程,利用數據集D,計算P(c),P(x_i|c)。在預測時,輸入樣本,利用貝葉斯公式,計算n個類別的機率,最後輸出機率最大的那個類別,作為預測的類別。
樸素貝葉斯模型分類的理論相關知識,在以前的文章中有詳細的介紹,感興趣或者不清楚的朋友可以出門左轉,再看一下。
假如我們有語料集D,文本可分為(c_1,c_2,...,c_n)個類別,我們根據語料集D,計算每個類別出現的機率P(c_i),以及當文本類別為c_i時,詞x_i出現的機率P(x_i|c_i)。這樣一個由m個詞構成的文本(x_1,x_2,...,x_m)就可以根據上述公式預測出文本是各個類別的機率。
Natural Language Toolkit,NLTK是一個開源的項目,包含:Python模塊,數據集和教程,用於NLP的研究和開發,是一個不錯的python工具包。此次我們介紹用NLTK里的NaiveBayesClassifier模塊,來進行文本分類。
因為是文本分類任務,所以數據集是按類別分好的一系列文本,如下圖所示:
這裡因為只是展示,數據集比較簡單,只有3個類別。在一個類別內,每條數據之間用分號隔開。
數據讀取的代碼如下所示:
#1 進行數據讀取
def read_data(filename):
data = []
with open(filename, encoding='utf-8') as f:
for line in f:
(label, sentences) = line.split('\\t')
sentence_list = sentences.split(';')
data.extend([(sentence,label) for sentence in sentence_list if sentence])
# 最後返回的是一個列表,結構如下[('我要打車','get_a_taxi'),('明天天氣怎麼樣','get_weather')。。。]
return data
數據讀取過程的任務很簡單,就是從語料文件中將語料讀到內存中,組織成一個列表,列表中每一項組成為(data,label),如('明天天氣怎麼樣','get_weather')。
利用分詞後的詞性作為訓練數據特徵。最後喂給模型的數據是一個類似這樣的列表:
[({「t」:「明天」,「n」:「天氣」,「r」:「怎麼樣」 }, 'get_weather') ,... ]
#2.1 停用詞處理
def delte_stop_word(sentence):
for word in stop_word:
if word in sentence:
sentence.replace(word, '')
return sentence
#2 進行特徵選擇,這裡利用分詞後的詞性作為特徵
def get_word_features(sentence):
data = {}
sentence = delte_stop_word(sentence)
seg_list = pesg.cut(sentence)
for word, tag in seg_list:
data[tag] = word
return data
#3 構建訓練數據集
def get_features_sets(datafile):
feature_sets = []
for sentence, label in read_data(datafile):
feature = get_word_features(sentence)
feature_sets.append((feature, label))
return feature_sets
訓練及預測的過程很簡單,就是調用NLTK的NaiveBayesClassifier模塊,代碼如下:
#訓練模型
classifier = nltk.NaiveBayesClassifier.train(
get_features_sets('data.txt') )
#預測某一個文本的類別
predict_label = classifier.classify(get_word_features('請問明天的天氣怎麼樣?') )
print(predict_label) ## get_weather
#預測某一個文本為某一個類別的機率print(classifier.prob_classify(get_word_features('請問明天的天氣怎麼樣?')).prob(predict_label)) # 0.995154
我們展示一下預測的結果:
至此,介紹了如何利用NLTK的NaiveBayesClassifier模塊進行文本分類,代碼在我們有三AI的github可以下載:
https://github.com/longpeng2008/yousan.ai/tree/master/natural_language_processing
找到intention文件夾,執行python3 intent_recognition.py就可以運行了。
文本分類常常用於情感分析、意圖識別等NLP相關的任務中,是一個非常常見的任務,樸素貝葉斯本質上統計語料中對應類別中相關詞出現的頻率,並依此來預測測試文本。總的來說,它是一種非常便捷,效果可以接受的方法。
我們也會在知識星球討論其他文本分類方法,感興趣掃描下面的二維碼了解。
讀者們可以留言,或者加入我們的NLP群進行討論。感興趣的同學可以微信搜索jen104,備註"加入有三AI NLP群"。
下期預告:命名實體識別實踐