asp网站后台编辑器,苏州网站推广工具,网站论文参考文献,免费空间搭建免费小说网站今天下午部门内部技术分享是分词器算法。这次的主讲是大名鼎鼎的Ansj分词器的作者-孙健。
作者简介#xff1a;
Ansj分词器作者 elasticsearch-sql#xff08;elasticsearch的sql插件#xff09;作者#xff0c;支持sql查询 nlp-lang自然语言工具包发起人 NLPCN#xff…今天下午部门内部技术分享是分词器算法。这次的主讲是大名鼎鼎的Ansj分词器的作者-孙健。
作者简介
Ansj分词器作者 elasticsearch-sqlelasticsearch的sql插件作者支持sql查询 nlp-lang自然语言工具包发起人 NLPCN自然语言处理组织发起人 等等… 网站http://www.nlpcn.org/ GIT地址https://github.com/NLPchina
具体作者详情请百度、Google 大神首先对中文分词的概念进行详细的解释并对比了传统分词和自然语言分词的区别和优略势。然后又讲到目前中文分词在应用过程中遇到的一些困难其中就包括中文歧义的识别(包含交叉歧义、组合歧义、真歧义)、人名识别、地名识别和机构名识别。在这几种难题中又以机构名识别最为困难机构名称各种简称如北京大学北大、腾讯鹅场等。召回率和准确率的关系正向匹配、逆向匹配等等。生动的讲解了分词的原理和难度所在。 但是讲到怎么实现的时候大家都是一脸懵逼的各种算法Trie Tree、双数组trie树、CRF模型等。听完就什么都不记得了呵呵。 不过讲到最后的时候给我们分享了下HashMap的一种简单实现分词器的思路意外的收获。下面通过代码说明五分钟搞定_。 HashMap简单实现的分词器
public class TokenizerDemo {
private static MapString, String map new HashMapString, String();//词典中最长词的长度map中的key的最长长度
private static final int maxSize 3;
static{//可以从数据库中加载或词表中加载map.put(中国, );map.put(北京, );map.put(中关村, );map.put(海淀, );
}public static void main(String[] args) {String text 中国人民共和国首都是北京中关村在海淀区。;int length text.length();for(int i0; ilength; i){int endIdx imaxSize;if(endIdxlength){endIdx length;}//最大逆序匹配for(int j0; jmaxSize; j){String s text.substring(i, endIdx);if(map.get(s)!null){//跳过匹配过的词后面会说明跳过匹配词的原因iendIdx-1;System.out.println(s);break;}else{endIdx-1;if(endIdxi){break;}}}}
}}
输出结果 中国 北京 中关村 海淀 注意 如果不跳过已经匹配的词会出现北京剧院 拆分成 [北京]、[京剧]、[剧院] 三个词 如果跳过匹配过的词就会拆分成 [北京]、[剧院]。
分词原理 从词典中找出最长词的长度这里为maxSize3按照maxSize的长度从文本的第一位i0截取要抽取的文本【中国人】然后去Map中查找是否有对应的值如果没有减去一个长度截取maxSize-1【中国】去Map中查找找到则停止当前查找接着从匹配当前词后面的字i2【人民共】开始继续上述的步骤开始查找。 代码执行的流程如下 第一次循环i0 中国人 - 无命中map中没找到 (j0) 中国 - map命中 (j1) 【注释命中后i2当前词的长度。所以i2】 第二次循环i2 人民共 - 无命中 (j0) 人民 - 无命中 (j1) 人 - 无命中 (j2) 第三次循环i3 民共和 - 无命中 (j0) 民共 - 无命中 (j1) 民 - 无命中 (j2) …依次类推找出文本中所有匹配词典中的词
很简单的代码就说明了分词器的原理只是最简单、能命中词而以。 应用场景 敏感词、文字过滤是一个网站必不可少的功能可以使用这么简单的几行代码实现网站的敏感词过滤功能自己这么简单几行代码就能实现是不是很棒。 转载来源 作者jijs 链接https://www.jianshu.com/p/62f4a5596278 來源简书 简书著作权归作者所有任何形式的转载都请联系作者获得授权并注明出处。