Python: 按词边界拆分unicode字符串
我需要把一个字符串缩短到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
这样对于英文和类似英文的字符串效果很好,但对于中文字符串就不行了,因为 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']
我该怎么做才能处理国际化(I18N)呢?这样在所有语言中都适用吗?
我用的是Python 2.5.4,如果这有影响的话。
9 个回答
5
如果你想在中文中进行分词,或者处理其他自然语言的高级任务,可以考虑使用NLTK作为一个不错的起点,虽然它可能不是一个完整的解决方案。NLTK是一个功能丰富的工具包,基于Python,特别适合用来学习自然语言处理的技巧,而且它常常能为你提供一些问题的可行解决方案。
8
中文通常在词与词之间没有空格,而且符号的意思也会根据上下文不同而变化。所以你需要理解文本的意思,才能在词的边界上进行切分。换句话说,你想做的事情一般来说并不简单。
1
在和一些说粤语、普通话和日语的朋友交流后,我发现要做到完全正确其实挺难的。不过,我现在的算法在他们看来还是能理解的,尤其是在网上发帖的情况下。
也就是说,他们习惯了那种“遇到空格就分开,最后加个……的处理方式”。
所以我决定先懒着不改,直到有人抱怨说不明白为止。
我唯一会改的就是不在最后一个词后面强制加空格,因为在任何语言中这都是多余的(而且我会用unicode字符…… …
来代替三个点 three dots
,这样可以省两个字符)。