java HashMap实现中文分词器 应用:敏感词过滤实现

今天下午部门内部技术分享是分词器算法。这次的主讲是大名鼎鼎的Ansj分词器的作者-孙健。

作者简介:

Ansj分词器作者
elasticsearch-sql(elasticsearch的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 Map<String, String> map = new HashMap<String, 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 i=0; i<length; i++){int endIdx = i+maxSize;if(endIdx>length){endIdx = length;}//最大逆序匹配for(int j=0; j<maxSize; j++){String s = text.substring(i, endIdx);if(map.get(s)!=null){//跳过匹配过的词(后面会说明跳过匹配词的原因)i=endIdx-1;System.out.println(s);break;}else{endIdx-=1;if(endIdx==i){break;}}}}
}

}

输出结果:
中国
北京
中关村
海淀

注意:
如果不跳过已经匹配的词会出现"北京剧院" 拆分成 [北京]、[京剧]、[剧院] 三个词,
如果跳过匹配过的词就会拆分成 [北京]、[剧院]。

分词原理:
从词典中找出最长词的长度,这里为maxSize=3,按照maxSize的长度从文本的第一位(i=0)截取要抽取的文本【中国人】,然后去Map中查找是否有对应的值,如果没有减去一个长度截取(maxSize-1)【中国】,去Map中查找,找到则停止当前查找,接着从匹配当前词后面的字(i=2)【人民共】开始继续上述的步骤开始查找。
代码执行的流程如下:
第一次循环(i=0):
中国人 -> 无命中(map中没找到) (j=0)
中国 -> map命中 (j=1) 【注释:命中后i+2(当前词)的长度。所以i=2】
第二次循环(i=2):
人民共 -> 无命中 (j=0)
人民 -> 无命中 (j=1)
人 -> 无命中 (j=2)
第三次循环(i=3):
民共和 -> 无命中 (j=0)
民共 -> 无命中 (j=1)
民 -> 无命中 (j=2)
…依次类推,找出文本中所有匹配词典中的词

很简单的代码就说明了分词器的原理(只是最简单、能命中词而以)。
应用场景
敏感词、文字过滤是一个网站必不可少的功能,可以使用这么简单的几行代码实现网站的敏感词过滤功能,自己这么简单几行代码就能实现是不是很棒。
转载来源:
作者:jijs
链接:https://www.jianshu.com/p/62f4a5596278
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509063.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java字典树(Trie)实现中文模糊匹配

原理解释&#xff1a; java实现&#xff1a;https://blog.csdn.net/yuhk231/article/details/51539840 c实现&#xff1a;https://blog.csdn.net/qq_31175231/article/details/77827324 代码模板&#xff1a;缺点&#xff0c;只能检索出在一个分支中的前缀匹配内容 package co…

Word2vec加TextRank算法生成文章摘要

依赖包&#xff1a;https://download.csdn.net/download/dreamzuora/10853874 代码&#xff1a; String document "算法可大致分为基本算法、数据结构的算法、数论算法、计算几何的算法、图的算法、动态规划以及数值分析、加密算法、排序算法、检索算法、随机化算法、并行…

hanlp中文分词、提取摘要关键字、语句分析、智能推荐

hanlp资源&#xff1a; hanlp介绍&#xff1a;http://hanlp.linrunsoft.com/ hanlp下载&#xff1a;https://github.com/hankcs/HanLP hanlp(分词)使用&#xff1a;https://blog.csdn.net/nima1994/article/details/72819973 hanlp1.7:https://github.com/hankcs/HanLP/tree/v1…

TextRank、BM25算法提取关键字、文章自动摘要优秀文章保存

转载地址&#xff1a;http://www.hankcs.com/nlp/textrank-algorithm-java-implementation-of-automatic-abstract.html

set 用法

Set常用用法 2013-04-22 19:24 86508人阅读 评论(1) 收藏 举报分类&#xff1a;CPlus&#xff08;54&#xff09; set集合容器&#xff1a;实现了红黑树的平衡二叉检索树的数据结构&#xff0c;插入元素时&#xff0c;它会自动调整二叉树的排列&#xff0c;把元素放到适当的位置…

去掉标点符号

//去掉标点符号、空格title title.replaceAll("[\\pP\\p{Punct}| ]", "");

C语言向文件写入内容并读取显示

将学生信息&#xff08;姓名、年龄、学号和平均分&#xff09;写入文件&#xff0c;然后读取显示出来。要求&#xff1a;从控制台输入学生信息&#xff1b;可以输入任意数目的学生信息&#xff1b;文件每行存储一条学生信息&#xff0c;姓名、年龄、学号、平均分以tab(\t)为分隔…

C语言main()主函数执行完毕后是否会再执行一段代码

C语言main()主函数执行完毕后是否会再执行一段代码 分享到&#xff1a;QQ空间新浪微博腾讯微博豆瓣人人网main() 主函数执行完毕后&#xff0c;是否可能会再执行一段代码&#xff1f;给出说明。main主函数是所有程序必须具备的函数&#xff0c;是C/C人员一接触代码就知道的函数…

java 操作redis

//连接redis &#xff0c;redis的默认端口是6379Jedis jedis new Jedis ("localhost",6379); //验证密码&#xff0c;如果没有设置密码这段代码省略jedis.auth("password"); jedis.connect();//连接jedis.disconnect();//断开连接Set<String> keys…

C语言用递归求斐波那契数,让你发现递归的缺陷和效率瓶颈

C语言用递归求斐波那契数&#xff0c;让你发现递归的缺陷和效率瓶颈 分享到&#xff1a;QQ空间新浪微博腾讯微博豆瓣人人网递归是一种强有力的技巧&#xff0c;但和其他技巧一样&#xff0c;它也可能被误用。一般需要递归解决的问题有两个特点&#xff1a;存在限制条件&#xf…

【转载保存】java四种线程池的使用

https://blog.csdn.net/qq_31441667/article/details/78830395

size_t strtok

C语言字符串长度统计函数strlen()的实现原理 分享到&#xff1a;QQ空间新浪微博腾讯微博豆瓣人人网C标准库中有一个字符串长度统计函数strlen()&#xff0c;用来统计字符串的长度&#xff0c;它的实现与下面类似。 复制纯文本复制 #include <stdlib.h>size_t strlen( cha…

【保存】maven的pom.xml标签的xsi:schemaLocation处报错

maven装X的原因是 maven对下载不下来的jar文件会生成一个 *.lastUpdated 文件 &#xff0c;不将*.lastUpdated文件干掉&#xff0c;它是不会给你重新下载jar, so 将 *.lastUpdated 这个家伙干掉&#xff0c;再update一下就OK了 原文&#xff1a;https://blog.csdn.net/…

strlen() Bug

C语言strlen()以NUL作为字符串结束标记&#xff0c;自定义一个字符串长度统计函数消除这个Bug 分享到&#xff1a;QQ空间新浪微博腾讯微博豆瓣人人网我们知道&#xff0c;字符串长度统计函数 strlen() 以NUL作为字符串结束标记&#xff0c;但是很不幸的是&#xff0c;有时候字符…

C语言中文件的读取和写入

C语言中文件的读取和写入 注意&#xff1a; 1、由于C是缓冲写 所以要在关闭或刷新后才能看到文件内容 2、电脑处理文本型和二进制型的不同 &#xff08;因为电脑只认识二进制格式&#xff09; 在C语言中写文件 //获取文件指针 FILE *pFile fopen("1.txt", //打开文件…

基于ansj_seg和nlp-lang的简单nlp工具类

1、首先在pom中引入ansj_seg和nlp-lang的依赖包&#xff0c; ansj_seg包的作用&#xff1a; 这是一个基于n-GramCRFHMM的中文分词的java实现&#xff1b; 分词速度达到每秒钟大约200万字左右&#xff08;mac air下测试&#xff09;&#xff0c;准确率能达到96%以上; 目前实现了…

ArrayList的四种初始化方法

转载&#xff1a;https://beginnersbook.com/2013/12/how-to-initialize-an-arraylist/ Method 1: Initialization using Arrays.asList Syntax: ArrayList<Type> obj new ArrayList<Type>(Arrays.asList(Object o1, Object o2, Object o3, ....so on)); Exam…

C++ Deque(双向队列

C Deque(双向队列)C Deque(双向队列) 是一种优化了的、对序列两端元素进行添加和删除操作的基本序列容器。它允许较为快速地随机访问&#xff0c;但它不像vector 把所有的对象保存在一块连续的内存块&#xff0c;而是采用多个连续的存储块&#xff0c;并且在一个映射结构中保存…

java.lang.IllegalArgumentException: URLDecoder异常解决

异常&#xff1a; Exception in thread "main" java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in escape (%) pattern - For input string: "u9" at java.net.URLDecoder.decode(URLDecoder.java:194) at com.hbzx.co…