感知器模型
所谓感知器模型,可以视为一个逻辑回归模型。
我们知道,一个分词任务相当于一个序列标注问题。因此,分词任务可以视为机器学习问题中的——结构化预测问题。
序列标注可见: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("银川普通人与川普通电话讲四川普通话")
输出结果如下:
[银川, 普通人, 与, 川普, 通电话, 讲, 四川, 普通话]