Извлечение всех существительных, формы прилагательных и текста через анализатор Стэнфорда - PullRequest
3 голосов
/ 18 мая 2011

Я пытаюсь извлечь все существительные и прилагательные из данного текста через анализатор Стэнфорда.

Моя текущая попытка состоит в использовании сопоставления с образцом в getChildrenAsList () Tree-Object для нахождения таких объектов, как:

(NN paper), (NN algorithm), (NN information), ...      

и сохранения их в массиве.

Входное предложение:

В этой статье мы представляем алгоритм, который извлекает семантическую информацию из произвольного текста.

Result - String:

[(S (PP (IN In) (NP (DT this) (NN paper))) (NP (PRP we)) (VP (VBP present) (NP (NP (DT an) (NN algorithm)) (SBAR (WHNP (WDT that)) (S (VP (VBD extracts) (NP (JJ semantic) (NN information)) (PP (IN from) (NP (DT an) (ADJP (JJ arbitrary)) (NN text)))))))) (. .))]

Я пытаюсь использовать сопоставление с образцом, потому что не могу найти метод в анализаторе Стэнфорда, который возвращает все классы слов, например, существительные.

Есть ли лучший способ для извлечения этих классов слов или парсер предоставляет конкретные методы?

public static void main(String[] args) {
    String str = "In this paper we present an algorithm that extracts semantic information from an arbitrary text.";
    LexicalizedParser lp = new LexicalizedParser("englishPCFG.ser.gz"); 
    Tree parseS = (Tree) lp.apply(str);
    System.out.println("tr.getChildrenAsList().toString()"+ parseS.getChildrenAsList().toString());
    }
}

Ответы [ 2 ]

6 голосов
/ 21 мая 2011

Кстати, если все, что вам нужно, это части речи, такие как существительные и глаголы, вы должны просто использовать часть речевого тегера, такого как Stanford POS tagger.Он будет работать на пару порядков быстрее и будет, по крайней мере, столь же точным.

Но вы можете сделать это с помощью анализатора.Вы хотите метод taggedYield(), который возвращает List<TaggedWord>.Таким образом, у вас есть

List<TaggedWord> taggedWords = (Tree) lp.apply(str);
for (TaggedWord tw : taggedWords) {
  if (tw.tag().startsWith("N") || tw.tag().startsWith("J")) {
    System.out.printf("%s/%s%n", tw.word(), tw.tag());
  }
}

(Этот метод обрезает угол, зная, что все и только прилагательные и существительные теги начинаются с J или N в наборе тегов древовидного банка Penn. В более общем случае вы можете проверить членство в наборетегов.)

ps Использование тега stanford-nlp лучше всего подходит для инструментов Stanford NLP при работе со стеком.

1 голос
/ 05 июля 2012

Я уверен, что вы будете знать о nltk (инструментарий естественного языка), просто установите эту библиотеку python, а также maxent pos tagger вместе с ней, и следующий код должен сработать.Tagger был обучен на Penn, поэтому теги не отличаются.Код выше нет, но я люблю nltk, следовательно.

    import nltk
    nouns=[]
    adj=[]
     #read the text into the variable "text"
    text = nltk.word_tokenize(text)
    tagged=nltk.pos_tag(text)
    for i in tagged:
      if i[1][0]=="N":
        nouns+=[i[0]]
      elif i[1][0]=="J":
        adj+=[i[0]]
...