Stanford вернуть все найденные выражения - PullRequest
0 голосов
/ 21 сентября 2018

Есть ли способ вернуть все совпадающие выражения?

Рассмотрим следующее предложение

John Snow killed Ramsay Bolton

где John-NNP, Snow-NNP, killed- VBD, Ramsay-NNP,Bolton-NNP

И я использую следующую комбинацию тегов в качестве правил

NNP-NNP
NNP-VBD
VBD-NNP

, и ожидаемые подходящие слова из приведенных выше правил:

John Snow, Snow killed, killed Ramsay, Ramsay Bolton

Но используяВ приведенном ниже коде я получаю только это как совпавшее выражение:

[John Snow, killed Ramsay]

Есть ли способ в stanford получить все ожидаемые совпадающие слова из предложения?Это код и файл правил, которые я сейчас использую:

import com.factweavers.multiterm.SetNLPAnnotators;
    import edu.stanford.nlp.ling.CoreAnnotations;
    import edu.stanford.nlp.ling.tokensregex.CoreMapExpressionExtractor;
    import edu.stanford.nlp.ling.tokensregex.Env;
    import edu.stanford.nlp.ling.tokensregex.NodePattern;
    import edu.stanford.nlp.ling.tokensregex.TokenSequencePattern;
    import edu.stanford.nlp.pipeline.Annotation;
    import edu.stanford.nlp.pipeline.StanfordCoreNLP;
    import edu.stanford.nlp.util.CoreMap;
    import java.util.List;
    import java.util.regex.Pattern;

    public class StanfordTest {
        public static void main(String[] args) {
            String rulesFile="en.rules";
            Env env = TokenSequencePattern.getNewEnv();
            env.setDefaultStringMatchFlags(NodePattern.NORMALIZE);
            env.setDefaultStringPatternFlags(Pattern.CASE_INSENSITIVE);
            env.bind("collapseExtractionRules", false);

            CoreMapExpressionExtractor extractor= CoreMapExpressionExtractor.createExtractorFromFiles(env, rulesFile);


            String content="John Snow killed Ramsay Bolton";
            Annotation document = new Annotation(content);
            SetNLPAnnotators snlpa = new SetNLPAnnotators();
            StanfordCoreNLP pipeline = snlpa.setAnnotators("tokenize, ssplit, pos, lemma, ner");
            pipeline.annotate(document);
            List<CoreMap> sentences = document.get(CoreAnnotations.SentencesAnnotation.class);

            sentences.parallelStream().forEach(sentence -> {
                System.out.println(extractor.extractExpressions(sentence));
            });
        }
    }

en.rules

{
   ruleType:"tokens",
   pattern:([{tag:/VBD/}][ {tag:/NNP/}]),
   result:"result1"
}

{
   ruleType:"tokens",
   pattern:([{tag:/NNP/}][ {tag:/VBD/}]),
   result:"result2"
}

{
   ruleType:"tokens",
   pattern:([{tag:/NNP/}][ {tag:/NNP/}]),
   result:"result3"
}

1 Ответ

0 голосов
/ 22 сентября 2018

Я думаю, вам нужно создать разные экстракторы для разных вещей, которые вы хотите.

Проблема здесь в том, что, когда у вас есть две последовательности правил тегов части речи, которые перекрываются, как эта, первая, которая получаетmatched поглощает токены, препятствующие сопоставлению второго шаблона.

Таким образом, если (NNP, NNP) является первым правилом, "Джон Сноу" получает соответствие.Но тогда Снег не может быть сопоставлен с «Снег убит».

Если у вас есть набор шаблонов, которые пересекаются, как это, вы должны распутать их и поместить в отдельные экстракторы.

Таким образом, вы можете иметь, например, экстрактор (существительное, глагол) и отдельный экстрактор (существительное, существительное).

...