用word2vec進行英語辭彙聚類生成單詞樹
Word2vec可以用來生詞單詞(本文是英語)的向量表示,這些向量之間的距離(一般用cosine)很好的反映了兩個單詞之間的語義距離,而且更加神奇的是,某些詞向量可以進行數學上的加減運算。比如vector(Paris) - vector(France) +
vector(Italy) 約等於vector(Rome), vector(king) - vector(man) + vector(woman) 約等於vector(queen) 。本文利用gensim,和google預訓練好的word2vec模型對常用的英語單詞進行了聚類分析,常用的英語單詞選取了Google Top 10000的英語單詞(google-10000-english.txt)。
再進行聚類分析之前首先需要提取出這10000個英語單詞的向量表示,在gensim中首先載入預訓練的模型,然後直接可以用預訓練的模型提取向量。
word_vectors = {}#load top 10000 word to word_vectors with open(GOOGLE_ENGLISH_WORD_PATH) as f: lines = f.readlines() for line in lines: line = line.strip(
) if line: word = line print(line) word_vectors[word]=Nonemodel = gensim.models.KeyedVectors.load_word2vec_format(GOOGLE_WORD2VEC_MODEL, binary=True) for word in word_vectors: try: v= model.wv[word] word_vectors[word] = v except: passsave_model(word_vectors,GOOGLE_WORD_FEATURE)
完成單詞的向量提取以後,可以選擇聚類演算法來分析單詞。這裡很容易想到kmean演算法,而且這也是大家常見的進行單詞聚類的方法。不過,本文沒有選擇kmeans,而是選擇了層次聚類演算法。層次聚類演算法的好處是,可以完整的從下到上看到分類樣本的聚類樹形關係。Scipy中的linkage可以完成層次聚類,並且得到完整的聚類結果。Dendrogram可以用來生成樹圖。不過10000個單詞全部顯示出來,不現實。本文寫了一個hierarchical_cluster函數會解析linkage函數返回的數據,並且以一個樹的格式存入clusters變數中,這個變數會以json格式寫入文件中,便於後面分析。
from scipy.cluster.hierarchy import dendrogram, linkagedef hierarchical_cluster(centers,wods): to_merge = linkage(centers,method=average, metric=cosine) clusters = {} maxcluster =0 for i, merge in enumerate(to_merge): if merge[0] <= len(to_merge): a = centers[int(merge[0]) - 1] a=words[int(merge[0]) ] else: a = clusters[int(merge[0])] if merge[1] <= len(to_merge): b = words[int(merge[1])] else: b = clusters[int(merge[1])] distance=merge[2] count = merge[3] clusters[1 + i + len(to_merge)] = { children : [a, b],distance:distance,count:count } maxcluster=1 + i + len(to_merge) return clusters,maxclustercluster的格式大致如下 { "distance": 0.45818002237821087, "children": [ leftcluster, righcluster ], "count": 2.0 }
10000個單詞生成的所有層次聚類的cluster是非常大的,不是很容易顯示。
不過我們可以將真箇層次聚類的樹分裂成一顆一顆的子樹顯示,如果這顆樹的單詞數目達到300左右,我們可以單獨把這棵樹拿出來觀察。根據這種分裂原則我們在原來樹基礎上生成了幾十個左右的子樹,通過觀察這些子樹我們發現了許多有趣的單詞聚類現象。
出現了很多聯繫動詞:
創造力創新
:
有的是科學實驗為主:
髒話和婚姻家庭:
商標相關的:
日期時間相關的:
電視媒體:
國家:
身體相關+槍支:
汽車品牌:
文具相關:
人口學相關:
office:
交通:
地名:
通過觀察這些聚類結果可以發現很多有趣的單詞之間的聯繫,每一顆子樹可能包括多種不同語義的單詞集合,但是我們已經可以很容易的觀察到並且可以將它分離出來。
Word2Tree推薦閱讀: