使用python正则表达式的单词标记化

2024-05-13 05:56:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在python中将字符串分割成“标记”列表。拆分应该处理“HappyBirthday”等字符串,并删除大多数标点符号,但保留连字符和撇号。我的出发点是:

tags = re.findall("([A-Z]{2,}(?=[A-Z]|$)|[A-Z][a-z]*)|\w+-\w+|[\w']+"

我想把这个样本数据:

Jeff's dog is un-American SomeTimes! BUT NOTAlways

进入:

['Jeff's', 'dog', 'is', 'un-American', 'Some', 'Times', 'BUT', 'NOT', 'Always']

对不起,我的描述不太好。我不知道该如何解释,而且在google上几乎没有成功。我希望这个例子能恰当地说明这一点。

编辑:我想我需要更精确,所以

  1. 如果这个词是催眠和资本,像'非美国'它会保持它作为一个词,所以产出将'非美国'
  2. 如果连字符的两边或两边都有空格,则la'THIS-is'或'THIS-is'应忽略连字符,分别产生[“THIS”,“is”]和[“THIS”,“is”]
  3. 简单来说,如果撇号在“What's it Called”这样的单词中间,它应该产生[“What's”,“it”,“Called”]

Tags: 字符串标记列表isitthis字符what
2条回答

我建议如下:

re.findall("[A-Z]{2,}(?![a-z])|[A-Z][a-z]+(?=[A-Z])|[\'\w\-]+",s)

这为您的示例提供了:

["Jeff's", 'dog', 'is', 'un-American', 'Some', 'Times', 'BUT', 'NOT', 'Always']

说明:RegExp由3个选项组成:

  1. [A-Z]{2,}(?![a-z])匹配所有大写字母的单词
  2. [A-Z][a-z]+(?=[A-Z])匹配带有第一个capitel字母的单词。向前看(?=[A-Z])在下一个大写字母之前停止匹配
  3. [\'\w\-]+匹配所有其他单词,即可能包含'-的单词。

为了处理您编辑的案例,我将修改phynfo(+1)很好的答案

>>> s = """Jeff's UN-American Un-American un-American 
           SomeTimes! BUT NOTAlways This- THIS- 
           What'sItCalled someTimes"""
>>> re.findall("[A-Z\-\']{2,}(?![a-z])|[A-Z\-\'][a-z\-\']+(?=[A-Z])|[\'\w\-]+",s)
["Jeff's", 'UN-', 'American', 'Un-', 'American', 'un-American', 
 'Some', 'Times', 'BUT', 'NOT', 'Always', 'This-', 'THIS-', 
 "What's", 'It', 'Called' 'someTimes']

你必须清楚地为你想要的行为定义规则。标记化不是一个定义,您必须有类似于phynfo规则的东西。E、 例如,有一条规则是'NOTAlways'应该转到'NOT',和'Always',并且应该保留连字符。因此'UN-American'被分裂,就像非美国人被分裂一样。可以尝试定义其他规则,但必须清楚当规则重叠时应用的规则。

相关问题 更多 >