【自然语言处理】文本表示(一):One-Hot、BOW、TF-IDF、N-Gram

news2024/11/15 19:39:42

文本表示(一):One-Hot、BOW、TF-IDF、N-Gram

1.One-Hot 编码

One-Hot 编码,又称 “独热编码”,是比较常用的文本特征提取方法。这种方法把每个词表示为一个很长的向量。这个向量的维度是词表大小,只有一个维度的值为 1 1 1,这个向量就代表了当前的词,其他元素为 0 0 0。One-Hot 在特征提取上属于词袋模型(Bag-of-Words),假设语料库中有三句话:

  • 我爱中国
  • 爸爸妈妈爱我
  • 爸爸妈妈爱中国

构造一个字典,Dictionary = {1:“我”, 2:“爱”, 3:“爸爸”, 4:“妈妈”, 5:“中国”}

所以最终得到的每句话的特征向量就是:

  • 我爱中国:[1, 1, 0, 0, 1]
  • 爸爸妈妈爱我:[1, 1, 1, 1, 0]
  • 爸爸妈妈爱中国:[0, 1, 1, 1, 1]
# 导入keras中的词汇映射器Tokenizer
from tensorflow.keras.preprocessing.text import Tokenizer

# 假定vocab为语料集所有不同词汇集合
vocab = {"我", "爱", "北京", "天安门", "升国旗"}
# 实例化一个词汇映射器对象
t = Tokenizer(num_words=None, char_level=False)
# 使用映射器拟合现有文本数据
t.fit_on_texts(vocab)

print(vocab)
for token in vocab:
    zero_list = [0]*len(vocab)
    # 使用映射器转化现有文本数据, 每个词汇对应从1开始的自然数
    # 返回样式如: [[2]], 取出其中的数字需要使用[0][0]
    token_index = t.texts_to_sequences([token])[0][0] - 1
    zero_list[token_index] = 1
    print(token, "的one-hot编码为:", zero_list)

在这里插入图片描述

2.词袋模型(Bag-of-Words,BOW)

Bag-of-Words(BOW)模型是信息检索领域常用的文档表示方法。在信息检索中,BOW 模型假定对于一个文档,忽略它的单词顺序、语法、句法等要素,将其仅仅看作是若干个词汇的集合,文档中每个单词的出现都是独立的,不依赖于其它单词是否出现。也就是说,文档中任意一个位置出现的任何单词,都不受该文档语意影响而独立选择的。例如有如下两个文档:

  • Bob likes to play basketball, Jim likes too.
  • Bob also likes to play football games.

基于这两个文本文档,构造一个词典:

  • Dictionary = {1:‘also’, 2:‘basketball’, 3:‘bob’, 4:‘football’, 5:‘games’, 6:‘jim’, 7:‘likes’, 8:‘play’, 9:‘to’, 10:‘too’}

这个词典一共包含 10 个不同的单词,利用词典的索引号,上面两个文档每一个都可以用一个 10 维向量表示(用整数数字 0~n(n 为正整数)表示某个单词在文档中出现的次数):

  • [0, 1, 1, 0, 0, 1, 2, 1, 1, 1]
  • [1, 0, 1, 1, 1, 0, 1, 1, 1, 0]

向量中每个元素表示词典中相关元素在文档中出现的次数。不过,在构造文档向量的过程中可以看到,我们并没有表达单词在原来句子中出现的次序,这也是 Bag-of-Words 模型的缺点之一。

from sklearn.feature_extraction.text import CountVectorizer

vectorizer = CountVectorizer()
data_corpus = ['Bob likes to play basketball, Jim likes too.']
vocabulary = vectorizer.fit(data_corpus)
x = vectorizer.transform(data_corpus)
print(vocabulary.get_feature_names())
print(x.toarray())

在这里插入图片描述

3.TF-IDF 模型

对区别文档最有意义的词语应该是那些在文档中出现频率高,而在整个文档集合的其他文档中出现频率少的词语,所以如果特征空间坐标系取词频 TF(Term Frequency)作为测度,就可以体现同类文本的特点。

另外考虑到单词区别不同类别的能力,TF-IDF 认为一个单词出现的文本频数越小,它区别不同类别文本的能力就越大。因此引入了逆文本频度 IDF(Inverse Document Frequency)的概念。

TF-IDF中,字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。 T F − I D F = 词频( T F ) × 逆文档频率( I D F ) TF-IDF=词频(TF)×逆文档频率(IDF) TFIDF=词频(TF×逆文档频率(IDF

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
import numpy as np

corpus = [
    'This is the first document.',
    'This is the second document.',
    'And the third document.',
    'Is this the first document?'
]

vectorizer = CountVectorizer()
x = vectorizer.fit_transform(corpus)
word = vectorizer.get_feature_names()

print('Vocabulary:', word, '\n')
print(x.toarray(), '\n')

# TF-IDF 转换
transfomers = TfidfTransformer()
tfidf = transfomers.fit_transform(x)
print(np.around(tfidf.toarray(), 4), '\n')

from sklearn.metrics.pairwise import cosine_similarity
# 比较最后一句与其他句子的相似度
print(cosine_similarity(tfidf[-1], tfidf[:-1], dense_output=False))

在这里插入图片描述

4.N-Gram 模型

分布假设:相似的词往往出现在同一环境中。出现在非常相似的部分(其相邻的词是相似的)中的两个词具有相似的含义。

n n n- g r a m gram gram 模型为了保持词的顺序,做了一个滑窗的操作,这里的 n n n 表示的就是滑窗的大小,例如 2 2 2- g r a m gram gram 模型,也就是把 2 2 2 个词当做一组来处理,然后向后移动一个词的长度,再次组成另一组词,把这些生成一个字典,按照词袋模型的方式进行编码得到结果。该模型考虑了词的顺序。

  • John likes to watch movies. Mary likes too.
  • John also likes to watch football games.

以上两句可以构造一个词典:

  • {1:"John likes”, 2:"likes to”, 3:"to watch”, 4:"watch movies”, 5:"Mary likes”, 6:"likes too”, 7:"John also”, 8:"also likes”, 9:“watch football”, 10:“football games”}

那么第一句的向量表示为:[1, 1, 1, 1, 1, 1, 0, 0, 0, 0],其中第一个 1 1 1 表示 John likes 在该句中出现了 1 1 1 次,依次类推。

缺点:随着 n n n 的大小增加,词表会成指数型膨胀,会越来越大。

# 一般n-gram中的n取2或者3, 这里取3为例
ngram_range = 3

def create_ngram_set(input_list):
    """
    description: 从数值列表中提取所有的n-gram特征
    :param input_list: 输入的数值列表, 可以看作是词汇映射后的列表,
                       里面每个数字的取值范围为[1, 25000]
    :return: n-gram特征组成的集合

    eg:
    # >>> create_ngram_set([1, 4, 9, 4, 1, 4])
    {(4, 9), (4, 1), (1, 4), (9, 4)}
    """
    return set(zip(*[input_list[i:] for i in range(ngram_range)]))

if __name__ == '__main__':
    input_list = ['明天', '有', '可能', '会', '下雨']
    res = create_ngram_set(input_list)
    print(res)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/173874.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

4. 基础语法

1. 标识符 a. 第一个字符必须是字母表中字母或下划线 _; b. 标识符的其他的部分由字母、数字和下划线组成; c. 标识符对大小写敏感; 在 Python 3 中,可以用中文作为变量名,非 ASCII 标识符也是允许的; 2.…

【JavaGuide面试总结】计算机网络·中

【JavaGuide面试总结】计算机网络中1.说说断开连接 - TCP 四次挥手2.为什么要四次挥手?3.为什么不能把服务器发送的 ACK 和 FIN 合并起来,变成三次挥手?4.如果第二次挥手时服务器的 ACK 没有送达客户端,会怎样?5.为什么…

第五届字节跳动青训营 前端进阶学习笔记(五)CSS进阶

文章目录前言CSS的重要特性1.选择器特指度(1)选择器优先级(2)选择器特指度2.继承(1)默认继承(2)显式继承3.初始值4.CSS属性值的计算过程布局(Layout)1.布局相…

搜索?——P3956 [NOIP2017 普及组] 棋盘

传送门: [NOIP2017 普及组] 棋盘 - 洛谷 思路: 将棋盘的每一个格子看做一个点,建一个无向图用来跑最短路. 这道题本应用搜索来做,但是转换成最短路好像简单点 建图: 1.对于已经有颜色的格子,在扫描四个方向的格子对相同颜色的建条长度为0…

【目标检测】目标检测究竟发展到了什么程度?聊聊这22年!

目录:目标检测的发展历程一、引言二、背景三、目标检测发展脉络3.1 传统目标检测算法3.1.1 Viola Jones Detector3.1.2 HOG Detector3.1.3 DPM Detector3.1.4 局限性3.2 Anchor-Based中的Two-stage目标检测算法3.2.1 RCNN3.2.2 SPPNet3.2.3 Fast RCNN3.2.4 Faster R…

Allegro如何设置Net Group操作指导

Allegro如何设置Net Group操作指导 Allegro除了可以对一组网络设置Bus以外,同样支持创建Net Group,如下图 功能和Bus的功能类似,并且同一个Net Group里面的网络可以形成一个shape形式的Group,方便查看 具体创建方法操作如下 打开规则管理器选择Electrical

MySQL窗口函教-开窗聚合函数(SUM()、AVG()、MAX()、MIN()、COUNT())

MySQL窗口函教-开窗聚合函数(SUM()、AVG()、MAX()、MIN()、COUNT())和传统的聚合函数区别?最大的区别在于,一个操作列,一个是依次操作行,最终显示出每一行,最后的效果就是呈现叠加的效果-- 开窗…

Windows环境下安装配置Mosquitto服务及入门操作介绍

文章目录一、概念梳理二、下载与安装三、关于配置文件的一些重要说明四、配置登录账号和密码参考: 博客一、概念梳理 Mosquitto是一款实现了消息推送协议MQTT 3.1的开源消息代理软件,提供轻量级的、支持可订阅/可发布的消息推送模式,是设备与…

mf10ccwm芯片说明部分译文

MF10-N是一种通用的双二阶状态变量滤波器,其中心频率与应用于时钟输入(fCLK)的方波的频率成正比。通过将引脚12连接到适当的直流电压,滤波器中心频率fO可以等于fCLK/100或fCLK/50。通过使用晶体时钟振荡器可以非常精确地设置&…

《深入浅出计算机组成原理》学习笔记 Day5

动态链接1. 静态链接与动态链接2. 地址无关3. PLT 和 GOT参考1. 静态链接与动态链接 静态链接(Static Link)是通过合并代码段的方法来使程序装载至内存; 动态链接(Dynamic Link)则是链接加载到内存中的共享库&#xf…

数据结构之栈与队列详解

文章目录前言一、栈1.栈的概念及定义2.栈的实现(1)栈的结构(2)StackInit(初始化)(3)StackPush(压栈)(4)StackPop(出栈&…

与众不同的异域年夜饭体验,你最中意哪一款?

年夜饭,中国人一年中最重要的一顿团圆聚餐,不仅丰富多彩,还充满了各种吉祥寓意。如果你选择的是出境旅游过春节,那么一次异域年夜饭体验也可以让你的旅行充满乐趣,收获与众不同的别样回忆。今天就跟着小旅城去看看&…

1597_AURIX_TC275_GPIO简介

全部学习汇总: GreyZhang/g_TC275: happy hacking for TC275! (github.com) 左上角画出来的这个寄存器可以进行输入输出的控制。从右边上下拉设备这里可以看得出来,输入输出其实都是可以配置的。当端口配置为输入的时候,逻辑图中的输出驱动会…

使用文本编辑器编写Java源代码

使用文本编辑器编写Java源代码 编写JavaJavaJava应用程序,可以使用任何一个文本编辑器来编写程序的源代码,然后使用JDKJDKJDK搭配的工具进行编译和运行,在这里,我将介绍一个使用简单的文本编辑器来开发一个JavaJavaJava应用程序的…

【创业分享】2022年,仅赚几万,但却很踏实?

大家好,欢迎来到停止重构的频道。本期,我们停一下技术讨论,反思一下2022年的变化以及展望一下2023年。回顾2022这是我们以正式商业主体创业的第一年。总的来说,除了不赚钱和软件产品还没做出来以外,其实还不错。自媒体…

Linux常用命令——tcpreplay命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) tcpreplay 将PCAP包重新发送,用于性能或者功能测试 补充说明 简单的说,tcpreplay是一种pcap包的重放工具,它可以将用ethreal、wireshark工具抓下来的包原样或经过任意修改后…

Spark Core 编程入门,常用算子介绍

RDD的创建 如下代码,Spark RDD编程的入口对象是SparkContext对象(不论何种编程语言),只有构建出SparkContext,基于它才能执行后续的API调用和计算 本质上,Spark Context对编程来说,主要功能就是创建第一个RDD出来 # …

JVM 垃圾回收(深入理解Java虚拟机第三章)

垃圾判断算法 引用计数法 每个对象增加引用计数器,引用加一,失效减一,为零判定为垃圾数据。 缺点:循环引用难以解决 根搜索算法 从树状引用链向下查找,如果对象无法找到,则标记为垃圾数据。 JVM算法 …

Java反射学习

反射的概念 Reflection(反射)是Java被视为动态语言的关键 反射机制允许程序在执行期借助于Reflection API获得任何类的内部信息, 并能直接操作任意对象的内部属性及方法。 加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象&…

【JavaEE】阻塞队列 + 生产者消费者模型

目录 阻塞队列 阻塞队列的使用 生产者消费者模型 模型的两个好处 1. 降低耦合 2. 削峰填谷 简单实现阻塞队列 阻塞队列 阻塞队列是在一般的队列上升级而来的。 对于队列为空时,如果还想取队列中的元素,此时阻塞队列就会进行阻塞。 对于队列为满时…