第一 glove是用来生成词向量的 ,在网上下载之后,会有一个txt格式的文件。截图如下:
小伙伴们一定想知道 glove.6B.XXXd.txt ( 例如 glove.6B.50d.txt,XXX是多少 就代表多少维 300d 那就是300维) 文件里面装了什么
它的每一行的格式如下:
具体截图如下
第一行 是由英语单词 the 和 50个数字组成 具体是多少个数字 ? 要看词表? 多少个数字也就代表了是多少维 50个数字也就是50维。
什么叫做词表??? 大家看到的 glove.6B.XXXd.txt 这个文件 也就是所谓的词表。
我本人是学习自然语言处理的,也就是NLP (Natural Language Processing)。
自然语言处理可以解决的很多的问题,比如(情感分析,情感计算,文本挖掘,事件抽取,命名实体识别等等),这些问题都是有具体的应用的,也有他的实际价值。
这个实质上在干什么呢?我们先不讨论这些具体要解决的问题 ,就单纯的谈一下这个问题的解决流程。
那么问题来了,计算机怎么去认识那些词语呢,计算机只认识数字。所以便有了所谓的词向量(Word Embedding),在没有词向量之前,大家用的是one-hot编码这个东西。
如果在这里展开下去,那就要说很多,这不是重点。重点是我们把 一句话变成计算机可以认识的东西是关键,怎么操作呢? 那就是把每一个词转换成词向量。
所以就有了上面的截图 要大家知道glove词表,以及词表里面具体有什么东西。每一行代表了什么。50个数字就是 每一行最开始那个单词对应的 词向量。
既然说到这里了。说一下个人很浅显的见解,词向量也就是 所谓的文本表示 这些数字为什么非要是文本里面显示的那一行数字呢?为什么不是咋们自己随便写的呢?
这些词向量都是大公司 谷歌 微软 百度公司 他们在大规模的语料上训练生成得到的。
假如咋们选取了50维度的词向量或者300维度的词向量,这些数字都有意义的,所以咋们就要用它。固定某一维度后,所有的字都用这个维度下的词向量表示,也就是有个标准。
用统一的词向量来表示和解决后面具体的问题。
上面说了一大堆 有些自己的学习感受和理解,大家可以理解看看,是不是这么个意思。
关于如何使用词表,正式开始!
为了讲解的方便 我直接自己新建了一个文件test222.txt 这个里面只有三行数据 ,原理是一样的,具体操作也是一样的。
大家在自己使用的时候,只需要把我这后面的 文件路径改一改 ,改成大家自己下载的词表的存储路径。有些东西还是交代清楚。
文件里面就装了这些东西。中间用的是 tab隔开的。 也就是 "\t"。
首先读取文件 直接用open
然后通过一个for 循环 这里面的每一个line 里面装的都是 词语 和 词向量
embeddings_dict 代表了一个字典 然后向字典里面添加数据。
import numpy as np # 导入numpy包
embeddings_dict = {} # 新建一个字典 里面装键值对
with open("test222.txt", 'r',encoding="utf-8") as f:
for line in f:
values = line.split()
word = values[0] #这个零 代表的是索引 下面的 一 也是同样的道理
vector = np.asarray(values[1:], "float32")
embeddings_dict[word] = vector # 向字典里面添加数据 一个键 一个数值
然后分别获取字典里面的 键 和 值,进一步进行存储,代码如下:
np.save('resultFile/wordsList', np.array(list(embeddings_dict.keys())))
np.save('resultFile/wordVectors', np.array(list(embeddings_dict.values())))
# resultFile/wordsList 这个东西这样理解。resultFile是一个文件目录 我们将东西存入到wordsList里面,wordsList 是自动生成的 这个一个npy格式文件的名字 ,想取什么名字都行
为什么要干这么一件事情呢?因为我们说的每一话 那个词语都是随机组成的 不是固定的,我们必须准确无误的查询到每一个词或者词语的具体词向量表示是什么。
这个词表都给出来了 ,我们把对应词的词向量准确的找到即可。这就是目的。
假如现在有一个词 我要找它的词向量,怎么做?请看下面
wordsList = np.load('resultFile/wordsList.npy')
# 这一行代码就是要加载之前生产的.npy文件 因为里面装了所有的词
wordsList = wordsList.tolist()
# 我们要把这个文件转换成 list 列表格式 便于后面我们找索引。
#为什么找索引 index ?因为 词 和词向量是一一对应的 我们之前存储的时候就是按照顺序存储的
#比如wordsList第一行是 the 这个单词。 然后wordVectors 这个文件第一行就是它的词向量
# 这就是 查找索引的意义 也就是说 两个文件分别存储 键 和 值 。索引是个桥梁 就是这么个意思
刚刚这是准备工作 比如找 "陈六" 的词向量 请看下面代码
# 下面这一行代码是要找 陈六
baseballIndex = wordsList.index('陈六')
print(baseballIndex) #找到了桥梁 索引 咋们把这个索引号打出来
wordVectors = np.load('resultFile/wordVectors.npy') # 加载单独存储的那个词向量文件
print(wordVectors.shape) # 输出维度 比如(25,50) 这个25代表多少个词 50表示每一个词是用多少维向量表示
print(wordVectors[baseballIndex] # 顺利的输出 词向量
这个[45,33,95]是那个test222.txt文件里面我随便编的 ,意思就是可以顺利找到那个所谓的词向量。
注意 大家自己用的时候 直接把我代码中 那个test222.txt文件的路径,改成你自己glove文件路径,一切便可以正常使用了。我把完成的代码放在下面。
写这个博客 也是我自己学习的过程,希望看我博客的小伙伴,可以点个赞 鼓励一下我。谢谢大家!
import numpy as np
embeddings_dict = {}
with open("test222.txt", 'r',encoding="utf-8") as f:
for line in f:
values = line.split()
word = values[0]
vector = np.asarray(values[1:], "float32")
embeddings_dict[word] = vector
print(embeddings_dict)
np.save('resultFile/wordsList', np.array(list(embeddings_dict.keys())))
np.save('resultFile/wordVectors', np.array(list(embeddings_dict.values())))
wordsList = np.load('resultFile/wordsList.npy')
wordsList = wordsList.tolist()
print(type(wordsList),"类型")
baseballIndex = wordsList.index('陈六')
print(baseballIndex)
wordVectors = np.load('resultFile/wordVectors.npy')
print(wordVectors.shape)
print(wordVectors[baseballIndex])