导读:
在最近的几期博客,解析中文分词的源码,希望大家能给予支持。
采用的最大匹配算法,按从左至右正向最大匹配和从右到左反向最大匹配,当两种分词结果不一致时,按最少切分原则,取切分词数最少的一种,如果两种分词结果切分的词数一样,取反向最大匹配作为分词的结果。
这次主要介绍com.xq.util包下的文件和com.xq包的Word.java和TextBlock.java 。
com.xq.util.File.java:
这个类提供几个静态的方法实现文件的列示和读写操作,比较简单,在此不再详述。
com.xq.util.Sort.java:
提供一个对整型数组实现冒泡排序的静态方法。
com.xq.util.Sear.java:
封装几个二分查找的算法,binaryInsert方法在字典导入时用,返回新单词插入的位置,binarySearch在匹配时用,查找在List中是否存在单词。
com.xq.util. CharTest.java:
这个类检查是否是有效字符,在分词第一步过滤文本是用到,unicode值在19968——40869的是中文字符,数字0——9的unicode值是48——57(半角)和65296——65305(全角),另外还有字母的半角和全角,中文一至九的检查,具体见代码。
Word.java:
一个Word类的对象是一个单词,每个单词被封装在一个Word类,成员变量content是单词的内容,如“中国”,value是该词的unicode值,“中国”的unicode值是42282,length是单词的长度,长度相同的单词存在同一个子字典文件中。在字典文件中只存单词的内容,value是在单词加载时计算的,这个类实现一个Comparable接口,在二分查找时用到,word类重载equals方法,比较两个word是否完全一样,两个word相等条件应该是长度、值和内容完全一样。
TextBlock.java:
在源代码中类的注释有误,在此更正,这个类描述属性相同的一段文本,文本属性在CharTest.java中定义,主要有四种,中文字符、英文字符(包括全角)、数字(包括全角)和其它字符。分词第一步对文本过滤,具有相同属性的相邻的文本放入同一个TextBlock对象,所有的TextBlock对象放入一个list,然后遍历list,具有中文字符属性的TextBlock被分词。例如“国庆将至,大家准备去哪happy呢”,这句话会被拆分成5个TextBlock对象,分别是“国庆将至”,“,”,“大家准备去哪”,“happy”,“呢”。
今天介绍的是几个简单的基础类,以后将介绍比较复杂的字典类和分词类,欢迎大家继续关注。
源代码在上期博客可以下载http://www.blogjava.net/xq-studio/archive/2007/09/27/148608.html
本文转自
http://www.blogjava.net/xq-studio/archive/2007/11/26/149484.html#163347
在最近的几期博客,解析中文分词的源码,希望大家能给予支持。
采用的最大匹配算法,按从左至右正向最大匹配和从右到左反向最大匹配,当两种分词结果不一致时,按最少切分原则,取切分词数最少的一种,如果两种分词结果切分的词数一样,取反向最大匹配作为分词的结果。
这次主要介绍com.xq.util包下的文件和com.xq包的Word.java和TextBlock.java 。
com.xq.util.File.java:
这个类提供几个静态的方法实现文件的列示和读写操作,比较简单,在此不再详述。
com.xq.util.Sort.java:
提供一个对整型数组实现冒泡排序的静态方法。
com.xq.util.Sear.java:
封装几个二分查找的算法,binaryInsert方法在字典导入时用,返回新单词插入的位置,binarySearch在匹配时用,查找在List中是否存在单词。
com.xq.util. CharTest.java:
这个类检查是否是有效字符,在分词第一步过滤文本是用到,unicode值在19968——40869的是中文字符,数字0——9的unicode值是48——57(半角)和65296——65305(全角),另外还有字母的半角和全角,中文一至九的检查,具体见代码。
Word.java:
一个Word类的对象是一个单词,每个单词被封装在一个Word类,成员变量content是单词的内容,如“中国”,value是该词的unicode值,“中国”的unicode值是42282,length是单词的长度,长度相同的单词存在同一个子字典文件中。在字典文件中只存单词的内容,value是在单词加载时计算的,这个类实现一个Comparable接口,在二分查找时用到,word类重载equals方法,比较两个word是否完全一样,两个word相等条件应该是长度、值和内容完全一样。
TextBlock.java:
在源代码中类的注释有误,在此更正,这个类描述属性相同的一段文本,文本属性在CharTest.java中定义,主要有四种,中文字符、英文字符(包括全角)、数字(包括全角)和其它字符。分词第一步对文本过滤,具有相同属性的相邻的文本放入同一个TextBlock对象,所有的TextBlock对象放入一个list,然后遍历list,具有中文字符属性的TextBlock被分词。例如“国庆将至,大家准备去哪happy呢”,这句话会被拆分成5个TextBlock对象,分别是“国庆将至”,“,”,“大家准备去哪”,“happy”,“呢”。
今天介绍的是几个简单的基础类,以后将介绍比较复杂的字典类和分词类,欢迎大家继续关注。
源代码在上期博客可以下载http://www.blogjava.net/xq-studio/archive/2007/09/27/148608.html
本文转自
http://www.blogjava.net/xq-studio/archive/2007/11/26/149484.html#163347