stanford corenlp自定义切词类

stanford corenlp的中文切词有时不尽如意,那我们就需要实现一个自定义切词类,来完全满足我们的私人定制(加各种词典干预)。上篇文章《IKAnalyzer》介绍了IKAnalyzer的自由度,本篇文章就说下怎么把IKAnalyzer作为corenlp的切词工具。

stanford corenlp的TokensRegex》提到了corenlp的配置CoreNLP-chinese.properties,其中customAnnotatorClass.segment就是用于指定切词类的,在这里我们只需要模仿ChineseSegmenterAnnotator来实现一个自己的Annotator,并设置在配置文件中即可。

customAnnotatorClass.segment = edu.stanford.nlp.pipeline.ChineseSegmenterAnnotator

下面是我的实现:

public class IKSegmenterAnnotator extends ChineseSegmenterAnnotator {
    public IKSegmenterAnnotator() {
        super();
    }

    public IKSegmenterAnnotator(boolean verbose) {
        super(verbose);
    }

    public IKSegmenterAnnotator(String segLoc, boolean verbose) {
        super(segLoc, verbose);
    }

    public IKSegmenterAnnotator(String segLoc, boolean verbose, String serDictionary, String sighanCorporaDict) {
        super(segLoc, verbose, serDictionary, sighanCorporaDict);
    }

    public IKSegmenterAnnotator(String name, Properties props) {
        super(name, props);
    }

    private List<String> splitWords(String str) {
        try {
            List<String> words = new ArrayList<String>();
            IKSegmenter ik = new IKSegmenter(new StringReader(str), true);
            Lexeme lex = null;
            while ((lex = ik.next()) != null) {
                words.add(lex.getLexemeText());
            }
            return words;
        } catch (IOException e) {
            //LOGGER.error(e.getMessage(), e);
            System.out.println(e);
            List<String> words = new ArrayList<String>();
            words.add(str);
            return words;
        }
    }

    @Override
    public void runSegmentation(CoreMap annotation) {
        //0 2
        // A BC D E
        // 1 10 1 1
        // 0 12 3 4
        // 0, 0+1 ,

        String text = annotation.get(CoreAnnotations.TextAnnotation.class);
        List<CoreLabel> sentChars = annotation.get(ChineseCoreAnnotations.CharactersAnnotation.class);
        List<CoreLabel> tokens = new ArrayList<CoreLabel>();
        annotation.set(CoreAnnotations.TokensAnnotation.class, tokens);

        //List<String> words = segmenter.segmentString(text);
        List<String> words = splitWords(text);
        System.err.println(text);
        System.err.println("--->");
        System.err.println(words);

        int pos = 0;
        for (String w : words) {
            CoreLabel fl = sentChars.get(pos);
            fl.set(CoreAnnotations.ChineseSegAnnotation.class, "1");
            if (w.length() == 0) {
                continue;
            }
            CoreLabel token = new CoreLabel();
            token.setWord(w);
            token.set(CoreAnnotations.CharacterOffsetBeginAnnotation.class, fl.get(CoreAnnotations.CharacterOffsetBeginAnnotation.class));
            pos += w.length();
            fl = sentChars.get(pos - 1);
            token.set(CoreAnnotations.CharacterOffsetEndAnnotation.class, fl.get(CoreAnnotations.CharacterOffsetEndAnnotation.class));
            tokens.add(token);
        }
    }
}

在外面为IKAnalyzer初始化词典,指定扩展词典和删除词典

        //为ik初始化词典,删除干扰词
        Dictionary.initial(DefaultConfig.getInstance());
        String delDic = System.getProperty(READ_IK_DEL_DIC, null);
        BufferedReader reader = new BufferedReader(new FileReader(delDic));
        String line = null;
        List<String> delWords = new ArrayList<>();
        while ((line = reader.readLine()) != null) {
            delWords.add(line);
        }
        Dictionary.getSingleton().disableWords(delWords);

  

  

  

时间: 2024-10-12 17:18:46

stanford corenlp自定义切词类的相关文章

Stanford Corenlp学习笔记——词性标注

使用Stanford Corenlp对中文进行词性标注 语言为Scala,使用的jar的版本是3.6.0,而且是手动添加jar包,使用sbt添加其他版本的时候出现了各种各样的问题 添加的jar包有5个 代码 import edu.stanford.nlp.pipeline.{Annotation, StanfordCoreNLP} /** * Created by common on 17-5-13. */ object NLPLearning { def main(args: Array[St

将Stanford CoreNLP的解析结果构造为json格式

首次处理英文语料,需要进行一些基础的NLP处理,首选工具当然是Stanford CoreNLP.由于Stanford CoreNLP官方示例的解析结果不宜直接使用,所以我在它的基础上进行修改,最终将解析结果转为json格式,并依照哈工大ltp的解析结果的格式,将依存句法的解析结果也添加到json中. 1.Stanford CoreNLP的安装 最新版的Stanford CoreNLP仅支持jdk1.8,这比较奇葩,因为目前多数机器的jdk还只是1.6或1.7,最以我下载了支持jdk1.6的最后一

Eclipse下使用Stanford CoreNLP的方法

源码下载地址:CoreNLP官网. 目前release的CoreNLP version 3.5.0版本仅支持java-1.8及以上版本,因此有时需要为Eclipse添加jdk-1.8配置,配置方法如下: 首先,去oracle官网下载java-1.8,下载网址为:java下载,安装完成后. 打开Eclipse,选择Window -> Preferences -> Java –> Installed JREs 进行配置: 点击窗体右边的“add”,然后添加一个“Standard VM”(应该

【转载】Stanford CoreNLP Typed Dependencies

总结自Stanford typed dependencies manual 原文链接:http://www.jianshu.com/p/5c461cf096c4 依存关系描述句子中词与词之间的各种语法关系.一句句子可以表示成如下的依存关系树. Bell, based in Los Angeles, makes and distributes electronic, computer and building products. CoreNLP中的依存关系有50来种(都是二元的关系),下面总结:

自定义切圆角 IOS

NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:@"进击的巨人"]; NSShadow *shadow = [[NSShadow alloc]init]; shadow.shadowColor = [UIColor darkGrayColor]; shadow.shadowBlurRadius = 1; [attString setAttributes:[N

Stanford Parser 详细使用

http://blog.csdn.net/pipisorry/article/details/42976457 stanford-parser的使用 1.到斯坦福官方网站http://nlp.stanford.edu/software/lex-parser.shtml下载软件包,解压. 2.在eclipse中新建一个java project,把解压得到根目录下的stanford-parser.jar和stanford-parser-3.*.*-models.jar两个包导入项目到项目引用包中,

Standford CoreNLP

Stanford CoreNLP Stanford CoreNLP提供一组自然语言处理的工具.这些工具可以把原始英语文本作为输入,输出词的基本形式,词的词性标记,判断词是否是公司名.人名等,规格化日期.时间.数字量,剖析句子的句法分析树和词依存,指示那些名词短语指代相同的实体.Stanford CoreNLP是一个综合的框架,这可以很简单的使用工具集的一个分支分析一小块文本.从简单的文本开始,你可以仅仅使用两行代码对它运行所有的工具. Stanford CoreNLP集合了词性标注器,命名实体识

Stanford CoreNLP--Part of Speech

Stanford CoreNLP Part Of Speech简称POS,主要是对待分析的句子中的单词进行标记的功能,如标记名词.动词等,该组件是CoreNLP工程的一部分,详细内容可参考:CoreNLP POS,使用POS

Python自然语言处理工具小结

Python自然语言处理工具小结 作者:白宁超 2016年11月21日21:45:26 1 Python 的几个自然语言处理工具 NLTK:NLTK 在用 Python 处理自然语言的工具中处于领先的地位.它提供了 WordNet 这种方便处理词汇资源的借口,还有分类.分词.除茎.标注.语法分析.语义推理等类库. Pattern:Pattern 的自然语言处理工具有词性标注工具(Part-Of-Speech Tagger),N元搜索(n-gram search),情感分析(sentiment a