同義詞查找,關鍵詞擴展,使用騰訊Tencent AILAB的800萬詞向量,gensim,annoy


最近在做一個關鍵詞匹配系統,為了更好的效果,

添加一個關鍵詞擴展的功能。使用Tencent AIlab的800萬詞向量文件。

 

騰訊AILAB的800萬詞向量下載地址:https://ai.tencent.com/ailab/nlp/zh/embedding.html     這個是最新的有效地址

 

是用gensim模塊讀取詞向量,並找到相似詞,占用內存比較大,速度也慢,最好是16g以上的內存和高主頻的cpu

import gensim


wv_from_text = gensim.models.KeyedVectors.load_word2vec_format('./Tencent_AILab_ChineseEmbedding.txt',binary=False)

wv_from_text.init_sims(replace=True)  # 神奇,很省內存,可以運算most_similar


while True:
    keyword = input("輸入關鍵詞:")
    w1 = [keyword]
    print(wv_from_text.most_similar(positive=w1,topn=5))

  會返回5個最相似的詞語

 

下面這個代碼會使用annoy模塊,這個模塊好像不支持windows,要使用linux系統,32g以上內存加上高主頻cpu。

from gensim.models import KeyedVectors
import json
from collections import OrderedDict
from annoy import AnnoyIndex

# 此處加載時間略長,加載完畢后大概使用了12G內存,后續使用過程中內存還在增長,如果測試,請用大一些內存的機器
tc_wv_model = KeyedVectors.load_word2vec_format('./Tencent_AILab_ChineseEmbedding.txt', binary=False)

# 構建一份詞匯ID映射表,並以json格式離線保存一份(這個方便以后離線直接加載annoy索引時使用)
word_index = OrderedDict()
for counter, key in enumerate(tc_wv_model.vocab.keys()):
    word_index[key] = counter

with open('tc_word_index.json', 'w') as fp:
    json.dump(word_index, fp)

# 開始基於騰訊詞向量構建Annoy索引,騰訊詞向量大概是882萬條
# 騰訊詞向量的維度是200
tc_index = AnnoyIndex(200)
i = 0
for key in tc_wv_model.vocab.keys():  #遍歷Tencent詞向量的所有詞
    v = tc_wv_model[key]
    tc_index.add_item(i, v)
    i += 1


# 這個構建時間也比較長,另外n_trees這個參數很關鍵,官方文檔是這樣說的:
# n_trees is provided during build time and affects the build time and the index size.
# A larger value will give more accurate results, but larger indexes.
# 這里首次使用沒啥經驗,按文檔里的是10設置,到此整個流程的內存占用大概是30G左右
tc_index.build(10)

# 可以將這份index存儲到硬盤上,再次單獨加載時,帶詞表內存占用大概在2G左右
tc_index.save('tc_index_build10.index')

# 准備一個反向id==>word映射詞表
reverse_word_index = dict([(value, key) for (key, value) in word_index.items()])

# 然后測試一下Annoy,自然語言處理和AINLP公眾號后台的結果基本一致
# 感興趣的同學可以關注AINLP公眾號,查詢:相似詞 自然語言處理
for item in tc_index.get_nns_by_item(word_index[u'自然語言處理'], 11):
    print(reverse_word_index[item])

# 不過英文詞的結果好像有點不同
for item in tc_index.get_nns_by_item(word_index[u'nlp'], 11):
    print(reverse_word_index[item])

  

 OK,上面的代碼已經保存好了索引詞文件,和索引詞向量文件,下面開始使用,

它和gensim還是有些區別的,就是你查找相似的詞必須在Tencent 詞向量的詞表里,

否則不能查,而gensim就不會有這個問題

import json
from annoy import AnnoyIndex


# JSON到字典轉化
f2 = open('tc_word_index.json', 'r')
word_index = json.load(f2)


# 開始基於騰訊詞向量構建Annoy索引,騰訊詞向量大概是882萬條
# 騰訊詞向量的維度是200
tc_index = AnnoyIndex(200)
# 加載保存好的索引,帶詞表內存占用大概在2G左右
tc_index.load('tc_index_build10.index')

# 准備一個反向id==>word映射詞表
index_word = dict([(value, key) for (key, value) in word_index.items()])

# 查詢:相似詞 自然語言處理
while True:
    keyword = input("請輸入關鍵詞:")
    index = word_index.get(keyword)
    if index:
        print("相似詞有:")
        #獲取相似的結果和分數 [[結果,,,],[分數,,,]]
        result = tc_index.get_nns_by_item(index, 10, include_distances=True)
        #獲取分數小於0.65的結果
        sim_keywords = [(index_word[idx],distance) for idx,distance in zip(result[0],result[1]) if distance<0.8]

        print(sim_keywords)
    else:
        print("詞表不存在輸入的關鍵詞!")

  分數越小越代表相似度高

請輸入關鍵詞:價格
價格
相似詞有:
[('價格', 0.0), ('價位', 0.6172553896903992), ('價', 0.6483607888221741), ('中價格', 0.6971825361251831), ('價格降', 0.7441657185554504), ('相對價格', 0.7511115074157715), ('選擇價格', 0.7584652304649353), ('期望價格', 0.7803905606269836), ('心理價位', 0.7834618091583252), ('差價', 0.7885775566101074)]
請輸入關鍵詞:年齡
年齡
相似詞有:
[('年齡', 0.0), ('25歲', 0.7704739570617676)]
請輸入關鍵詞:身高
身高
相似詞有:
[('身高', 0.0), ('172cm', 0.6500729918479919), ('169cm', 0.6635174751281738), ('187cm', 0.6728192567825317), ('171cm', 0.6744356155395508), ('166cm', 0.6759911179542542), ('身高太矮', 0.6901100873947144), ('身高178', 0.6942415833473206), ('模特身高', 0.707866907119751), ('身高173', 0.7188507914543152)]
請輸入關鍵詞:體重
體重
相似詞有:
[('體重', 0.0), ('標准體重', 0.7117555737495422), ('孕前體重', 0.719347357749939), ('增重', 0.7211400270462036), ('理想體重', 0.7256979942321777), ('70公斤', 0.7259328961372375), ('60公斤', 0.7400050759315491), ('孕期體重增加', 0.7469530701637268), ('體重范圍', 0.7582899332046509), ('體重控制', 0.774792492389679)]
請輸入關鍵詞:

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM