N-Gram 分词算法 Python 实现

概述

N-Gram 算法是一种单词级别的窗口取词算法,N-Gram(有时也称为N元模型)是自然语言处理中一个非常重要的概念,通常在NLP中,人们基于一定的语料库,可以利用N-Gram来预计或者评估一个句子是否合理。另外一方面,N-Gram的另外一个作用是用来评估两个字符串之间的差异程度。这是模糊匹配中常用的一种手段。

N-Gram 算法具体过程:

  • 过滤掉文本数据中的标点符号和其他特殊字符;

  • 对所有单词执行小写转换,并删除单词之间的空格、换行符等标志位;

  • 使用长度为 N 的窗口对文本内容执行字符级滑动取词,将结果存入有序列表。

如下图所示
N-Gram 分词算法 Python 实现_第1张图片
程序分为两步:文本过滤、滑动取词

文本过滤

def text_filter(text: str) -> str:
    """
    文本过滤器:过滤掉文本数据中的标点符号和其他特殊字符
    :param text: 待过滤的文本
    :return: 过滤后的文本
    """
    result = str()
    for t in text:
        if t.isalnum():
            if t.isalpha():
                t = t.lower()
            result += str(t)
    return result

滑动取词

def slide_word(text: str, l: int = 5) -> list:
    """
    滑动取词器
    Input: text='abcd',l=2
    Output: ['ab','bc','cd']
    :param text: 过滤后的文本 (只包含小写数字/字母)
    :param l: 滑动窗口长度,默认为 5
    :return:
    """
    tf = text_filter(text)
    result = list()
    if len(tf) <= l:
        result.append(tf)
        return result
    for i in range(len(tf)):
        word = tf[i:i + l]
        if len(word) < l:
            break
        result.append(word)
    return result

测试

if __name__ == '__main__':
    banner = 'abcdefghigkLMN*^%$*   \r\n)021'
    print(slide_word(banner))

输出

['abcde', 'bcdef', 'cdefg', 'defgh', 'efghi', 'fghig', 'ghigk', 'higkl', 'igklm', 'gklmn', 'klmn0', 'lmn02', 'mn021']

你可能感兴趣的:(机器学习相关算法,算法,字符串,自然语言处理)