中文分词

中文分词算法 之 基于词典的逆向最小匹配算法

限于喜欢 提交于 2019-12-10 07:03:43
在之前的博文中介绍了 基于词典的逆向最大匹配算法 , 比如我们切分句子: 中华人民共和国万岁万岁万万岁,使用逆向最大匹配算法的切分结果为:[中华人民共和国, 万岁, 万岁, 万万岁],可以看到,切分出来的词是很长的,粒度很粗,如果我们想要切分出很细粒度的词,该怎么办呢? 本文介绍 逆向最小匹配算法 ,该算法和 逆向最大匹配算法 相得益彰,一个强调细粒度,一个强调粗粒度。 使用 逆向最小匹配算法 ,必须 注意 的一点是: 词典中不能有单字词,词的长度至少为2! 我们看 逆向最小匹配算法 和 逆向最大匹配算法 的代码比较: 切分效果如下: 切分句子: 中华人民共和国万岁万岁万万岁 逆向最大匹配: [中华人民共和国, 万岁, 万岁, 万万岁] 逆向最小匹配: [中华, 人民, 共和国, 万岁, 万岁, 万, 万岁] 切分句子: 杨尚川是APDPlat应用级产品开发平台的作者 逆向最大匹配: [杨尚川, 是, APDPlat, 应用, 级, 产品开发, 平台, 的, 作者] 逆向最小匹配: [杨尚川, 是, APDPlat, 应用, 级, 产品, 开发, 平台, 的, 作者] 切分句子: 美国加州大学的科学家发现 逆向最大匹配: [美国加州大学, 的, 科学家, 发现] 逆向最小匹配: [美国, 加州, 大学, 的, 科, 学家, 发现] 代码托管于GITHUB 参考资料: 1、

搜索引擎关键技术:中文分词技术介绍

≯℡__Kan透↙ 提交于 2019-12-10 07:03:28
信息的飞速增长,使搜索引擎成为人们查找信息的首选工具,Google、百度等大型搜索引擎一直是人们讨论的话题。随着搜索市场价值的不断增加,越来越多的公司开发出自己的搜索引擎,阿里巴巴的商机搜索、8848的购物搜索等也陆续面世,自然,搜索引擎技术也成为技术人员关注的热点。 虽然在国外搜索引擎技术早就开始研究,但在国内还是陆续涌现出优秀的搜索引擎,像百度等。目前在中文搜索引擎领域,国内的搜索引擎已经和国外的搜索引擎效果上相差不远。之所以能形成这样的局面,有一个重要的原因就在于中文和英文两种语言自身的书写方式不同,这其中对于计算机涉及的技术就是中文分词。 什么是中文分词 众所周知,英文是以词为单位的,词和词之间是靠空格隔开,而中文是以字为单位,句子中所有的字连起来才能描述一个意思。例如,英文句子I am a student,用中文则为:“我是一个学生”。计算机可以很简单通过空格知道student是一个单词,但是不能很容易明白“学”、“生”两个字合起来才表示一个词。把中文的汉字序列切分成有意义的词,就是中文分词,有些人也称为切词。我是一个学生,分词的结果是:我 是 一个 学生。 中文分词和搜索引擎 中文分词到底对搜索引擎有多大影响?对于搜索引擎来说,最重要的并不是找到所有结果,因为在上百亿的网页中找到所有结果没有太多的意义,没有人能看得完,最重要的是把最相关的结果排在最前面

全文检索lucene中文分词的一些总结

房东的猫 提交于 2019-12-10 07:03:18
全文检索几乎是所有内容管理系统软件(CMS)必备的功能,在对公司的CMS产品的开发维护过程中,全文检索始终是客户重点关注的模块,为满足客户各式各样越来越高的要求,对全文检索曾做过一段时间相对深入的研究,尤其是对分词机制. 1 、 什么是中文分词 学过英文的都知道,英文是以单词为单位的,单词与单词之间以空格或者逗号句号隔开。而中文则以字为单位,字又组成词,字和词再组成句子。所以对于英文,我们可以简单以空格判断某个字符串是否为一个单词,比如I love China,love 和 China很容易被程序区分开来;但中文“我爱中国”就不 一样了,电脑不知道“中国”是一个词语还是“爱中”是一个词语。把中文的句子切分成有意义的词,就是中文分词,也称切词。我爱中国,分词的结果是:我 爱 中国。 目前中文分词还是一个难题———对于需要上下文区别的词以及新词(人名、地名等)很难完美的区分。国际上将同样存在分词问题的韩国、日本和中国并称为CJK(Chinese Japanese Korean),对于CJK这个代称可能包含其他问题,分词只是其中之一。 2 、 中文分词的实现 Lucene自带了几个分词器WhitespaceAnalyzer, SimpleAnalyzer, StopAnalyzer, StandardAnalyzer, ChineseAnalyzer, CJKAnalyzer等

中文分词算法 之 词典机制性能优化与测试

夙愿已清 提交于 2019-12-10 07:03:08
在之前的两篇博文 中文分词算法 之 基于词典的正向最大匹配算法 和 中文分词算法 之 基于词典的逆向最大匹配算法 中,我们对 分词实现 和 词典实现 都做了优化,本文对词典实现做进一步优化,并和之前的多个实现做一个对比,使用的词典 下载地址 ,使用的测试文本 下载地址 。 优化TrieV3的关键在于 把虚拟根节点(/)的子节点(词表首字母)提升为多个相互独立的根节点,并对这些根节点建立索引 。优化的依据是 根节点(词表首字母)的数量庞大,索引查找的速度远远超过二分查找 。 下面看看进一步优化后的TrieV4和之前的TrieV3的对比: /** * 获取字符对应的根节点 * 如果节点不存在 * 则增加根节点后返回新增的节点 * @param character 字符 * @return 字符对应的根节点 */ private TrieNode getRootNodeIfNotExistThenCreate(char character){ TrieNode trieNode = getRootNode(character); if(trieNode == null){ trieNode = new TrieNode(character); addRootNode(trieNode); } return trieNode; } /** * 新增一个根节点 * @param

中文分词算法 之 基于词典的逆向最大匹配算法

☆樱花仙子☆ 提交于 2019-12-10 06:52:22
在之前的博文中介绍了 基于词典的正向最大匹配算法 ,用了不到50行代码就实现了,然后分析了 词典查找算法 的时空复杂性,最后使用 前缀树 来实现词典查找算法,并做了3次优化。 下面我们看看 基于词典的逆向最大匹配算法 的实现,实验表明,对于汉语来说,逆向最大匹配算法比(正向)最大匹配算法更有效, 如下代码所示: public static List<String> segReverse(String text){ Stack<String> result = new Stack<>(); while(text.length()>0){ int len=MAX_LENGTH; if(text.length()<len){ len=text.length(); } //取指定的最大长度的文本去词典里面匹配 String tryWord = text.substring(text.length() - len); while(!DIC.contains(tryWord)){ //如果长度为一且在词典中未找到匹配,则按长度为一切分 if(tryWord.length()==1){ break; } //如果匹配不到,则长度减一继续匹配 tryWord=tryWord.substring(1); } result.push(tryWord); //从待分词文本中去除已经分词的文本 text

中文分词算法 之 基于词典的正向最小匹配算法

倖福魔咒の 提交于 2019-12-10 06:52:00
在之前的博文中介绍了 基于词典的正向最大匹配算法 , 比如我们切分句子: 中华人民共和国万岁万岁万万岁,使用正向最大匹配算法的切分结果为:[中华人民共和国, 万岁, 万岁, 万万岁],可以看到,切分出来的词是很长的,粒度很粗,如果我们想要切分出很细粒度的词,该怎么办呢? 本文介绍 正向最小匹配算法 ,该算法和 正向最大匹配算法 相得益彰,一个强调细粒度,一个强调粗粒度。 使用 正向最小匹配算法 ,必须 注意 的一点是: 词典中不能有单字词,词的长度至少为2! 我们看 正向最小匹配算法 和 正向最大匹配算法 的代码比较: 切分效果如下: 切分句子: 中华人民共和国万岁万岁万万岁 正向最大匹配: [中华人民共和国, 万岁, 万岁, 万万岁] 正向最小匹配: [中华, 人民, 共和, 国, 万岁, 万岁, 万万, 岁] 切分句子: 杨尚川是APDPlat应用级产品开发平台的作者 正向最大匹配: [杨尚川, 是, APDPlat, 应用, 级, 产品开发, 平台, 的, 作者] 正向最小匹配: [杨尚川, 是, APDPlat, 应用, 级, 产品, 开发, 平台, 的, 作者] 切分句子: 美国加州大学的科学家发现 正向最大匹配: [美国加州大学, 的, 科学家, 发现] 正向最小匹配: [美国, 加州, 大学, 的, 科学, 家, 发现] 代码托管于GITHUB 参考资料: 1、

JavaScript: 实现简单的中文分词

╄→尐↘猪︶ㄣ 提交于 2019-12-10 06:37:55
中文分词在大数据横行的今天是越来越有用武之地了。它不仅被广泛用于专业的中文搜索引擎中,而且在关键词屏蔽、黑白名单以及文本相似度等方面也能大显身手。中文分词最简单也最常用的方式是基于字典查找的方式,通过遍历待分词字符串并在字典中进行查找匹配以达到分词的目的。本文即是采用这种方式。 字典 在本文中,完全依赖于字典,因此需要准备好字典。一般面对不同的领域用不同的字典。比如面向医学的,则字典会添加许多医学术语方面的词。可以很容易的找到常用词的字典,比如搜狗输入法自带的字典等。 停止词 停止词不能用于成词。停止词主要包括无意义的字符(如的、地、得)或词。 常规实现 本文由于只是简单的介绍和实现,所以定义好了简单的字典和停止词,如下代码所示: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>简单的中文分词</title> <meta name="author" content="" /> <meta http-equiv="X-UA-Compatible" content="IE=7" /> <meta name="keywords" content="简单的中文分词" /> <meta name="description" content="简单的中文分词" /> </head> <body> <script type=

中文分词算法 之 基于词典的正向最大匹配算法

ぃ、小莉子 提交于 2019-12-10 06:29:15
基于词典的正向最大匹配算法 ( 最长词优先匹配 ) ,算法会根据词典文件自动调整最大长度,分词的好坏完全取决于词典。 算法流程图如下: Java实现代码如下: /** * 基于词典的正向最大匹配算法 * @author 杨尚川 */ public class WordSeg { private static final List<String> DIC = new ArrayList<>(); private static final int MAX_LENGTH; static{ try { System.out.println("开始初始化词典"); int max=1; int count=0; List<String> lines = Files.readAllLines(Paths.get("D:/dic.txt"), Charset.forName("utf-8")); for(String line : lines){ DIC.add(line); count++; if(line.length()>max){ max=line.length(); } } MAX_LENGTH = max; System.out.println("完成初始化词典,词数目:"+count); System.out.println("最大分词长度:"+MAX_LENGTH); }

word分词器、ansj分词器、mmseg4j分词器、ik-analyzer分词器分词效果评估

有些话、适合烂在心里 提交于 2019-12-07 21:12:07
word分词是一个Java实现的中文分词组件,提供了多种基于词典的分词算法,并利用ngram模型来消除歧义。 能准确识别英文、数字,以及日期、时间等数量词,能识别人名、地名、组织机构名等未登录词。 同时提供了Lucene、Solr、ElasticSearch插件。 word分词器分词效果评估 主要评估下面7种分词算法: 正向最大匹配算法:MaximumMatching 逆向最大匹配算法:ReverseMaximumMatching 正向最小匹配算法:MinimumMatching 逆向最小匹配算法:ReverseMinimumMatching 双向最大匹配算法:BidirectionalMaximumMatching 双向最小匹配算法:BidirectionalMinimumMatching 双向最大最小匹配算法:BidirectionalMaximumMinimumMatching 所有的双向算法都使用 ngram 来消歧,分词效果评估分别评估 bigram 和 trigram 。 评估采用的测试文本有253 3709行,共2837 4490个字符, 标准文本和测试文本 一行行对应,标准文本中的词以空格分隔,评估标准为严格一致,评估核心代码如下: /** * 分词效果评估 * @param resultText 实际分词结果文件路径 * @param standardText

打造自己的coreseek分词词库

廉价感情. 提交于 2019-12-07 12:03:44
下面给大家介绍一下如何打造自己的coreseek分词词库。 coreseek自身带的词库不是很大,直接使用它分词可能会返回大量没用结果。要想搜索结果准确打造一个专门的分词 词库必不可少。   i. 首先到搜狗http://pinyin#sogou#com/dict/下载你要的词库   ii. 因为下载回来的词库不是文本文件我们不能直接使用,所以要先转换成文本文件。网上找一个搜狗转 google的小工具,用它把你下载的全部词库转成文本文件。合并为一个文件命名为words.txt。文件要用utf8编码 保存,如果想直接使用我下面的工具进行转换的话文件名一定要是words.txt。如果你想自己转换请参考官网上的方 法http://www#coreseek#cn/opensource/mmseg/   iii. 现在我们有了一个初步的词库,但这个词库还不能直接使用,要再整理并转换coreseek使用的格式才行。 这里我提供一个自己编写的小程序方便转换。 源程序如下: /** Last edit 2012-8-11 Copyrigh@ www.4ji.cn **/ ini_set('max_execution_time','6000'); $buffer=ini_get('output_buffering'); if($buffer)ob_end_flush(); echo '处理新词库..