自己动手写中文分词解析器完整教程,并对出现的问题进行探讨和解决(附完整c#代码和相关dll文件、txt文件下载)

摘要:
初学者有时间练习自己的双手~~完整的项目源代码在文章末尾下载~~因为它是用Lucene下的中文分词解析器编写的。网在项目目录的bin/Debug文件下创建一个新的文件夹数据(如果文件夹已经存在,请将sDict.txt添加到数据文件夹中,并将其放置在指定的文件夹中)。构建树同义词库的实现代码如下。下面的代码只构造了一个简单的stop词汇表:一个相对完整的stop词汇。rar)。具体实现代码如下。

中文分词插件很多,当然都有各自的优缺点,近日刚接触自然语言处理这方面的,初步体验中文分词。

首先感谢harry.guo楼主提供的学习资源,博文链接http://www.cnblogs.com/harryguo/archive/2007/09/26/906965.html,在此基础上进行深入学习和探讨。

接下来进入正文。。。大牛路过别喷,菜鸟有空练练手~~完整的项目源码下载在文章末尾~~

因为是在Lucene.Net下进行中文分词解析器编写的,新建项目Lucene.China,然后将Lucene.Net.dll添加到项目中。(附:资源Lucene.Net.rar

与英文不同,中文词之间没有空格,于是对于中文分词就比英文复杂了些。

第一,构建树形词库,在所建项目目录下的bin/Debug文件下新建一个文件夹data(如果文件夹已经存在,则不用新建),然后在data文件夹中加入sDict.txt。

(附:资源sDict.rar,解压后得到是sDict.txt文档,放入指定文件夹中)

构建树形词库实现代码如下:

自己动手写中文分词解析器完整教程,并对出现的问题进行探讨和解决(附完整c#代码和相关dll文件、txt文件下载)第1张 WordTree.cs

第二,构建一个支持中文的分析器,

需要停用词表 :String[] CHINESE_ENGLISH_STOP_WORDS,下面代码只是构造了个简单的停用词表。 (附资源:相对完整的停用词表stopwords.rar

具体实现代码如下:

自己动手写中文分词解析器完整教程,并对出现的问题进行探讨和解决(附完整c#代码和相关dll文件、txt文件下载)第2张 ChineseAnalyzer.cs

第三,进行文本切分,文本切分的基本方法:输入字符串,然后返回一个词序列,然后把词封装成Token对象。

当然,要判断将要进行切分的词是中文、英文、数字还是其他。

自己动手写中文分词解析器完整教程,并对出现的问题进行探讨和解决(附完整c#代码和相关dll文件、txt文件下载)第3张

实现源码如下:

自己动手写中文分词解析器完整教程,并对出现的问题进行探讨和解决(附完整c#代码和相关dll文件、txt文件下载)第4张 ChineseTokenizer.cs

第四,编写测试demo的main函数,代码如下:

自己动手写中文分词解析器完整教程,并对出现的问题进行探讨和解决(附完整c#代码和相关dll文件、txt文件下载)第5张 Program.cs

控制器输出显示:

自己动手写中文分词解析器完整教程,并对出现的问题进行探讨和解决(附完整c#代码和相关dll文件、txt文件下载)第6张

可见被测试的文本为红色框里面所示。

测试结果:

 自己动手写中文分词解析器完整教程,并对出现的问题进行探讨和解决(附完整c#代码和相关dll文件、txt文件下载)第7张

问题出现了,never被拆分成n,ever。于是测试多几次,发现只要是n开头的单词,n都会被拆开,如nnno,会变成n,n,n,o。

那么为什么会这样呢?

回想一下,之前我们构建了字典树。其实一般情况下我们会觉得说中文分析器所需要构建的字典树,当然就是纯文字,但是其实不是这样的。

打开sDict.txt文件,会发现下面这些词语:

自己动手写中文分词解析器完整教程,并对出现的问题进行探讨和解决(附完整c#代码和相关dll文件、txt文件下载)第8张

发现问题了吧!!!其实是包含字母的,所以英文单词的n总会被单独切分出来。

那么应该怎么解决呢??

解决方法,就是在sDict.txt文件中加入以n开头的单词表,这样就可以完美切分啦!!

测试一下吧!在文件中加入单词never,如下:

自己动手写中文分词解析器完整教程,并对出现的问题进行探讨和解决(附完整c#代码和相关dll文件、txt文件下载)第9张

测试结果:

自己动手写中文分词解析器完整教程,并对出现的问题进行探讨和解决(附完整c#代码和相关dll文件、txt文件下载)第10张

可见单词never已经完美切除。

接下来再来看另外一个在测试过程出现的问题,

测试文本如下:‘开’和‘始’中间有空格,且这段文本最后没有标点和空格。

自己动手写中文分词解析器完整教程,并对出现的问题进行探讨和解决(附完整c#代码和相关dll文件、txt文件下载)第11张

测试结果如下:

自己动手写中文分词解析器完整教程,并对出现的问题进行探讨和解决(附完整c#代码和相关dll文件、txt文件下载)第12张

依然完美切分,而且没有报错提示。

然后继续测试英文文本,如下:依然留空格,然后文本末尾没有空格跟标点。

自己动手写中文分词解析器完整教程,并对出现的问题进行探讨和解决(附完整c#代码和相关dll文件、txt文件下载)第13张

测试结果:出现异常

自己动手写中文分词解析器完整教程,并对出现的问题进行探讨和解决(附完整c#代码和相关dll文件、txt文件下载)第14张

问题产生的原因是,英文是一个或多个单词相连的,如never,在判断第一个字母是属于英文的时候,会自动继续判断下一个,

当刚好这个单词是最后一个的时候,它依然会去查找下一个是否还是属于英文单词,这样文本要是以英文结束,且后面没有空格跟标点的话,

它就会出现超出索引的错误。

出现问题的代码是下面这句:在ChineseTokenizer.cs中

自己动手写中文分词解析器完整教程,并对出现的问题进行探讨和解决(附完整c#代码和相关dll文件、txt文件下载)第15张

注:由于数字的切分和英文的切分采用的方法相同,所以也会出现同样问题

解决方法:就是在测试的文档的最后加上一个空格。因为空格不会影响到切分,所以只要把要切分的文本都进行事先处理,在文本末尾加多个空格给它,这样就不会出现上面异常。

懒人大礼包^_^

如果你不想进行上面那些多步骤,也是可以的。

第一,还是要把sDict.txt文件放到项目目录/bin/Debug/data文件夾中;

第二,下载Lucene.Fanswo.rarLucene.Net.rar,然后将Lucene.Fanswo.dll和Lucene.Net.dll添加到项目中;

   注:Lucene.Fanswo.dll实现的功能跟上面写的一样,直接调用就行。

第三,编写Programs.cs测试代码

关键语句:

using Lucene.Fanswo;

创建支持中文的分析器,

 Analyzer analyzer = new Lucene.Fanswo.ChineseAnalyzer();

完整代码如下:

自己动手写中文分词解析器完整教程,并对出现的问题进行探讨和解决(附完整c#代码和相关dll文件、txt文件下载)第16张 Program.cs

测试过程中会发现如上问题,解决方法也是按上面的方式解决。

最后,附上完整测试demo项目源码下载,Lucene.China.rar

注:如果是下载项目源码,运行后发现有个空白窗体弹出,不要理它,关注控制台的输出。

@_@|| 终于写完了!!! ~_~zzZ

免责声明:文章转载自《自己动手写中文分词解析器完整教程,并对出现的问题进行探讨和解决(附完整c#代码和相关dll文件、txt文件下载)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇修改JavaScript脚本并离线编译后将数据同步到Web和Web app一、TestNG测试Case注解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Markdown列表中嵌套代码带来的问题

目录 1.问题描述 3.问题解决 使用Markdown时,在有序列表中嵌套代码块引发了有序列表编号中断(重新从1开始)的问题,最终已解决。 1.问题描述 代码: 1. title text ``` code ``` 2. title text ``` code ``` 使用上述代码,显示的效果为: 1. title text ``` code...

学习如何高效率编写单片机代码,优化程序设计

1、 使用尽量小的数据类型 能用unsiged就不用signed;能用char就不用int;能不用floating就不用;能用位操作不用算数。 2、使用自加、自减指令 通常使用自加、自减指令和复合赋值表达式(如a-=1 及a+=1 等)都能够生成高质量的程序代码,编译器通常都能够生成inc 和dec 之类的指令,而使用a=a+1 或a=a-1 之类的指令,...

VS2013、VS2019快捷键、代码块

 vs2013 返回上一光标位置: Ctrl + - 前进到下一光标位置: Ctrl + Shift + - 光标所在行的上面插入一行: Ctrl + Enter 光标所在行的下面插入一行: Ctrl + Shift + Enter 调用关键字智能提示: Ctrl + j (或者 Alt + →) 调用参数提示: Ctrl + Shift +...

15分钟让你了解如何实现并发中的Barrier

说到Barrier,很多语言中已经是标准库中自带的概念,一般情况下,只需要直接使用就行了。而最近一些机缘巧合的机会,我需要在c++中使用这么个玩意儿。但是c++标准库里还没有这个概念,只有boost里面有这样现成的东西,而我又不想为了这么一个小东西引入个boost。所以,我借着这个机会研究了下,发现其实这些多线程/并发中的东西还是蛮有意思的。 阅读本文你可...

界面编程模仿篇(QQ登录界面逼真篇)

写了好多天的爬虫,偷空前前后后用了两天的时间(排除吃饭睡觉)写完了这个QQ登录界面,看起来还凑和着吧,如果是的大神的,莫见笑,纯属业余作品,废话先不多说,截图如下,其中第二幅图片中的红色方框部份有待完善,明天开始继续搞爬虫,等有时间时再完善,先凑和着吧: 本篇博文就分析一下这个界面设计中的几个关键点,在阅读本博文之前请先阅读我个人博客上关于模仿QQ界...

统计一个版本代码变化行数

项目总结时,我们常常需要统计代码行数,来查看每个项目开发者的代码总量,提交次数和变更文件数。 这里介绍一下statsvn工具统计代码行数的方法。   1、安装tortoise svn 下载tortoise svn,下载地址:https://tortoisesvn.net/downloads.html,附件给出了64位的版本。 点击运行,按照提示安装完成。...