得到一个完整的unicode句子

时间:2011-10-06 01:20:00

标签: python nlp pyparsing text-segmentation

我正在尝试解析Base: Lote Numero 1, Marcelo T de Alvear 500. Demanda: otras palabras.之类的句子我想:首先,按句点分割文本,然后使用冒号之前的任何内容作为冒号后句子的label 。 现在我有以下定义:

from pyparsing import *

unicode_printables = u''.join(unichr(c) for c in xrange(65536) 
                                    if not unichr(c).isspace())

def parse_test(text):
    label = Word(alphas)+Suppress(':')
    value = OneOrMore(Word(unicode_printables)|Literal(','))
    group = Group(label.setResultsName('label')+value.setResultsName('value'))
    exp = delimitedList(
        group,
        delim='.'
    )

    return exp.parseString(text)

有点作品,但它会丢弃unicode caracters(以及任何不在alphanums中的内容),我想我希望将value作为一个整句而不是:{{1 }}

这是解决这个问题的简单方法吗?

2 个答案:

答案 0 :(得分:2)

要直接回答您的问题,请使用originalTextFor包装您的值定义,这将返回匹配标记来自的字符串切片,作为单个字符串。您还可以添加解析操作,例如:

value.setParseAction(lambda t : ' '.join(t))

但是这可能会明确地在每个项目之间放置一个空格,当可能没有空格(在一个单词后面的',')或多个空格时。 originalTextFor将为您提供确切的输入子字符串。但更简单的是,如果你只是在':'之后阅读所有内容,那就是使用restOfLine。 (当然,最简单的只是使用split(':'),但我认为你是专门询问如何用pyparsing来做这件事。)

其他几点说明:

  • xxx.setResultsName('yyy')可以缩短为xxx('yyy'),从而提高解析器定义的可读性。

  • 您将值定义为OneOrMore(Word(unicode_printables) | Literal(','))有几个问题。首先,','将包含在unicode_printables中的字符集中,因此','将包含在任何已解析的单词中。解决此问题的最佳方法是使用excludeChars参数Word,以便您的句子单词不包含逗号:OneOrMore(Word(unicode_printables, excludeChars=',') | ',')。现在您还可以排除其他可能的标点符号,例如“;”,“ - ”等,只需将它们添加到excludeChars字符串中即可。 (我只是注意到你使用'。'作为delimitedList的分隔符 - 为了使其工作,你必须包括'。'作为排除字符。)Pyparsing不像正则表达式这方面 - 如果下一个字符继续匹配当前令牌,则尝试匹配解析器中的下一个令牌并不做任何前瞻。这就是为什么你必须自己做一些额外的工作,以避免阅读太多。一般来说,像OneOrMore(Word(unicode_printables))那样开放的东西很可能会占用输入字符串的其余部分。

答案 1 :(得分:1)

您应该查看PyICU,它提供对ICU提供的丰富Unicode文本库的访问,包括提供句子查找器的BreakIterator类。