Antlr против NLTK в Jython - PullRequest
       37

Antlr против NLTK в Jython

3 голосов
/ 15 июля 2011

В настоящее время я пишу проект NLP в Java, который помечает и анализирует текст. Моя основная проблема связана с компонентом синтаксического анализа, он в настоящее время использует Antlr для преобразования тегового текста в дерево разбора. Поскольку Antlr изначально не был написан как инструмент синтаксического анализа NL, он занимает много памяти и его трудно адаптировать для изменения грамматики. Я хотел бы использовать NLTK в jython для решения этой проблемы, будет ли это рекомендовано, особенно если учесть, что это распределенный проект или есть аккуратный эквивалент Java для создания этих деревьев разбора.

Спасибо

1 Ответ

3 голосов
/ 15 июля 2011

Вы правы: ANTLR не очень подходит для таких вещей.

У меня нет опыта работы с NLTK, но я пытался сделать "тяжелую работу" через Jython, которая тоже не удаласьну.

У Stanford Natural Language Processing Group есть хороший анализатор NL.То есть я слышал об этом много хорошего, я ни в коем случае не эксперт по НЛП!

Вот как вы можете разобрать простое английское предложение, например "I am currently writing an NLP project in Java that tags and parses text.":

import edu.stanford.nlp.ling.*;
import edu.stanford.nlp.objectbank.*;
import edu.stanford.nlp.parser.lexparser.*;
import edu.stanford.nlp.process.*;
import edu.stanford.nlp.trees.*;
import java.io.*;
import java.util.*;

public class StanfordParserDemo {

  public static void main(String[] args) throws Exception {

    // englishPCFG.ser.gz is in the download. 
    LexicalizedParser parser = new LexicalizedParser("/path/to/englishPCFG.ser.gz");
    TokenizerFactory<Word> tokenFactory = PTBTokenizer.factory(false, new WordTokenFactory());

    String sentence = "I am currently writing an NLP project in Java that tags and parses text.";
    System.out.println("Sentence: " + sentence);

    List<Word> words = tokenFactory.getTokenizer(new StringReader(sentence)).tokenize();
    parser.parse(words);

    Tree tree = parser.getBestParse();
    TreePrint treePrinter = new TreePrint("penn,typedDependenciesCollapsed");
    treePrinter.printTree(tree);
  }
}

который печатает:

Sentence: I am currently writing an NLP project in java that tags and parses text.
(ROOT
  (S
    (NP (PRP I))
    (VP (VBP am)
      (ADVP (RB currently))
      (VP (VBG writing)
        (NP (DT an) (NNP NLP) (NN project))
        (PP (IN in)
          (NP (NN java)))
        (SBAR (IN that)
          (S
            (NP (NNS tags)
              (CC and)
              (NNS parses))
            (VP (VBZ text))))))
    (. .)))

JAR и грамматику для различных языков можно скачать здесь .

...