交互运行stanford解析器(使用stdin和stdout)或将其作为服务器运行

时间:2019-04-27 16:48:33

标签: subprocess stanford-nlp

我发现,当有新输入出现时,重新启动解析器效率不高,因此我想以交互方式运行解析器-从stdin读取输入并将结果打印到stdout。但是,官方网站Can I have the parser run as a filter?上提供的说明似乎与选项(例如-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 :(得分:0)

我认为您使事情有些混乱。 CoreNLP和Stanford Parser都可以选择作为命令行过滤器运行,从stdin读取并写入stdout。但是,只有CoreNLP单独提供Web服务实现。

port之类的选项仅对后者有意义。

因此,目前,我同意您有一个有效的用例(希望输入预先标记的文本),但是目前尚无Web服务支持。最简单的方法是为解析器编写一个简单的Web服务实现。对于我们来说,这可能会在某个时候发生,但是还有其他许多当前优先事项。欢迎其他人写一个。 :)