Как заставить Stanford NLP распознавать именованные объекты по нескольким словам - PullRequest
0 голосов
/ 01 февраля 2019

Прежде всего позвольте мне сказать, что я новичок в НЛП.Хотя, как вы читаете, это, вероятно, станет поразительно очевидным.

Я анализирую страницы Википедии, чтобы найти все упоминания заголовка страницы.Я делаю это, просматривая CorefChainAnnotations, чтобы найти «правильные» упоминания - тогда я предполагаю, что наиболее распространенные из них говорят о заголовке страницы.Я делаю это, выполняя это:

    Properties props = new Properties();
    props.setProperty("annotators", "tokenize,ssplit,pos,lemma,ner,parse,coref");
    StanfordCoreNLP pipeline = new StanfordCoreNLP(props);
    String content = "Abraham Lincoln was an American politician and lawyer who served as the 16th President of the United States from March 1861 until his assassination in April 1865. Lincoln led the United States through its Civil War—its bloodiest war and perhaps its greatest moral, constitutional, and political crisis.";
    Annotation document = new Annotation(content);
    pipeline.annotate(document);
    for (CorefChain cc : document.get(CorefCoreAnnotations.CorefChainAnnotation.class).values()) {
        List<CorefChain.CorefMention> corefMentions = cc.getMentionsInTextualOrder();
        for (CorefChain.CorefMention cm : corefMentions) {
            if (cm.mentionType == Dictionaries.MentionType.PROPER) {
                log("Proper ref using " + cm.mentionSpan + ", " + cm.mentionType);
            }
        }
    }

Это возвращает:

Proper ref using the United States
Proper ref using the United States
Proper ref using Abraham Lincoln
Proper ref using Lincoln

Я уже знаю, что "Авраам Линкольн" определенно то, что я ищу, и я могу предположить это, потому что "Линкольн ", кажется, также много, тогда это должен быть другой способ говорить о главном предмете.(Я понимаю, что сейчас самым распространенным именем является «Соединенные Штаты», но как только я заполнил всю страницу целиком, она отлично работает).

Это прекрасно работает, пока у меня не появится страница типа «Унесенныеветер".Если я изменю свой код, чтобы использовать это:

String content = "Gone with the Wind has been criticized as historical revisionism glorifying slavery, but nevertheless, it has been credited for triggering changes to the way African-Americans are depicted cinematically.";

, тогда я не получу никаких должных упоминаний.Я подозреваю, что это связано с тем, что ни одно из слов в названии не распознается как именованные объекты.

Можно ли заставить Стэнфорд НЛП распознать "Унесенные ветром" в качестве уже известного именованного объекта?Из-за того, что я смотрю в интернете, мне кажется, что это требует обучения модели, но я хочу, чтобы это было известное именованное право только для этого одиночного прогона, и я не хочу, чтобы модель запомнила это обучение позже.

IМожно только представить, как эксперты НЛП закатывают глаза на ужасность такого подхода, но он становится лучше!Мне пришла в голову прекрасная идея изменить любое вхождение заголовка страницы на «Thingamijig» перед передачей текста в Stanford NLP, который отлично работает для «Gone with the Wind», но затем потерпел неудачу для «Abraham Lincoln», потому что (я думаю)NER больше ассоциирует «Lincoln» с «Thingamijig» в corefentions.

В мире моей мечты я бы сделал что-то вроде:

    pipeline.addKnownNamedEntity("Gone with the Wind");

Но это не то, что ямогу сделать, и я не совсем уверен, как это сделать.

1 Ответ

0 голосов
/ 02 февраля 2019

Вы можете отправить словарь с любыми фразами, которые вы хотите, и чтобы они распознавались как именованные сущности.

java -Xmx4g -cp "*" edu.stanford.nlp.pipeline.StanfordCoreNLP -annotators tokenize,ssplit,pos,lemma,ner -ner.additional.regexner.mapping additional.rules -file example.txt -outputFormat text

extra.rules

Gone With The Wind    MOVIE    MISC    1

Обратите внимание, что столбцы выше должны быть на вкладке-delimited.В файле additional.rules может быть столько строк, сколько вы хотите.

Одно предупреждение, КАЖДЫЙ ВРЕМЯ, когда появляется шаблон токена, будет помечено.

Подробнее здесь: https://stanfordnlp.github.io/CoreNLP/ner.html

...