我发布了一系列来自多种语言的推文,其中包含大量的表情符号和其他图形unicode代码点。我希望能够对这些文本进行标记,以便图形字符是单独的标记(为此,我可以将它们用空格包围,然后在空格上分割)。
以下是使用以下字形的潜在推文文本示例:
恐惧中的面部表格:(U + 1F631)
KISS MARK:(U + 1F48B)
# glyph_re is the regular expression I'm looking for
tw = u"piñata\U0001f631 \U0001f48bčíslo"
tw_spaced = re.sub(u'('+glyph_re+u')',ur' \1 ',tw)
tw_tokens = re.split(ur'\s',tw_spaced)
desired output = [u"piñata",u"\U0001f631",u"\U0001f48b",u"číslo"]
我希望glyph_re
能够捕获任何不是空格或在某种语言的脚本中使用的字符。在此示例中,piñata
为西班牙语,číslo
为捷克语。我尝试使用ur"[^\w\s]"
并将flags=re.U
添加到sub
和split
调用,但似乎字形被视为字符,至少在Ubuntu和OSX中(其中)语言,我想知道!)。
答案 0 :(得分:0)
基本的问题是默认的re
包(无论如何在python 2.7中)都不能很好地处理unicode。然而,有一个改进的正则表达式package on pypi called regex
可以做得更好。
正则表达式包自述文件说明:
'LOCALE标志用于遗留代码,并且支持有限。你仍然建议使用Unicode。'
使用regex包,您可以使用\p{...}
和否定的\P{...}
结构来引用unicode属性。因此,要从任何语言中查找“字母”字符串,您可以使用:
reWords = '\p{Letter}+'
官方unicode网站列出了一些有用的general character properties。
为了实现我在问题中提到的标记化,我做了这个:
import regex as re
def tokenize(s):
words,glyphs = [],[]
for part in re.split(ur'\P{Letter}+',s):
if part:
words.append(part)
for part in re.split(ur'(\p{Letter}|\p{Separator})+',s)[0::2]:
glyphs.extend(unicodeCharIterator(part))
return words,glyphs
s=ur"piñata\U0001f631 \U0001f48bčíslo"
words,glyphs = tokenize(s)
这是单词/字形丢失的顺序,但对我来说并不重要。
我使用了General_Category
个值,但还有其他字符属性,如Script
(如果它是一个空字符串,它不属于任何语言的脚本)和{{1} (可以使用的二元propoerty)。维基百科有一个page on unicode character properties。