【问题标题】:Tokenizing based on certain pattern with Python使用 Python 基于特定模式进行标记
【发布时间】:2020-04-18 17:39:42
【问题描述】:

我必须从具有 abc ABC - - 12 Vab abc 1,2W 之类的句子的句子中标记某些模式。这里12 V1,2W 都是带单位的值。所以我想标记为abcABC12 V。对于另一种情况:ababc1,2W。 我怎样才能做到这一点 ? 那么 nltk word_tokenizer 是一个选项,但我不能插入任何模式,或者我可以吗? word_tokenize(test_word)

【问题讨论】:

    标签: python nltk python-re


    【解决方案1】:

    如果您的输入是可预测的,即您知道哪些字符出现在您的标记之间(在这种情况下,我看到一个空格和一个连字符),您可以使用正则表达式来提取您想要的内容:

    import re
    
    def is_float(s):
        return re.match(r'^-?\d+(?:\.|,\d+)?$', s) 
    
    def extract_tokens(phrase, noise="-"):
        phrase_list = re.split("\s+", re.sub(noise, " ", phrase).strip())
        phrase_tokenized = []
        i, n = 0, len(phrase_list)
        while i < n:
            phrase_tokenized.append(phrase_list[i])
            if phrase_list[i].isdigit() or is_float(phrase_list[i]) and i < n-1:
                phrase_tokenized[-1] += " " + phrase_list[i+1]
                i += 1
            i += 1
        return phrase_tokenized
    

    样本测试:

    >>> extract_tokens("abc ABC - - 12 V")
    ['abc', 'ABC', '12 V']
    >>> extract_tokens("ab abc 1,2W")
    ['ab', 'abc', '1,2W']
    

    要“插入模式”,您只需根据需要更新 noise 参数即可。

    【讨论】:

    • 我现在得到IndexError: list index out of range 我有更多数据吗?错误在这里phrase_tokenized[-1] += " " + phrase_list[i+1]
    • 如果列表的列表大于 25 或者我从某处切片数据
    • 显示有问题的输入
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2021-07-19
    相关资源
    最近更新 更多