您的位置:首页 > 其它

中文分词算法之最大逆向匹配法

2014-02-28 09:17 429 查看
中文文本处理的首要问题是分词,最大匹配法有正向和逆向之分,分别是从一个句子的开头和结尾切词。比如这里有一句话:S = “我在学习语言学”。
定义词最大的长度是:3,S1 = “”;分隔符:“\”;设现有词典Map存在如下词表:我、在、学习、语言学。
最大匹配法的关键在于有完整的词典,但是,也会有歧义发生,例如上记的长度如果定位2,词典里有“语言”一词,分词结果将会不是期望的结果。
下面用Java实现上面的分词算法。

package cn.zhf.fenci;
import java.util.HashMap;
import java.util.Map;

public class Segment {
public static StringBuilder cutWords(String text){
Map<String,Integer> map = loadMap();//载入字典
int MAX_LEN = 2;//定义最大词长
StringBuilder sb = new StringBuilder();//存放结果
int length = text.length();//存放文本的长度
String word;//每次切分出来的词段
while(text.length() > 0){
if(length > MAX_LEN){
MAX_LEN = length;
}
word = text.substring(length - MAX_LEN);//从末往前切词
int offStart = length - MAX_LEN;
boolean find = false;
while(word.length() > 1){
if(map.containsKey(word)){
find = true;
sb.append(word + "\\");//在词典中找到此词,则追加到结果中
break;
}
offStart++;//将word中的前一个字丢弃
word = text.substring(offStart);
}
if(!find){//循环结束时,还剩下一个字,加入结果中
sb.append(word + "\\");
}
text = text.substring(0,offStart);
}
return sb;
}
//简单起见,不从文本词典中读取数据
public static Map<String,Integer> loadMap(){
Map<String,Integer> map = new HashMap<String,Integer>();
map.put("我", 1);
map.put("在", 1);
map.put("学习", 1);
map.put("语言", 1);
map.put("。", 1);
return map;
}

public static void main(String[] args) {
String text = "我在学习语言学。";
StringBuilder result = cutWords(text);
System.out.println(result);
}
}
分词过程:
: 我在学习语言学。
: 在学习语言学。
: 学习语言学。
: 习语言学。
: 语言学。
: 言学。
: 学。
: 。

: 我在学习语言学
: 在学习语言学
: 学习语言学
: 习语言学
: 语言学

: 我在学习
: 在学习
: 学习

: 我在
: 在

: 我
分词结果:
。\语言学\学习\在\我\
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 中文分词