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("银川普通人与川普通电话讲四川普通话")    

输出结果如下:

[银川, 普通人, 与, 川普, 通电话, 讲, 四川, 普通话]

猜你喜欢

转载自blog.csdn.net/weixin_42141390/article/details/105892706