包含Unicode字符的单词如何拆分?

3
我正在从事一个涉及推文中表情符号的NLP项目。
以下是推文示例:
"sometimes i wish i wa an octopus so i could slap 8 people at once" 我的问题是,once被视为一个单词,因此我想将这个独特的单词拆分成两个,使我的推文看起来像这样:
"sometimes i wish i wa an octopus so i could slap 8 people at once " 请注意,我已经有了包含每个表情符号的编译正则表达式!
由于我有数十万条推文,因此我正在寻找一种有效的方法来完成这项工作,但我无法确定从哪里开始。
谢谢。
2个回答

2
你可以这样做吗:
>>> import re
>>> s = "sometimes i wish i wa an octopus so i could slap 8 people at once"
>>> re.findall("(\w+|[^\w ]+)",s)
['sometimes', 'i', 'wish', 'i', 'wa', 'an', 'octopus', 'so', 'i', 'could', 'slap', '8', 'people', 'at', 'once', '']

如果你需要将它们再次作为一个由空格分隔的字符串,只需将它们连接起来即可:
>>> " ".join(re.findall("(\w+|[^\w ]+)",s))
'sometimes i wish i wa an octopus so i could slap 8 people at once '

编辑:已修复。


谢谢您的快速回答,您能解释一下正则表达式如何找到实际单词和Unicode字符之间的边界吗? - Thomas Reynaud
@ThomasReynaud 首先尝试匹配一系列单词字符(\w),其中不包括任何表情符号。一旦匹配了“once”,匹配就停止了,因为它无法再匹配到更多的单词字符。所以从那个位置开始,它会搜索下一个匹配项,只是试图找到任何不是空格字符的东西。实际上,如果表情符号不在末尾,这种方法是有缺陷的,我认为,让我再测试一些。 - L3viathan
@ThomasReynaud 我稍微修改了正则表达式。现在它将匹配单词字符序列或任何既不是空格也不是单词字符的序列。 - L3viathan
1
谢谢!我太专注于使用表情符号正则表达式,错过了简单的解决方案。只是一个注意事项(在我的情况下完全无关紧要),对于未来的读者来说,这不会将 "" 解析为 " " - Thomas Reynaud

1
你可以使用re.sub来引入一个空格:
re.sub(r'(\W+)(?= |$)', r' \1', string)

例子:

>>> string
'sometimes i wish i wa an octopus so i could slap 8 people at once\xf0\x9f\x90\x99'
>>> re.sub(r'(\W+)(?= |$)', r' \1', string)
'sometimes i wish i wa an octopus so i could slap 8 people at once \xf0\x9f\x90\x99'

>>> string = 'sometimes i wish i wa an octopus so i could slap 8 people at once" foobar'
>>> re.sub(r'(\W+)(?= |$)', r' \1', string)
'sometimes i wish i wa an octopus so i could slap 8 people at once \xf0\x9f\x90\x99 foobar'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接