首页 > 代码库 > NLP: 中文分词算法---交集歧义检测 (cross ambiguity detect)
NLP: 中文分词算法---交集歧义检测 (cross ambiguity detect)
在 文章 http://blog.csdn.net/watkinsong/article/details/37697451 里面提到的FM中文分词算法中, 最大的问题就是将用户的query切分的太碎, 切分太碎也会对检索结果造成一定的影响。
这里, 可以采用FMM算法进行切分, 首先切分出最大的正向匹配, 然后进行交集歧义检测, 如果检测到存在交集歧义, 那么对可能存在歧义的一段文字进行FM切分, 获取所有的可能切分结果; 然后对剩下的query子句重复进行FMM切分, 直到query == null
例如, 用户查询 query = 123456789, 假设首先FMM切分到了“123”, 交集歧义检测长度为6, 这时候存在歧义, 那么对“123456”进行FM切分, 获取“123456”的所有的切分可能, 然后再对剩下的子句“789”循环进行FMM切分。
交集歧义检测算法描述:
假设 query = "互联网金宝", 首先进行FMM, 切分出“互联网”, 然后我们要检测是否存在交集歧义, 将“互联网”的长度作为输入, 这里我们使用变量word_len表示FMM切分结果的长度, 这里word_len = 3; 同时将query的子句“联网金宝”作为输入, 进行以下迭代:
如此循环下去, 循环结束的条件是 i < word_length && i < str.length
1.
对输入的 str = "联网金宝" 进行FMM切分, 获取切分后长度, 假设为“联网”, len = 2
如果此时 word_length < i + len, 则 word_length = i + length
此时, i = 1, len = 2, word_len = 3
str = str.slice(1)
2.
对 str = "网金宝" 进行FMM切分, 获取切分后长度, 假设为“网金宝”, len = 3
如果此时 word_length < i + len, 则 word_length = i + length, 这里, i + len = 5, i + len > word_len, 设置word_len = 5
此时, i = 2, len = 3, word_len = 5
str = str.slice(1)
3.
此时 i =3, str.length 为, 循环条件不成立, 退出迭代。
代码实现:
var lunr = require("./lunr.js") var idxdata = http://www.mamicode.com/require("./idx.json")>
测试:query: "互联网金宝"
结果:
FMM: 互联网, ambituity length: 5 ambiguity detected!!! do FM again for ambiguity piece: 互联网金宝 [ '互联网', '网', '网金宝', '金', '宝' ]
query: "互联网中国人民银行"结果:
FMM: 互联网, ambituity length: 3 FMM: 中国人民银行, ambituity length: 6 [ '互联网', '中国人民银行' ]