首页 > 代码库 > NLP: 中文分词算法--正向最大匹配 Forward Maximum Matching

NLP: 中文分词算法--正向最大匹配 Forward Maximum Matching

最近接触NLP中文分词, 在lunr.js的基础上, 实现了中文的最大正向匹配分词。

某些情况下, 我们在服务器端进行中文文本分词可以使用完整的基于mmseg算法的分词模块, 例如nodejieba, node-segment, 盘古分词等等,  但是在客户端环境下, 我们不能使用这些复杂的分词算法进行分词, 这个时候可以根据已经生成的索引进行简单的客户端分词, 就是所说的FMM (Forward Maximum Matching, 正向最大匹配), 有时候也可以使用正向匹配。


在做FMM的时候, 还需要进行交集歧义检测, 检测是否出现歧义, 如果出现歧义则进行其他的歧义处理,  歧义处理可以采用bi-gram或者对歧义片段进行一个完整的正向匹配, 划分出所有的可以切分的情况。 

交集歧义检测距离, 例如“学院路途遥远”, 如果只做正向最大匹配, 那么首先切分出“学院路”, 然后对“途遥远”再次进行FMM切分, 这样的切分结果肯定是错误的。 


本文是基于lunr.js的, 所以采用JavaScript代码进行实现(ps: 目前写了好多js代码了。。。), 因为我只用了简单的10篇新闻构建索引, 所以这里的示例可能不是很理想, 但是可以把算法描述清楚。 关于构建索引的部分, 这里不再详述, 我们只是假定已经存在了索引, 并且索引是以Trie树的形式存在的。 


ps: 使用node.js运行JS文件


var lunr = require("./lunr.js")
var idxdata = http://www.mamicode.com/require("./idx.json")>
测试:

1. 

query : "互联网金宝中央气象台"

切分结果: [ ‘互联网‘, ‘金‘, ‘宝‘, ‘中央气象台‘ ]


2. 

query: "中国人民银行指出我国最近经济不景气"

切分结果: [ ‘中国人民银行‘, ‘指‘, ‘出‘, ‘我‘, ‘国‘, ‘最近‘, ‘经济‘, ‘不景气‘ ]

这里之所以切分效果不好, “我国”没有成词, 是因为我的索引太小了, 里面根本就没有这个路径。。。


3. 

query : "中国银行今日出台了最新的贷款政策"

切分结果: [ ‘中国‘, ‘银行‘, ‘今日‘, ‘出台‘, ‘了‘, ‘最新‘, ‘的‘, ‘贷‘, ‘款‘, ‘政策‘ ]


注: 在query中, 所有的未登录词都被切分成了单字。