【问题标题】:How to tokenize contractions in Python?如何在 Python 中标记收缩?
【发布时间】:2013-01-29 05:20:13
【问题描述】:

我有想要标记的句子,包括标点符号。但是我需要处理缩略词,以便将“不能”之类的单词标记为“ca”和“n't”,其中拆分是撇号前的一个字符,其余的缩略词拆分在像“you've”和“It's”这样的撇号变成“you”“'ve”和“It”和“'s”。这就是我卡住的地方。基本上大致相当于 NKTL 的 TreebankWord Tokenizer 的行为方式: NLTK Word Tokenization Demo

我一直在使用这里提出的解决方案之一,它不能按照我想要的方式处理收缩:

re.findall("'\w+|[\w]+|[^\s\w]", "Hello, I'm a string! Please don't kill me? It's his car.")

我得到了这个结果:

['Hello', ',', 'I', "'m", 'a', 'string', '!', 'Please', 'don', "'t", 'kill', '我','?','它',''s','他的','汽车','.']

除了应该是“do”和“n't”的don't情况外,哪个会正确处理撇号。有谁知道如何解决这个问题?

我只能使用标准库,因此在这种情况下不能选择 NLTK。

【问题讨论】:

    标签: python regex tokenize


    【解决方案1】:

    正则表达式:

    \w+(?=n't)|n't|\w+(?=')|'\w+|\w+
    

    用法

    match_list = re.findall(r"\w+(?=n't)|n't|\w+(?=')|'\w+|\w+","you've it's couldn't don't", re.IGNORECASE | re.DOTALL)
    

    匹配:

    ['you', "'ve", "it", "'s", 'could', "n't", "do", "n't"]
    

    【讨论】:

      【解决方案2】:

      试试:

      r"[n]'[\w]+|[\w]+(?!')(?:[A-Za-mo-z](?='))?|(?<=\s)[\w](?=')|[^\s\w']"
      

      这匹配字符后跟 ' 后跟更多字符,并且将匹配 首先,即使它能够匹配其他模式。

      【讨论】:

      • 您好,感谢您的帮助,但结果并不是我想要的。字符串“你好,我是字符串!请不要杀我?这是他的车。”产生这个结果: ['Hello', ',', "I'm", 'a', 'string', '!', 'Please', 'don', "'", 't', 'kill' , 'me', '?', 'It', "'", 's', 'his', 'car', '.'] 但我想要:['Hello', ',', 'I', "'m", 'a', 'string', '!', 'Please', 'do', "n't", 'kill', 'me', '?', 'It, "'s" , '他的', '汽车', '.']
      • 我已经修改了我上面的正则表达式以获得接近我想要的东西,但 n't 仍然没有被正确标记。
      • 它几乎可以工作,但对于 [\w]'[\w]+ 的情况,我只是在寻找 n't (不能,没有,不能等)没有别的(所以“It's”不应该被标记为“I”和“t's”)。所有其他缩略词都应在撇号处进行标记(“It's”标记为“It”和“'s”)。
      • 再次更新。您需要一些非常具体的规则,并且正则表达式很复杂,因此您可能希望找到使用正则表达式进行标记的替代方法
      【解决方案3】:

      \w+ 之前捕获n't\w+(?=n't)

      r"'\w+|n't|\w+(?=n't)|\w+|[^\s\w]"
      

      【讨论】:

        猜你喜欢
        • 2015-03-19
        • 2021-10-16
        • 2021-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-02
        • 2019-05-17
        • 2011-08-28
        相关资源
        最近更新 更多