基于word2vec的詞語(yǔ)相似度計(jì)算

應(yīng)用場(chǎng)景

假設(shè)你有一個(gè)商品的數(shù)據(jù)庫(kù),比如:

商品名稱 價(jià)格
椅子 200元/個(gè)
香蕉 6元/斤
冰箱 2000元/臺(tái)

現(xiàn)在通過用戶的輸入來(lái)檢索商品的價(jià)格株依,最簡(jiǎn)單的方法就是通過字符串進(jìn)行匹配,比如性穿,
用戶輸入“椅子”勺三,就用“椅子”作為關(guān)鍵字進(jìn)行搜索,很容易找到椅子的價(jià)格就是200元/個(gè)需曾。
但有時(shí)用戶輸入的是“凳子”吗坚,如果按照字符串匹配的方法,只能返回給用戶呆万,沒有此商品商源。但實(shí)際上可以把“椅子”的結(jié)果返回給用戶參考。這種泛化的能力谋减,通過簡(jiǎn)單的字符串匹配是顯然不能實(shí)現(xiàn)的牡彻。

詞語(yǔ)相似度計(jì)算

在上面的例子中,“凳子”跟“椅子”的語(yǔ)意更相近,跟“香蕉”或“冰箱”的語(yǔ)意相對(duì)較遠(yuǎn)庄吼。在商品搜索的過程中缎除,可以計(jì)算用戶輸入的關(guān)鍵字與數(shù)據(jù)庫(kù)中商品名間的相似度,在商品數(shù)據(jù)庫(kù)中找出相似度最大的商品总寻,推薦給用戶器罐。這種相近的程度就是詞語(yǔ)的相似度。在實(shí)際的工程開發(fā)中可以通過word2vec實(shí)現(xiàn)詞語(yǔ)相似度的計(jì)算渐行。

代碼實(shí)現(xiàn)

from sklearn.datasets import fetch_20newsgroups

news = fetch_20newsgroups(subset='all')
X, y = news.data, news.target

from bs4 import BeautifulSoup
import nltk, re


# 把段落分解成由句子組成的list(每個(gè)句子又被分解成詞語(yǔ))
def news_to_sentences(news):
    news_text = BeautifulSoup(news, 'lxml').get_text()
    tokenizer = nltk.data.load('tokenizers/punkt/english.pickle')
    raw_sentences = tokenizer.tokenize(news_text)

    # 對(duì)每個(gè)句子進(jìn)行處理轰坊,分解成詞語(yǔ)
    sentences = []
    for sent in raw_sentences:
        sentences.append(re.sub('[^a-zA-Z]', ' ', sent.lower().strip()).split())
    return sentences


sentences = []

for x in X:
    sentences += news_to_sentences(x)

# import numpy
# # 將預(yù)處理過的"詞庫(kù)"保存到文件中,便于調(diào)試
# numpy_array = numpy.array(sentences)
# numpy.save('sentences.npy', numpy_array)
#
# # 將預(yù)處理后的"詞庫(kù)"從文件中讀出祟印,便于調(diào)試
# numpy_array = numpy.load('sentences.npy')
# sentences = numpy_array.tolist()

num_features = 300
min_word_count = 20
num_workers = 2
context = 5
downsampling = 1e-3

from gensim.models import word2vec

model = word2vec.Word2Vec(sentences, workers=num_workers,         size=num_features, min_count=min_word_count, window=context,
                      sample=downsampling)

model.init_sims(replace=True)

# 保存word2vec訓(xùn)練參數(shù)便于調(diào)試
# model.wv.save_word2vec_format('word2vec_model.bin', binary=True)
# model.wv.load_word2vec_format('word2vec_model.bin', binary=True)

print '詞語(yǔ)相似度計(jì)算:'
print 'morning vs morning:'
print model.n_similarity('morning', 'morning')
print 'morning vs afternoon:'
print model.n_similarity('morning', 'afternoon')
print 'morning vs hello:'
print model.n_similarity('morning', 'hellow')
print 'morning vs shell:'
print model.n_similarity('morning', 'shell')

運(yùn)行結(jié)果

/Users/liucaiquan/anaconda/bin/python /Users/liucaiquan/PycharmProjects/WordSimilarityCalculation/src/test.py
詞語(yǔ)相似度計(jì)算:
morning vs morning:
1.0
morning vs afternoon:
0.871482091583
morning vs hello:
0.731609166442
morning vs shell:
0.709714434122

調(diào)試技巧

在開發(fā)調(diào)試的過程中肴沫,會(huì)出現(xiàn)錯(cuò)誤,需要重新運(yùn)行程序蕴忆。如果每次修改后颤芬,都從頭開始執(zhí)行,肯定會(huì)消耗很多無(wú)用的時(shí)間孽文。比如驻襟,預(yù)處理后的文本結(jié)果和word2vec的訓(xùn)練參數(shù),這些中間結(jié)果可以保持下來(lái)芋哭,當(dāng)遇到問題時(shí)沉衣,就可以從文件中讀取結(jié)果,而不需要每次都從頭開始减牺。

源碼下載地址

https://github.com/CaiquanLiu/MachineLearning

代碼參考

《Python機(jī)器學(xué)習(xí)及實(shí)踐:從零開始通往Kaggle競(jìng)賽之路》

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末豌习,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子拔疚,更是在濱河造成了極大的恐慌肥隆,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件稚失,死亡現(xiàn)場(chǎng)離奇詭異栋艳,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)句各,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門吸占,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人凿宾,你說(shuō)我怎么就攤上這事矾屯。” “怎么了初厚?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵件蚕,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng)排作,這世上最難降的妖魔是什么牵啦? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮纽绍,結(jié)果婚禮上蕾久,老公的妹妹穿的比我還像新娘势似。我一直安慰自己拌夏,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布履因。 她就那樣靜靜地躺著障簿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪栅迄。 梳的紋絲不亂的頭發(fā)上站故,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音毅舆,去河邊找鬼西篓。 笑死,一個(gè)胖子當(dāng)著我的面吹牛憋活,可吹牛的內(nèi)容都是我干的岂津。 我是一名探鬼主播,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼悦即,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼吮成!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起辜梳,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤粱甫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后作瞄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茶宵,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年宗挥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了乌庶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡属韧,死狀恐怖安拟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情宵喂,我是刑警寧澤糠赦,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響拙泽,放射性物質(zhì)發(fā)生泄漏淌山。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一顾瞻、第九天 我趴在偏房一處隱蔽的房頂上張望泼疑。 院中可真熱鬧,春花似錦荷荤、人聲如沸退渗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)会油。三九已至,卻和暖如春古毛,著一層夾襖步出監(jiān)牢的瞬間翻翩,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工稻薇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留嫂冻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓塞椎,卻偏偏與公主長(zhǎng)得像桨仿,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子忱屑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 前面的文章主要從理論的角度介紹了自然語(yǔ)言人機(jī)對(duì)話系統(tǒng)所可能涉及到的多個(gè)領(lǐng)域的經(jīng)典模型和基礎(chǔ)知識(shí)蹬敲。這篇文章,甚至之后...
    我偏笑_NSNirvana閱讀 13,906評(píng)論 2 64
  • 機(jī)器學(xué)習(xí)(Machine Learning)&深度學(xué)習(xí)(Deep Learning)資料(Chapter 1) 注...
    Albert陳凱閱讀 22,239評(píng)論 9 476
  • (唐)李賀 大漠沙如雪莺戒,燕山月似鉤伴嗡。 何當(dāng)金絡(luò)腦,快走踏清秋从铲。 詩(shī)境還原:周子蘊(yùn)(5年級(jí)) 深夜瘪校,一輪明亮的弦月像...
    沁桐閱讀 4,754評(píng)論 1 2
  • 最近感覺已經(jīng)有好幾天夢(mèng)里都見到奶奶,奶奶離開我已經(jīng)有快8年了名段,眼睛一酸阱扬,就發(fā)了一條朋友圈。 朋友們都評(píng)論伸辟, 夢(mèng)是反...
    WOO梵馨怡miU閱讀 543評(píng)論 0 0
  • 時(shí)光流逝 推杯換盞 就這么我又長(zhǎng)大了一歲 有人說(shuō)我變了很多 沒錯(cuò)麻惶,我變了 之前最不喜歡留胡子的 變得開始喜歡留胡子...
    大作家史努比閱讀 160評(píng)論 0 1