Python:在单词边界上拆分unicode字符串

Pau*_*jan 10 python unicode internationalization character-properties

我需要一个字符串,并将其缩短为140个字符.

目前我在做:

if len(tweet) > 140:
    tweet = re.sub(r"\s+", " ", tweet) #normalize space
    footer = "… " + utils.shorten_urls(post['url'])
    avail = 140 - len(footer)
    words = tweet.split()
    result = ""
    for word in words:
        word += " "
        if len(word) > avail:
            break
        result += word
        avail -= len(word)
    tweet = (result + footer).strip()
    assert len(tweet) <= 140
Run Code Online (Sandbox Code Playgroud)

所以这对于英语非常有用,而英语就像字符串一样,但对于中文字符串来说却失败了,因为tweet.split()只返回一个数组:

>>> s = u"?????????????????????????????10?42???????????30?????????????????????????"
>>> s
u'\u7b80\u8baf\uff1a\u65b0\u83ef\u793e\u5831\u9053\uff0c\u7f8e\u570b\u7e3d\u7d71\u5967\u5df4\u99ac\u4e58\u5750\u7684\u300c\u7a7a\u8ecd\u4e00\u865f\u300d\u5c08\u6a5f\u665a\u4e0a10\u664242\u5206\u9032\u5165\u4e0a\u6d77\u7a7a\u57df\uff0c\u9810\u8a08\u7d0430\u5206\u9418\u5f8c\u62b5\u9054\u6d66\u6771\u570b\u969b\u6a5f\u5834\uff0c\u958b\u5c55\u4ed6\u4e0a\u4efb\u5f8c\u9996\u6b21\u8a2a\u83ef\u4e4b\u65c5\u3002'
>>> s.split()
[u'\u7b80\u8baf\uff1a\u65b0\u83ef\u793e\u5831\u9053\uff0c\u7f8e\u570b\u7e3d\u7d71\u5967\u5df4\u99ac\u4e58\u5750\u7684\u300c\u7a7a\u8ecd\u4e00\u865f\u300d\u5c08\u6a5f\u665a\u4e0a10\u664242\u5206\u9032\u5165\u4e0a\u6d77\u7a7a\u57df\uff0c\u9810\u8a08\u7d0430\u5206\u9418\u5f8c\u62b5\u9054\u6d66\u6771\u570b\u969b\u6a5f\u5834\uff0c\u958b\u5c55\u4ed6\u4e0a\u4efb\u5f8c\u9996\u6b21\u8a2a\u83ef\u4e4b\u65c5\u3002']
Run Code Online (Sandbox Code Playgroud)

我应该怎么做才能处理I18N?这在所有语言中都有意义吗?

如果重要的话,我正在使用python 2.5.4.

Mar*_*ers 7

中文通常在单词之间没有空格,符号可以根据上下文有不同的含义.您必须了解文本才能将其拆分为单词边界.换句话说,一般来说,你要做的事情并不容易.

  • 你可能会得到半个字,这可能完全改变了意义.想象一下,在前三个字母处分开"辅助". (4认同)

Ale*_*lli 5

对于中文分词和处理自然语言的其他高级任务,如果不是一个完整的解决方案,请考虑NLTK作为一个很好的起点 - 它是一个丰富的基于Python的工具包,特别适合学习NL处理技术(并不是很好的足以为您提供解决其中一些问题的可行方案.

  • "不是很少"==通常,有时候,别的什么? (3认同)
  • 我真的不想训练用于分词发现的NLP解决方案.我确定有人已经这样做了,只想要一个预先装箱的分词器. (2认同)

Pau*_*jan 1

在与一些以粤语、普通话和日语为母语的人交谈后,似乎正确的做法很难,但我当前的算法在互联网帖子的背景下对他们来说仍然有意义。

\n\n

意思是,它们习惯于“分割空间并在末尾添加 \xe2\x80\xa6”处理。

\n\n

所以我会偷懒并坚持下去,直到我收到不理解它的人的抱怨为止。

\n\n

对我原始实现的唯一更改是不要在最后一个单词上强制使用空格,因为在任何语言中都不需要空格(并使用 unicode 字符 \xe2\x80\xa6&#x2026而不是 ...three dots来保存 2 个字符)

\n