Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于树结构的产生式规则,带re但不带nltk_Python_Regex - Fatal编程技术网

Python 基于树结构的产生式规则,带re但不带nltk

Python 基于树结构的产生式规则,带re但不带nltk,python,regex,Python,Regex,我想从树结构中提取规则,而不使用自然语言工具包(NLTK)。 例如:;树形结构为: ( NP-TMP ( NNP December ) ( CD 1998 ) ) \n 我想提取规则,以便: NP-TMP -> NNP CD NNP -> 'December' CD -> '1998' 如何在Python中使用re库而不使用“nltk”?一个非常不优雅的解决方案是 import re s_expr = "( NP-TMP ( NNP December ) (

我想从树结构中提取规则,而不使用自然语言工具包(NLTK)。
例如:;树形结构为:

( NP-TMP ( NNP December  )  ( CD 1998  )  )  \n
我想提取规则,以便:

NP-TMP -> NNP CD
NNP -> 'December'
CD -> '1998'

如何在Python中使用
re
库而不使用“nltk”?一个非常不优雅的解决方案是

import re

s_expr = "( NP-TMP ( NNP December  )  ( CD 1998  )  )"
regex = re.compile("([\\w-]+)")

matches = re.findall(regex, s_expr)
# assert the s-expressions are 5
assert (len(matches) == 5)
print matches[0], matches[1], matches[3]
print matches[1], matches[2]
print matches[3], matches[4]

这里我假设所有的s表达式或树都有两个后代,如果不是,这是行不通的,也许手工制作的解析器比正则表达式更好。

所有的树都是这样吗?您需要描述多个规则,以便更清楚地了解您是从固定模式进行简单提取还是解析s表达式。正则表达式是正则的,因为它是递归语法的子集。也就是说,它无法解析递归语法的产物,而这正是您试图做的。然而,如果出于某种原因您反对使用NLTK,您可以查看任何Lisp解析器(它们通常不是很复杂)来了解如何解析它。还有其他库可以帮助您构建特殊类型的解析器。我没有用过,但看起来还可以。我树结构中的每个节点都有2个或1个节点,当我想提取它的规则时,我不知道它的格式(因为它应该是自动提取的。根据您的解决方案,我不能自动提取。@serenei fgufyurzt您可以检查匹配的数字,在它们成对时断言,并循环它们,在我看来这很容易,只是它不是很优雅(一点也不优雅)。