1

我想在 python 中使用 syntaxnet 的解析器标签(例如:VBD ROOT、NN nsubj 等)来帮助创建一个聊天机器人。输入在控制台中完成。

问题:我怎样才能在变量中获得只有 VBP ROOT 的结果而不是其他的结果?我能够通过这个调用打印解析树的 ASCII 版本:subprocess.call(["echo 'Bob brought the pizza to Alice.' | syntaxnet/demo.sh"], shell =True)但我对如何获取特定变量并将其存储在 python 变量中有点困惑。

ps:我一周前开始学习python。

4

3 回答 3

3

如果您是 Python 初学者,并且您只想使用词性 (POS) 标签,那么 SyntaxNet 可能有点矫枉过正。SpaCy易于使用且非常准确。

于 2016-07-08T21:35:37.337 回答
3

我也是 python 和 SyntaxNet 的初学者。我所做的是通过删除将 SyntaxNet 的输出从树更改为制表符分隔的文本文件

  bazel-bin/syntaxnet/conll2tree \
  --task_context=$MODEL_DIR/context.pbtxt \
  --alsologtostderr

来自SyntaxNet文件夹中的 demo.sh。运行此命令回显'open Book, which I have written with laboratory writer, with libreoffice writer.' | syntaxnet/demo.sh > output.txt

文本文件是这样的:

在此处输入图像描述

然后您可以使用 读取数据csv.reader,将其转到list然后搜索sublists(列号从“0”开始)的第 4 列和第 7 列以查找ROOT

我把上面解释的代码:

#read from Syntaxnet output tab delimited textfile
def readata(filename):
      file=open(filename,'r')
      lines=file.readlines()
      lines=lines[:-1]
      data=csv.reader(lines,delimiter='\t')
#make a list of lists
      lol=list(data)
      return  lol
#find the verb which is ROOT of the sentence
      lists=readata(filename)
      for sublist in lists:
            if sublist[7]=='ROOT' and sublist[4]=='VBP': 
                  word=sublist[1]

请注意,此代码是由 bignner 编写的,但它至少对我有用。

于 2016-07-13T18:33:48.370 回答
2

我在我的博客上写了一篇简单的文章,展示了如何将 syntaxnet 输出加载到 NLTK 的结构中,以获取基于 PoS 和依赖关系的名词短语到 DependencyGraph 中:

http://www.davidsbatista.net/blog/2017/03/25/syntaxnet/

于 2017-04-13T08:16:54.010 回答