基于正向最大匹配算法的分词算法

标签: 算法

基于正向最大匹配算法的分词算法


1.算法描述:

最大匹配算法主要包括正向最大匹配算法、逆向最大匹配算法、双向匹配算法等。 其主要原理都是切分出单字串,然后和词库进行比对,如果是一个词就记录下来,否则通过增加或者减少一个单字,继续比较,一直还剩下一个单字则终止,如果该单字串无法切分,则作为未登录处理。

而本组采用的是正向最大匹配算法,假设分词词典中的最长词的字数为 M,令其作为最大匹配系数。假设读取的汉字序列字数为 L,判断 L 是否小于最大匹配系数M。如果 L 大于最大匹配系数 M,则截取前 M 个汉字作为待匹配字段进行匹配 ,否则取整个汉字序列作为待匹配字段直接在分词词典中进行匹配。若字典中存在这样一个字数为 M 的词 ,则匹配成功 ,匹配字段被作为一个词切分出来 ;若词典中找不到这样的词 ,则匹配失败 ,将待匹配字段中的最后一个字去掉,将剩下的汉字序列作为待匹配字段重新在字典中进行匹配处理……如此进行下去 ,直到匹配成功 ,即切分出一个词 ,或者直到剩余字串的长度为 1 为止 ,即为一个单字。这样就完成了一轮查找匹配 ,然后取剩下的汉字序列以同样的方法进行匹配处理 , 直到文档被扫描完为止。






 


2.代码:


public class MM {

    String Maxlen;
    ArrayList<String> dict;
    String filename;
    String s;
    String subs;
    String result = "";

    public MM(String filename) {
        dict = new ArrayList<String>();
        this.filename = filename;
    }

    //最大正向匹配算法
    public String MMwork(int len, String sen) {
        while (sen.length() != 1) {
            while (true) {
                if (len < sen.length()) {
                    s = sen.substring(0, len);
                } else {
                    len = sen.length();
                    s = sen.substring(0, len);
                }
                if (dict.contains(s) || len == 1) {
                    result = result + s + "/";
                    break;
                } else {
                    len = len - 1;
                }
            }
            sen = sen.substring(len);
            len = 3;

        }
        result = result + sen + "/";

        return result;
    }

    //载入字典,这里我是用的字典格式为  字,词性 例如:冮,nr 揳入,v
    public void readdict() throws IOException {
        try {
            File fileName = new File(filename);
            BufferedReader br = new BufferedReader(new FileReader(fileName));
            String line;
            while ((line = br.readLine()) != null) {
                String[] element;
                element = line.trim().split(",");
                dict.add(element[0]);
            }

        } catch (FileNotFoundException fileNotFoundException) {
            System.out.println("找不到文件!");
        }
    }

}


注意:

字典格式的格式改为UTF-8不会乱码。

版权声明:本文为yin5627原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/yin5627/article/details/78231914