JAVA简易分词-工具

  1. 由于业务需要.需要根据自定义词库。对文本匹配内容进行。添加超链接.

  2. 没有找到理想的JAVA分词工具.以前用IK.由于IK 词库使用静态变量存储.公用一个词库.导致不能实现单VM多词库

  3. 写完后被告知,功能被砍掉 -。-   ,为了让代码稍微有点价值就决定分享。欢迎吐槽.

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.TreeMap;

/**
 * 指定词库简易分词的工具.
 * 
 * 1.找不到好的词库.IK分词 一个JAVA虚拟机只能有一个词库。(全局静态变量存储。)又不愿意搞黑科技
 * 2.其他词库。被墙或者文档不全。不知道是否可靠。JAR包依赖问题
 * @author  heyadong
 * @version 1.0,2015年5月25日
 */
public class Fenci {
    
    Dictionary dictionary = new Dictionary();
    
    @SuppressWarnings("rawtypes")
    private static class Dictionary extends TreeMap {
        public Dictionary(){}
        private static final long serialVersionUID = 2913462761122331761L;
        protected boolean hasWord = false;
        protected String path = "";
        
    }
    public static class Record{
        public Record(String word, int index){
            this.word = word;
            this.index = index;
        }
        private String word;
        private int index;
        public String getWord() {
            return word;
        }
        public int getIndex() {
            return index;
        }
        @Override
        public String toString() {
            return String.format("%s:%s", word, index);
        }
    }
    
    @SuppressWarnings("unchecked")
    public void addWords(Collection<String> words) {
        for (String w : words) {
            Dictionary node = dictionary;
            for (int i = 0 ; i < w.length(); i++) {
                Character c = w.charAt(i);
                Dictionary t = (Dictionary) node.get(c);
                if (t == null) {
                    for (int j = i; j < w.length(); j++) {
                        Dictionary d = new Dictionary();
                        d.path = node.path + w.charAt(j);
                        node.put(w.charAt(j), d);
                        node = d;
                    }
                    break;
                } else {
                    node = t;
                }
            }
            node.hasWord = true;
        }
    }
    
    //最小匹配
    public List<Record> min(String text) {
        List<Record> words = new ArrayList<Record>();
        for (int start = 0 ; start < text.length(); start++) {
            int offset = 0;
            Dictionary root = dictionary;
            while(start + offset < text.length()) {
                Character c = text.charAt(start + offset);
                Dictionary dictionary = (Dictionary) root.get(c);
                if (dictionary == null) {
                    break;
                } else {
                    if (dictionary.hasWord) {
                        words.add(new Record(dictionary.path, start));
                    }
                    root = dictionary;
                }
                offset++;
            }
        }
        return words;
    }
    
    
    //最大匹配
    public List<Record> max(String text) {
        List<Record> words = new ArrayList<Record>();
        String word = null;
        for (int index = 0 ; index < text.length(); index++) {
            Dictionary root = dictionary;
            int offset = 0;
            while (index + offset < text.length()) {
                Character c = text.charAt(index + offset);
                Dictionary dictionary = (Dictionary) root.get(c);
                if (dictionary == null) {
                    if (word != null) {
                        words.add(new Record(word, index));
                        word = null;
                        index += offset - 1;
                    }
                    break;
                } else {
                    if (dictionary.hasWord) {
                        word = dictionary.path;
                    }
                    root = dictionary;
                }
                offset += 1;
            }
            
            
            if (word != null && index + offset == text.length()) {
                words.add(new Record(word, index));
                return words;
            }
        }
        return words;
    }
    
    public static void main(String[] args) {
        List<String> words = new ArrayList<String>();
        words.add("中国");
        words.add("中华人民");
        words.add("中华人民共和国");
        words.add("代表");
        words.add("人民");
        words.add("发言");
        words.add("群众");
        words.add("欢迎");
        Fenci fenci = new Fenci();
        fenci.addWords(words);;
        
        String text = "中华人民共和国..中国人大代表发言.群众人民热烈欢迎..解决就就";
        
        
        System.out.println(text);
        System.out.println(text.length());
        System.out.println("max:" + fenci.max(text));
        System.out.println("min:" + fenci.min(text));
        
        
        
        
        // 添加链接测试
        List<Record> records = fenci.max(text);
        //从后往前替换.从前往后替换。会导致index错位
        for (int i = records.size() - 1; i >=0; i--) {
            Record r = records.get(i);
//            System.out.println(text.substring(r.index, r.word.length() + r.index));
            text = text.substring(0, r.index) + String.format("%s %s %s", "<a href=\"http://1\">",  text.substring(r.index, r.index + r.word.length()), "</a>")  + text.substring(r.index + r.word.length());
            
        }
        System.out.println(text);
    }
}


你可能感兴趣的:(JAVA简易分词-工具)