Python 得到一个完整的unicode句子

Python 得到一个完整的unicode句子,python,nlp,pyparsing,text-segmentation,Python,Nlp,Pyparsing,Text Segmentation,我试图解析一个句子,比如Base:Lote Numero 1,Marcelo T de Alvear 500。Demanda:otras palabras。我想:首先,将文本按句点分割,然后,使用冒号前面的任何内容作为冒号后面句子的标签。 现在我有以下定义: from pyparsing import * unicode_printables = u''.join(unichr(c) for c in xrange(65536)

我试图解析一个句子,比如
Base:Lote Numero 1,Marcelo T de Alvear 500。Demanda:otras palabras。
我想:首先,将文本按句点分割,然后,使用冒号前面的任何内容作为冒号后面句子的
标签。
现在我有以下定义:

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字符(以及字母以外的任何字符),我想我希望将
值作为一个完整的句子,而不是这样:
'value':[(([u'Lote',u'Numero',u'1',','u'Marcelo',u'T',u'de',u'Alvear',u'500',{}),1)


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

您应该查看哪个提供了对ICU提供的富Unicode文本库的访问,包括提供句子查找器的类。

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

value.setParseAction(lambda t : ' '.join(t))
但这会在每个项目之间明确地放置一个空格,而可能没有空格(在单词后面有一个“,”或多个空格。
originalTextFor
将为您提供准确的输入子字符串。但更简单的是,如果您只是阅读“:”之后的所有内容,则可以使用
restOfLine
。(当然,最简单的方法就是使用
split(“:”)
,但我想您是在问如何使用pyparsing实现这一点。)

还有几点需要注意:

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

  • 您将值定义为
    one或more(Word(unicode_可打印文件)| Literal(','))
    有几个问题。首先,“,”将包含在
    unicode\u可打印文件中的字符集中,因此,“,”将包含在任何已解析的单词中。解决此问题的最佳方法是将
    excludeChars
    参数用于
    Word
    ,以便您的句子单词不包含逗号:
    一个或多个(Word(unicode_printables,excludeChars=',')|',')
    。现在您还可以排除其他可能的标点符号,如“;”,“-”,等等。只需将它们添加到excludeChars字符串中即可。(我刚刚注意到,您正在使用“.”作为
    分隔符列表的分隔符
    ——要使其起作用,您还必须将“.”作为排除字符。)Pyparsing在这方面与正则表达式不同——如果下一个字符继续与当前标记匹配,它不会进行任何前瞻性操作来尝试匹配解析器中的下一个标记。这就是为什么您必须自己做一些额外的工作来避免读太多。通常,像
    一个或多个(Word)这样的开放式操作(unicode_printables))
    很可能会耗尽输入字符串的全部剩余部分


很有趣,我会尝试用PyICU做一些测试,看看它是否合适。我认为Paul McGuire的[1]符合你的要求。[1]:很好,这将帮助我在我的定义中处理unicodes,但不会给我整个句子,对吗?是的。这是朝着正确方向迈出的一步,对吗?因此,不要使用
单词(alphanums)
,您可以调用
Word(unicodePrintables)
编辑问题以反映这一点。