基于PCA和t-SNE可视化词嵌入


基于PCA和t-SNE可视化词嵌入文章插图
当你听到“茶”和“咖啡”这个词时 , 你会怎么看这两个词?也许你会说它们都是饮料 , 含有一定量的咖啡因 。 关键是 , 我们可以很容易地认识到这两个词是相互关联的 。 然而 , 当我们把“tea”和“coffee”两个词提供给计算机时 , 它无法像我们一样识别这两个词之间的关联 。
单词不是计算机自然就能理解的东西 。 为了让计算机理解单词背后的意思 , 这个单词需要被编码成数字形式 。 这就是词嵌入的用武之地 。
词嵌入是自然语言处理中常用的一种技术 , 将单词转换成向量形式的数值 。 这些向量将以一定的维数占据嵌入空间 。
如果两个词有相似的语境 , 比如“tea”和“coffee” , 那么这两个词在嵌入空间中的距离将彼此接近 , 而与具有不同语境的其他词之间的距离则会更远 。
在这篇文章中 , 我将逐步向你展示如何可视化嵌入这个词 。 由于本文的重点不是详细解释词嵌入背后的基本理论 , 你可以在本文和本文中阅读更多关于该理论的内容 。
为了可视化词嵌入 , 我们将使用常见的降维技术 , 如PCA和t-SNE 。 为了将单词映射到嵌入空间中的向量表示 , 我们使用预训练词嵌入GloVe。
加载预训练好的词嵌入模型在可视化词嵌入之前 , 通常我们需要先训练模型 。 然而 , 词嵌入训练在计算上是非常昂贵的 。 因此 , 通常使用预训练好的词嵌入模型 。 它包含嵌入空间中的单词及其相关的向量表示 。
GloVe是斯坦福大学研究人员在Google开发的word2vec之外开发的一种流行的预训练词嵌入模型 。 在本文中 , 实现了GloVe预训练的词嵌入 。
同时 , 我们可以使用Gensim库来加载预训练好的词嵌入模型 。 可以使用pip命令安装库 , 如下所示 。
pip install gensim作为第一步 , 我们需要将GloVe文件格式转换为word2vec文件格式 。 通过word2vec文件格式 , 我们可以使用Gensim库将预训练好的词嵌入模型加载到内存中 。 由于每次调用此命令时 , 加载此文件都需要一些时间 , 因此 , 如果仅为此目的而使用单独的Python文件 , 则会更好 。
import picklefrom gensim.test.utils import datapath, get_tmpfilefrom gensim.models import KeyedVectorsfrom gensim.scripts.glove2word2vec import glove2word2vecglove_file = datapath('C:/Users/Desktop/glove.6B.100d.txt')word2vec_glove_file = get_tmpfile("glove.6B.100d.word2vec.txt")glove2word2vec(glove_file, word2vec_glove_file)model = KeyedVectors.load_word2vec_format(word2vec_glove_file)filename = 'glove2word2vec_model.sav'pickle.dump(model, open(filename, 'wb'))创建输入词并生成相似单词现在我们有了一个Python文件来加载预训练的模型 , 接下来我们可以在另一个Python文件中调用它来根据输入词生成最相似的单词 。 输入词可以是任何词 。
输入单词后 , 下一步就是创建一个代码来读取它 。 然后 , 我们需要根据模型生成的每个输入词指定相似单词的数量 。 最后 , 我们将相似单词的结果存储在一个列表中 。 下面是实现此目的的代码 。
import picklefilename = 'glove2word2vec_model.sav'model = pickle.load(open(filename, 'rb'))def append_list(sim_words, words):list_of_words = []for i in range(len(sim_words)):sim_words_list = list(sim_words[i])sim_words_list.append(words)sim_words_tuple = tuple(sim_words_list)list_of_words.append(sim_words_tuple)return list_of_wordsinput_word = 'school'user_input = [x.strip() for x in input_word.split(',')]result_word = []for words in user_input:sim_words = model.most_similar(words, topn = 5)sim_words = append_list(sim_words, words)result_word.extend(sim_words)similar_word = [word[0] for word in result_word]similarity = [word[1] for word in result_word] similar_word.extend(user_input)labels = [word[2] for word in result_word]label_dict = dict([(y,x+1) for x,y in enumerate(set(labels))])color_map = [label_dict[x] for x in labels]