在我的第一篇文章里我介绍了Bert生成词向量并进行了简单的可视化和聚类,得到的效果很不错。想到之前我也用过word2vec做过类似的事情,所以就想着用两种词向量生成方法进行一下对比。直接上代码吧:
from gensim.models import Word2Vec
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
KM = KMeans(n_clusters=2)
model = Word2Vec.load("C:UsersAdministratorDesktopword2vecWord60.model") #加载训练好的模型
corpus = []
B = model.wv.index2word #获取word2vec训练过的词汇
gb = open('C:UsersAdministratorDesktopfunNLP-masterdata动物词库THUOCL_animal.txt',encoding='utf-8').readlines()
for word in gb[:30]: #为了方便,每个词库只取了前面30个单词
word = word.split('t')
if word[0] in B:
corpus.append(word[0])
fb = open('C:UsersAdministratorDesktopfunNLP-masterdata地名词库THUOCL_diming.txt',encoding='utf-8').readlines()
for word in fb[:30]:
word = word.split('t')
if word[0] in B:
corpus.append(word[0])
vector = model[corpus]
vector_ = pca.fit_transform(vector)
y_ = KM.fit_predict(vector_)
plt.rcParams['font.sans-serif'] = ['FangSong']
plt.scatter(vector_[:,0],vector_[:,1],c=y_)
for i in range(len(corpus)): #给每个点进行标注
plt.annotate(s=corpus[i], xy=(vector_[:, 0][i], vector_[:, 1][i]),
xytext=(vector_[:, 0][i] + 0.1, vector_[:, 1][i] + 0.1))
plt.show()
这里用到的是别人已经训练好的模型,文末我会给出下载连接。把里面的三个文件都下载放在同一个目录就能用了。
得到的效果如下图:
![00abe6ce9135a895eb3413b04a8493b6.png](https://i-blog.csdnimg.cn/blog_migrate/87ab3dab306734e5663ab08971afa095.png)
我再把之前用Bert生成的词向量聚类效果放在下面对比下:
![f904c95b9d7f6bc3864100bee59f5378.png](https://i-blog.csdnimg.cn/blog_migrate/b8434288001fb755f3a1035b64492314.png)
总的来说两种词向量聚类效果都还算不错。但是word2vec的不仅错误率要高(可以从图中看到美国、德国、亚洲、南方、大陆等词汇都分错了),而且有些词汇不在训练词汇中,所以无法给出词向量(比如小尾寒羊)。
训练好的文件下载地址:https://pan.baidu.com/s/1fWVnqLIhwRBftETzIEN9_A
提取码:dgjp