感知器模型
所謂感知器模型,可以視爲一個邏輯迴歸模型。
我們知道,一個分詞任務相當於一個序列標註問題。因此,分詞任務可以視爲機器學習問題中的——結構化預測問題。
序列標註可見:link
特徵提取
要進行機器學習,首先要對數據集進行特徵提取。在分詞問題上,通常通過一個特徵模板來提取特徵的。一般地,常用一個指示器函數(0/1標示函數)來進行特徵提取。
感知器實現
感知器使用迭代的方式訓練的。學過邏輯迴歸的同學們可能非常熟悉,每一次迭代,都更新模型的參數,以保證代價函數最小。
在自然語言處理中。往往將每一次迭代過後的參數都保存起來,即訓練過程中的模型。從而最終結果用投票或平均得出。
HanLP 實現
from pyhanlp import *
CWSTrainer = JClass('com.hankcs.hanlp.model.perceptron.CWSTrainer') #實例化一個感知器算法
corpus_path = r'E:\Anaconda3\Lib\site-packages\pyhanlp\static\data\test\icwb2-data\training\msr_training.utf8' #數據集所在路徑。可用txt文件
msr_model_path = r'D:\桌面\比賽\模型\model' #數據集所在路徑。可用txt文件
"""未進行壓縮處理的模型"""
model = CWSTrainer().train(corpus_path, corpus_path, msr_model_path, 0., 10, 8).getModel() # 訓練模型,其中0表示不進行壓縮
model.save(msr_model_path, model.featureMap.entrySet(), 0, True) # 最後一個參數指定導出txt
segment = PerceptronLexicalAnalyzer(model) #實例一個感知器分詞器
segment.enableCustomDictionary(False) #不集成用戶詞典
通過 segment.seg()接口,即可實現句子的分詞
集成用戶詞典
詳細內容可見:link
segment = PerceptronLexicalAnalyzer(model) #實例一個分詞器
segment.enableCustomDictionary(True) #不集成用戶詞典
CustomDictionary.insert("xx","nrf 1")
壓縮處理
由於指示器生成的特徵大多爲 0,也即特徵向量是一個稀疏向量,數據集是一個稀疏矩陣。因此,在保存特徵時,可以只保留那些值爲1的特徵的索引(位置),此時就可以大大減少存儲容量。
由於模型學習到的特徵其實是非常稀疏的,因此模型的相當一大部分參數都很小,換句話說,其對結果的影響力比較小。因此可以將這些冗餘的參數刪除,從而壓縮特徵。壓縮代碼如下:
model.compress(0.9, 0) #將特徵個數壓縮爲原來的0.9倍。
segment = PerceptronLexicalAnalyzer(model) #實例一個分詞器
在線學習
模型訓練完後就可以拿來用了,那麼可否將訓練好的模型回爐重造,重新學習呢?答案是肯定的:
segment = PerceptronLexicalAnalyzer(model) #實例一個分詞器
segment.enableCustomDictionary(False) #不集成用戶詞典
for i in range(3):
segment.learn("人 與 川普 通電話") #在線調整模型(重新訓練三次!!!)
print(segment.seg("銀川普通人與川普通電話講四川普通話")
輸出結果如下:
[銀川, 普通人, 與, 川普, 通電話, 講, 四川, 普通話]