【问题标题】:Get a whole unicode sentence得到一个完整的 unicode 句子
【发布时间】:2011-12-01 22:31:04
【问题描述】:

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

有一个简单的方法来解决这个问题吗?

【问题讨论】:

  • 我认为 Paul McGuire 的 How to Answer[1] 有你想要的。 [1]:stackoverflow.com/questions/2339386/…
  • 太好了,这将帮助我处理我定义中的 unicode,但不会给我整个句子,对吧?
  • 是的。这是朝着正确方向迈出的一步,对吧?所以你可以打电话给Word(unicodePrintables),而不是Word(alphanums)
  • 编辑了问题以反映这一点。

标签: python nlp pyparsing text-segmentation


【解决方案1】:

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

【讨论】:

  • 有趣,会尝试用 PyICU 做一些测试,看看是否合适。
【解决方案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)) 这样的开放式内容很可能会占用您输入字符串的其余部分。

【讨论】:

    猜你喜欢
    • 2018-01-05
    • 2014-09-10
    • 2018-10-16
    • 1970-01-01
    • 2014-12-09
    • 2022-10-23
    • 1970-01-01
    • 2015-07-12
    • 2019-11-07
    相关资源
    最近更新 更多