在Python中使用Stanford Tregex

时间:2017-03-15 06:20:24

标签: python parsing pattern-matching subprocess stanford-nlp

我是NLP和Python的新手。我试图通过使用Tregex工具和Python子流程库从StanfordCoreNLP中提取解析树中的名词短语子集。特别是,我试图找到并提取符合以下模式的名词短语:'(NP [$ VP]> S)|(NP [$ VP]> S \ n)|(NP \ n [$在Tregex语法中,VP]> S)|(NP \ n [$ VP]> S \ n)'。

例如,下面是原始文本,保存在名为“text”的字符串中:

text = ('Pusheen and Smitha walked along the beach. "I want to surf", said Smitha, the CEO of Tesla. However, she fell off the surfboard')

使用Python包装器运行StanfordCoreNLP解析器后,我为3个句子获得了以下3棵树:

output1['sentences'][0]['parse']

Out[58]: '(ROOT\n  (S\n    (NP (NNP Pusheen)\n      (CC and)\n      (NNP Smitha))\n    (VP (VBD walked)\n      (PP (IN along)\n        (NP (DT the) (NN beach))))\n    (. .)))'

output1['sentences'][1]['parse']

Out[59]: "(ROOT\n  (SINV (`` ``)\n    (S\n      (NP (PRP I))\n      (VP (VBP want)\n        (PP (TO to)\n          (NP (NN surf) ('' '')))))\n    (, ,)\n    (VP (VBD said))\n    (NP\n      (NP (NNP Smitha))\n      (, ,)\n      (NP\n        (NP (DT the) (NNP CEO))\n        (PP (IN of)\n          (NP (NNP Tesla)))))\n    (. .)))"

output1['sentences'][2]['parse']

Out[60]: '(ROOT\n  (S\n    (ADVP (RB However))\n    (, ,)\n    (NP (PRP she))\n    (VP (VBD fell)\n      (PRT (RP off))\n      (NP (DT the) (NN surfboard)))))'

我想提取以下3个名词短语(每个句子一个)并将它们保存为Python中的变量(或标记列表):

  • (NP(NNP Pusheen)\ n(CC and)\ n(NNP Smitha))
  • (NP(PRP I))
  • (NP(PRP she))

为了您的信息,我使用了命令行中的tregex,代码如下:

cd stanford-tregex-2016-10-31
java -cp 'stanford-tregex.jar:' edu.stanford.nlp.trees.tregex.TregexPattern -f -s '(NP[$VP]>S)|(NP[$VP]>S\n)|(NP\n[$VP]>S)|(NP\n[$VP]>S\n)' /Users/AS/stanford-tregex-2016-10-31/exampletree.txt

输出结果为:

Pattern string:
(NP[$VP]>S)|(NP[$VP]>S\n)|(NP\n[$VP]>S)|(NP\n[$VP]>S\n)
Parsed representation:
or
   Root NP
      and
         $ VP
         > S
   Root NP
      and
         $ VP
         > S\n
   Root NP\n
      and
         $ VP
         > S
   Root NP\n
      and
         $ VP
         > S\n
Reading trees from file(s) file path
\# /Users/AS/stanford-tregex-2016-10-31/exampletree.txt
(NP (NNP Pusheen) \n (CC and) \n (NNP Smitha))
\# /Users/AS/stanford-tregex-2016-10-31/exampletree.txt
(NP\n (NP (NNP Smitha)) \n (, ,) \n (NP\n (NP (DT the) (NN spokesperson)) \n   (PP (IN of) \n (NP (DT the) (NNP CIA)))) \n (, ,))
\# /Users/AS/stanford-tregex-2016-10-31/exampletree.txt
(NP (PRP They))
There were 3 matches in total.

如何在Python中复制此结果?

供您参考,我在Google上发现了以下帖子,该帖子与我的问题相关但过时了(https://mailman.stanford.edu/pipermail/parser-user/2010-July/000606.html):

[parser-user] Tregex的变量输入

克里斯托弗·曼宁在斯坦福德 2010年7月7日星期三17:41:32 PDT 2010 嗨海阳,

抱歉,回复缓慢,学年末的事情太忙了。

2010年6月1日晚8点56分,海阳AI写道:

  

亲爱的,

     

我希望这是寻求帮助的合适场所。

虽然我们只能对Python特定的任何内容提供非常有限的帮助.....

但这似乎很简单(我认为)。

如果你想要的是在stdin上输入的树上运行模式,你需要在“NP”之前的参数列表中添加标志“-filter”。

如果在模式之后没有指定文件,并且没有给出标志“-filter”,那么它会在固定的默认句子上运行模式....

克里斯。

  

我正在开发一个与Tregex相关的项目。我试图从python调用Tregex,但我不知道如何将数据提供给Tregex,而不是传统文件,而是来自变量。例如,我正在尝试使用以下代码从给定变量(例如文本,已经解析的树,使用Stanford Parser)计算“NP”的数量,

     

def tregex(文字):
      tregex_dir =“/ root / nlp / stanford-tregex-2009-08-30 /”       op = Popen([“java”,“ - mx900m”,“ - pd”,“stanford-tregex.jar:”,“edu.stanford.nlp.trees.tregex.TregexPattern”,“NP”],           cwd = tregex_dir,           stdout = PIPE,           stdin = PIPE,           stderr = STDOUT)       res = op.communicate(input = text)[0]       返回res

     

结果如下。它没有从变量中搜索内容,但不知何故又回到了“使用默认树”。任何人都可以帮我一把吗?我被困在这里很长一段时间了。非常感谢您的时间和帮助。   图案字符串:   NP   解析表示:   根NP   使用默认树   (NP     (NP(DT this)(NN葡萄酒))     (CC和)     (NP(DT这些)(NNS蜗牛)))

     

(NP(DT this)(NN wine))

     

(NP(DT这些)(NNS蜗牛))

     

共有3场比赛。

     

-   海洋人工智能,博士学生   应用语言学系   宾夕法尼亚州立大学

           

解析器 - 用户邮件列表   lists.stanford.edu上的解析器用户   https://mailman.stanford.edu/mailman/listinfo/parser-user

1 个答案:

答案 0 :(得分:4)

为什么不使用Stanford CoreNLP服务器!

1。)启动服务器!

java -Xmx4g edu.stanford.nlp.pipeline.StanfordCoreNLPServer -port 9000 - timeout 15000

2。)发出python请求!

import requests

url = "http://localhost:9000/tregex"
request_params = {"pattern": "(NP[$VP]>S)|(NP[$VP]>S\\n)|(NP\\n[$VP]>S)|(NP\\n[$VP]>S\\n)"}
text = "Pusheen and Smitha walked along the beach."
r = requests.post(url, data=text, params=request_params)
print r.json()

3.)以下是结果!

{u'sentences': [{u'0': {u'namedNodes': [], u'match': u'(NP (NNP Pusheen)\n  (CC and)\n  (NNP Smitha))\n'}}]}