2017-05-02 35 views
0

我有tokenregex作爲如何修改StanfordNLP中的TokenRegex規則?

$EDU_FIRST_KEYWORD = (/Education/|/Course[s]?/|/Educational/|/Academic/|/Education/ /and/?|/Professional/|/Certification[s]?/ /and/?)

$EDU_LAST_KEYWORD = (/Background/|/Qualification[s]?/|/Training[s]?/|/Detail[s]?/|/Record[s]?/) tokens = { type: "CLASS", value: "edu.stanford.nlp.ling.CoreAnnotations$NamedEntityTagAnnotation" }

{ ruleType: "tokens", pattern: ($EDU_FIRST_KEYWORD $EDU_LAST_KEYWORD ?), result: "EDUCATION" }

我想匹配EDU_FIRST_KEYWORD隨後EDU_LAST_KEYWORD規則文件。如果它不匹配兩個部分,則檢查EDU_FIRST_KEYWORD是否與給定字符串匹配。

E.g. 1.培訓課程&

匹配的輸出:教育(因爲它匹配的課程,這是不應該的)

預期輸出:無輸出

這是因爲它不匹配,要麼第一部分字符串或完整字符串。

  • 教育背景
  • 匹配的輸出:教育

    預期輸出:教育

    我試圖改變pattern: ($EDU_FIRST_KEYWORD $EDU_LAST_KEYWORD ?)pattern: ($EDU_FIRST_KEYWORD + $EDU_LAST_KEYWORD ?)但它並不能幫助。

    我試過stanfordNLP tokenregex文檔,但無法得到如何實現這一點。有人可以幫我改變規則文件嗎? 在此先感謝。

    +0

    在培訓和課程,爲什麼它不」的原因數學是因爲我認爲。您的模式:($ EDU_FIRST_KEYWORD $ EDU_LAST_KEYWORD?)不會爲其他任何關鍵字留下空間。嘗試更改爲$ EDU_FIRST_KEYWORD(?:/和|或|&/)*?$ EDU_LAST_KEYWORD?)並查看它是否有效。 – serendipity

    回答

    1

    您想使用TokenSequenceMatcher的matches()方法讓您的規則針對整個字符串運行。

    如果您使用find()它將搜索整個字符串...如果您使用matches()它會看到整個字符串是否匹配模式。

    在這個時候,我不知道,如果TokensRegexAnnotator可以執行滿弦上的句子相匹配,所以你可能需要使用像這樣的代碼:

    package edu.stanford.nlp.examples; 
    
    import edu.stanford.nlp.util.*; 
    import edu.stanford.nlp.ling.*; 
    import edu.stanford.nlp.ling.tokensregex.Env; 
    import edu.stanford.nlp.ling.tokensregex.TokenSequencePattern; 
    import edu.stanford.nlp.ling.tokensregex.TokenSequenceMatcher; 
    import edu.stanford.nlp.pipeline.*; 
    
    import java.util.*; 
    
    public class TokensRegexExactMatch { 
    
        public static void main(String[] args) { 
        Properties props = new Properties(); 
        props.setProperty("annotators", "tokenize"); 
        StanfordCoreNLP pipeline = new StanfordCoreNLP(props); 
        Annotation annotation = new Annotation("Training & Courses"); 
        pipeline.annotate(annotation); 
        //System.err.println(IOUtils.stringFromFile("course.rules")); 
        Env env = TokenSequencePattern.getNewEnv(); 
        env.bind("$EDU_WORD_ONE", "/Education|Educational|Courses/"); 
        env.bind("$EDU_WORD_TWO", "/Background|Qualification/"); 
        TokenSequencePattern pattern = TokenSequencePattern.compile(env, "$EDU_WORD_ONE $EDU_WORD_TWO?"); 
        List<CoreLabel> tokens = annotation.get(CoreAnnotations.TokensAnnotation.class); 
        TokenSequenceMatcher matcher = pattern.getMatcher(tokens); 
        // matcher.matches() 
        while (matcher.find()) { 
         System.err.println("---"); 
         String matchedString = matcher.group(); 
         List<CoreMap> matchedTokens = matcher.groupNodes(); 
         System.err.println(matchedTokens); 
        } 
        } 
    }