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

中文文本处理的首要问题是分词,最大匹配法有正向和逆向之分,分别是从一个句子的开头和结尾切词。比如这里有一句话: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);
    }
}

分词过程:

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

分词结果:

。\语言学\学习\在\我\


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值