python - 如何匹配NLTK CFG中的整数?

标签 python regex nlp nltk

如果我想定义一种语法,其中一个标记将匹配一个整数,我如何使用nltk的字符串CFG来实现它?

例如 -

S -> SK SO FK
SK -> 'SELECT'
SO -> '\d+'
FK -> 'FROM'

最佳答案

创建一个数字短语,如下所示:

import nltk

groucho_grammar = nltk.CFG.fromstring("""
S -> NP VP
PP -> P NP
NP -> Det N | Det N PP | 'I' | NUM N
VP -> V NP | VP PP
Det -> 'an' | 'my'
N -> 'elephant' | 'pajamas' | 'elephants'
V -> 'shot'
P -> 'in'
NUM -> '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '10'
""")

sent = 'I shot 3 elephants'.split()
parser = nltk.ChartParser(groucho_grammar)
for tree in parser.parse(sent):
    print(tree)

[输出]:

(S (NP I) (VP (V shot) (NP (NUM 3) (N elephants))))

但请注意,它只能处理单位数字。因此,让我们尝试将整数压缩为单个标记类型,例如“#NUM#”:

import nltk

groucho_grammar = nltk.CFG.fromstring("""
S -> NP VP
PP -> P NP
NP -> Det N | Det N PP | 'I' | NUM N
VP -> V NP | VP PP
Det -> 'an' | 'my'
N -> 'elephant' | 'pajamas' | 'elephants'
V -> 'shot'
P -> 'in'
NUM -> '#NUM#'
""")

sent = 'I shot 333 elephants'.split()
sent = ['#NUM#' if i.isdigit() else i for i in sent]

parser = nltk.ChartParser(groucho_grammar)
for tree in parser.parse(sent):
    print(tree)

[输出]:

(S (NP I) (VP (V shot) (NP (NUM #NUM#) (N elephants))))

要恢复数字,请尝试:

import nltk

groucho_grammar = nltk.CFG.fromstring("""
S -> NP VP
PP -> P NP
NP -> Det N | Det N PP | 'I' | NUM N
VP -> V NP | VP PP
Det -> 'an' | 'my'
N -> 'elephant' | 'pajamas' | 'elephants'
V -> 'shot'
P -> 'in'
NUM -> '#NUM#'
""")

original_sent = 'I shot 333 elephants'.split()
sent = ['#NUM#' if i.isdigit() else i for i in original_sent]
numbers = [i for i in original_sent if i.isdigit()]

parser = nltk.ChartParser(groucho_grammar)
for tree in parser.parse(sent):
    treestr = str(tree)
    for n in numbers:
        treestr = treestr.replace('#NUM#', n, 1)
    print(treestr)

[输出]:

(S (NP I) (VP (V shot) (NP (NUM 333) (N elephants))))

关于python - 如何匹配NLTK CFG中的整数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28348485/

相关文章:

python - Django 更新而不是插入新记录

python - 无法在 python 中导入自定义 DLL

javascript - 选择接下来的 2 位以 XXX 开头但不是 XXX 的数字

java - Java 中匹配某个单词零次或一次出现的正则表达式

java - 在 Java 中构建/运行流式 Weka 文本分类器

java - Stanford Core NLP - 理解共指消解

python - Pandas SQL 中 EXCEPT 子句的类似物是什么?

python - 在 Upstart 工作中从 python 捕获标准输出

regex - 获取包含在特殊字符 « 和 » 中的字符串之外的所有双引号字符

nlp - 词干提取和去复数化之间的区别