HanLP分詞——感知器模型

感知器模型

所謂感知器模型,可以視爲一個邏輯迴歸模型。
我們知道,一個分詞任務相當於一個序列標註問題。因此,分詞任務可以視爲機器學習問題中的——結構化預測問題。
序列標註可見: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("銀川普通人與川普通電話講四川普通話")    

輸出結果如下:

[銀川, 普通人, 與, 川普, 通電話, 講, 四川, 普通話]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章