python - 匹配nltk语法中的字母数字字符串

标签 python parsing nltk

我正在尝试使用 NTLK 语法和解析算法,因为它们看起来非常简单易用。虽然,我找不到正确匹配字母数字字符串的方法,例如:

import nltk
grammar = nltk.parse_cfg ("""
# Is this possible?
TEXT -> \w*  
""")

parser = nltk.RecursiveDescentParser(grammar)

print parser.parse("foo")

有没有简单的方法可以做到这一点?

最佳答案

要干净利落地做起来会很困难。基本解析器类依赖于精确匹配或生产 RHS 来弹出内容,因此需要子类化和重写解析器类的大部分。我前段时间在特征语法课上尝试过,然后放弃了。

我所做的更多是 hack,但基本上,我首先从文本中提取正则表达式匹配项,然后将它们作为产生式添加到语法中。如果您使用大型语法,它将非常慢,因为它需要为每次调用重新计算语法和解析器。

import re

import nltk
from nltk.grammar import Nonterminal, Production, ContextFreeGrammar

grammar = nltk.parse_cfg ("""
S -> TEXT
TEXT -> WORD | WORD TEXT | NUMBER | NUMBER TEXT
""")

productions = grammar.productions()

def literal_production(key, rhs):
    """ Return a production <key> -> n 

    :param key: symbol for lhs:
    :param rhs: string literal:
    """
    lhs = Nonterminal(key)
    return Production(lhs, [rhs])

def parse(text):
    """ Parse some text.
"""

    # extract new words and numbers
    words = set([match.group(0) for match in re.finditer(r"[a-zA-Z]+", text)])
    numbers = set([match.group(0) for match in re.finditer(r"\d+", text)])

    # Make a local copy of productions
    lproductions = list(productions)

    # Add a production for every words and number
    lproductions.extend([literal_production("WORD", word) for word in words])
    lproductions.extend([literal_production("NUMBER", number) for number in numbers])

    # Make a local copy of the grammar with extra productions
    lgrammar = ContextFreeGrammar(grammar.start(), lproductions)

    # Load grammar into a parser
    parser = nltk.RecursiveDescentParser(lgrammar)

    tokens = text.split()

    return parser.parse(tokens)

print parse("foo hello world 123 foo")

这是在 google groups 的 nltk-users group 上讨论​​的更多背景:https://groups.google.com/d/topic/nltk-users/4nC6J7DJcOc/discussion

关于python - 匹配nltk语法中的字母数字字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16325390/

相关文章:

python - 如何在 python 中评估列表理解以及以什么顺序

scala - 用于解析转义 CSV 行的 Parboiled2 语法

python - 使用 tkinter 在 jupyter 笔记本内部进行 nltk 绘制

Python - NLTK 训练/测试分割

python - 如何获取nltk树中某个节点的父节点和子节点?

python - Python 中的无限时间增量

python - 如何仅使用相对路径加入?

python - 如何使用 Altair 在散点图中突出显示标记?

c - 在 bison/yacc 中处理变量名列表

c# - HTML Agility Pack 选择具有多个属性的节点