【问题标题】:Word tokenization using python regular expressions使用 python 正则表达式的词标记化
【发布时间】:2011-09-06 08:23:28
【问题描述】:

我正在尝试将字符串拆分为 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']

附:很抱歉我的描述不是很好。我不知道如何解释它,并且在谷歌上大多不成功。我希望这个例子能正确地说明它。

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

  1. 如果单词是连字符和大写字母,例如“UN-American”,它会将其保留为一个单词,因此输出将是“UN-American”
  2. 如果连字符的一侧或两侧有空格,例如 la 'THIS-is' 或 'This - is',它应该忽略连字符并生成 ["THIS", "is"] 和 ["This", “是”] 分别是,
  3. 类似地,如果撇号位于“What'sItCalled”之类的单词中间,则应该产生 ["What's","It", "Called"]

【问题讨论】:

  • 通常这被称为标记化或“单词标记化”,并且没有针对此问题的通用解决方案。我愿意接受不够完美的解决方案。
  • 另一个问题是,将正则表达式用于单词标记化这样复杂的事情可能会产生一个相对神秘的解决方案。
  • 奥术与否,我不在乎我是否得到它,如果它有效,我会很高兴。

标签: python regex string tags


【解决方案1】:

我建议如下:

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]) 匹配第一个大写字母的单词。前瞻 (?=[A-Z]) 在下一个大写字母之前停止匹配
  3. [\'\w\-]+ 匹配所有其余部分,即可能包含 '- 的单词。

【讨论】:

  • 所以如果这个词是hypenated和大写的,比如'UN-American',它会保留-还是删除它? 'THIS-' 或 'This-' 呢?甚至是“What'sItCalled”
  • 另外,如果 '-' 周围有空格,则应将其删除,即“this should - do that” ["this","should","do","that"]
  • @user779420:如果你想删除单个连字符,或更一般的单个字母,你可以在字符串列表中调用filter (lambda s: len(s)>1, ...)
  • 如果并排留下 2 个空格,这有关系吗?另外,你能把我链接到一个解释吗?我不熟悉它。
【解决方案2】:

为了处理您编辑的案例,我会修改 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 规则的东西。例如,您有一条规则,'NOTAlways' 应该转到 'NOT''Always',并且应该保留连字符。因此'UN-American' 被拆分,就像UNAmerican 被拆分一样。您可以尝试定义额外的规则,但您必须清楚规则重叠时应用哪个规则。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    • 1970-01-01
    • 2012-02-22
    • 2012-07-24
    相关资源
    最近更新 更多