中文分词算法之最大逆向匹配法
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);
}
}
分词过程:
: 我在学习语言学。
: 在学习语言学。
: 学习语言学。
: 习语言学。
: 语言学。
: 言学。
: 学。
: 。
: 我在学习语言学
: 在学习语言学
: 学习语言学
: 习语言学
: 语言学
: 我在学习
: 在学习
: 学习
: 我在
: 在
: 我
分词结果:
。\语言学\学习\在\我\
定义词最大的长度是: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);
}
}
分词过程:
: 我在学习语言学。
: 在学习语言学。
: 学习语言学。
: 习语言学。
: 语言学。
: 言学。
: 学。
: 。
: 我在学习语言学
: 在学习语言学
: 学习语言学
: 习语言学
: 语言学
: 我在学习
: 在学习
: 学习
: 我在
: 在
: 我
分词结果:
。\语言学\学习\在\我\
相关文章推荐
- 简单的逆向最大匹配算法实现中文分词(Python)
- 中文分词的逆向最大匹配算法
- C#写中文基于词表的最大逆向匹配分词算法
- 用正向和逆向最大匹配算法进行中文分词
- 中文分词基础原则及正向最大匹配法、逆向最大匹配法、双向最大匹配法的分析
- 中文分词--逆向最大匹配
- 试着写 搜索算法-- 最大逆向匹配分词算法
- 。一个最大逆向匹配分词算法的例子
- NLP: 中文分词算法--正向最大匹配 Forward Maximum Matching
- 中文分词引擎 java 实现 — 正向最大、逆向最大、双向最大匹配法
- 最大匹配算法实现中文分词(讲解+代码)
- 中文分词常用算法之基于词典的双向最大匹配
- 自然语言处理 最大逆向匹配分词算法
- 中文分词算法之最大正向匹配算法(Python版)
- 正向最大匹配中文分词算法
- 中文分词基础原则及正向最大匹配法、逆向最大匹配法、双向最大匹配法的分析
- python中文分词教程之前向最大正向匹配算法详解
- 逆向最大匹配分词算法
- 中文分词--逆向最大匹配
- 正向最大匹配中文分词算法