• NLP_文本特征处理_4(代码示例)


    目标

    • 了解文本特征处理的作用.
    • 掌握实现常见的文本特征处理的具体方法.

    • 文本特征处理的作用:

      • 文本特征处理包括为语料添加具有普适性的文本特征, 如:n-gram特征, 以及对加入特征之后的文本语料进行必要的处理, 如: 长度规范. 这些特征处理工作能够有效的将重要的文本特征加入模型训练中, 增强模型评估指标.
    • 常见的文本特征处理方法:

      • 添加n-gram特征
      • 文本长度规范

    1 什么是n-gram特征

    • 给定一段文本序列, 其中n个词或字的相邻共现特征即n-gram特征, 常用的n-gram特征是bi-gram和tri-gram特征, 分别对应n为2和3.

    • 举个例子:

    1. 假设给定分词列表: ["是谁", "敲动", "我心"]
    2. 对应的数值映射列表为: [1, 34, 21]
    3. 我们可以认为数值映射列表中的每个数字是词汇特征.
    4. 除此之外, 我们还可以把"是谁""敲动"两个词共同出现且相邻也作为一种特征加入到序列列表中,
    5. 假设1000就代表"是谁""敲动"共同出现且相邻
    6. 此时数值映射列表就变成了包含2-gram特征的特征列表: [1, 34, 21, 1000]
    7. 这里的"是谁""敲动"共同出现且相邻就是bi-gram特征中的一个.
    8. "敲动""我心"也是共现且相邻的两个词汇, 因此它们也是bi-gram特征.
    9. 假设1001代表"敲动""我心"共同出现且相邻
    10. 那么, 最后原始的数值映射列表 [1, 34, 21] 添加了bi-gram特征之后就变成了 [1, 34, 21, 1000, 1001]
    • 提取n-gram特征:
    1. # 一般n-gram中的n取2或者3, 这里取2为例
    2. ngram_range = 2
    3. def create_ngram_set(input_list):
    4. """
    5. description: 从数值列表中提取所有的n-gram特征
    6. :param input_list: 输入的数值列表, 可以看作是词汇映射后的列表,
    7. 里面每个数字的取值范围为[1, 25000]
    8. :return: n-gram特征组成的集合
    9. eg:
    10. >>> create_ngram_set([1, 4, 9, 4, 1, 4])
    11. {(4, 9), (4, 1), (1, 4), (9, 4)}
    12. """
    13. return set(zip(*[input_list[i:] for i in range(ngram_range)]))
    • 调用:
    1. input_list = [1, 3, 2, 1, 5, 3]
    2. res = create_ngram_set(input_list)
    3. print(res)
    • 输出效果:
    1. # 该输入列表的所有bi-gram特征
    2. {(3, 2), (1, 3), (2, 1), (1, 5), (5, 3)}

    2 文本长度规范及其作用

    • 一般模型的输入需要等尺寸大小的矩阵, 因此在进入模型前需要对每条文本数值映射后的长度进行规范, 此时将根据句子长度分布分析出覆盖绝大多数文本的合理长度, 对超长文本进行截断, 对不足文本进行补齐(一般使用数字0), 这个过程就是文本长度规范.

    • 文本长度规范的实现:

    1. from keras.preprocessing import sequence
    2. # cutlen根据数据分析中句子长度分布,覆盖90%左右语料的最短长度.
    3. # 这里假定cutlen为10
    4. cutlen = 10
    5. def padding(x_train):
    6. """
    7. description: 对输入文本张量进行长度规范
    8. :param x_train: 文本的张量表示, 形如: [[1, 32, 32, 61], [2, 54, 21, 7, 19]]
    9. :return: 进行截断补齐后的文本张量表示
    10. """
    11. # 使用sequence.pad_sequences即可完成
    12. return sequence.pad_sequences(x_train, cutlen)
    • 调用:
    1. # 假定x_train里面有两条文本, 一条长度大于10, 一天小于10
    2. x_train = [[1, 23, 5, 32, 55, 63, 2, 21, 78, 32, 23, 1],
    3. [2, 32, 1, 23, 1]]
    4. res = padding(x_train)
    5. print(res)
    • 输出效果:
    1. [[ 5 32 55 63 2 21 78 32 23 1]
    2. [ 0 0 0 0 0 2 32 1 23 1]]

  • 相关阅读:
    浏览器提示“此网站的安全证书有问题“,你还敢继续访问吗?
    嵌入式学习路线图
    设计模式~解释器模式(Interpreter)-19
    Python 配置pyqt5开发环境
    Gin:获取本机IP,获取访问IP
    【面试刷题】——C++公有继承保护继承和私有继承
    记录关于Ajax二次加载出的内容无法再次实现Ajax点击效果问题
    CRM客户关系管理系统开发源码小程序
    AMS 新闻视频广告的云原生容器化之路
    Smartbi亮相华为云828 B2B企业节,一起成就好生意
  • 原文地址:https://blog.csdn.net/m0_60657960/article/details/136448352