запустите stanford parser в интерактивном режиме (используя stdin и stdout) или запустите его как сервер - PullRequest
0 голосов
/ 27 апреля 2019

Мне показалось неэффективным перезагружать анализатор при поступлении нового ввода, поэтому я хотел бы запустить анализатор в интерактивном режиме - прочитать ввод из stdin и распечатать результат в stdout. Однако инструкция, приведенная на официальном сайте Можно ли запустить анализатор в качестве фильтра? кажется несовместимым с параметрами (например, -port).

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

Вот что я пытаюсь:

class myThread(threading.Thread):
def __init__(self,inQueue,outQueue):
    threading.Thread.__init__(self)

    self.cmd=['java.exe',
              '-mx4g',
              '-cp','*',
              'edu.stanford.nlp.parser.lexparser.LexicalizedParser',
              '-model', 'edu/stanford/nlp/models/lexparser/chinesePCFG.ser.gz',
              '-sentences', 'newline',
              '-outputFormat', 'conll2007', 
              '-tokenized',
              '-tagSeparator','/',
              '-tokenizerFactory', 'edu.stanford.nlp.process.WhitespaceTokenizer',
              '-tokenizerMethod', 'newCoreLabelTokenizerFactory',
              '-encoding', 'utf8']
    self.subp=subprocess.Popen(cmd,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
    self.inQueue=inQueue
    self.outQueue=outQueue
def run(self):
    while True:
        rid,sentence=self.inQueue.get()
        print(u"Receive sentence %s"%sentence)
        sentence=sentence.replace("\n","")
        self.subp.stdin.write((sentence+u'\n').encode('utf8'))
        self.subp.stdin.flush()
        print("start readline")
        result=self.subp.stdout.readline()
        print("end readline")
        print(result)
        self.outQueue.put((rid,result))

1 Ответ

0 голосов
/ 28 апреля 2019

Я думаю, ты немного путаешься. И CoreNLP, и Stanford Parser имеют возможность работать в качестве фильтра командной строки, читая из stdin и записывая в stdout. Однако только CoreNLP отдельно обеспечивает реализацию веб-сервиса.

Опции типа port имеют смысл только для последних.

Итак, на данный момент я согласен с тем, что у вас есть действительный вариант использования (вы хотите ввести предварительно помеченный текст), но в настоящее время поддержка веб-сервиса для него отсутствует. Самый простой путь вперед - написать простую реализацию веб-сервиса для парсера. Для нас это может произойти когда-нибудь, но есть множество других текущих приоритетов. Любой другой может написать один. :)

...