此書專注于中文的自然語言處理,以Python及其相關(guān)框架為工具,以實(shí)戰(zhàn)為導(dǎo)向,詳細(xì)講解了自然語言處理的各種核心技術(shù)、方法論和經(jīng)典算法。三位作者在人工智能、大數(shù)據(jù)和算法領(lǐng)域有豐富的積累和經(jīng)驗(yàn),是阿里巴巴、前明略數(shù)據(jù)和七牛云的資深專家。同時(shí),本書也得到了阿里巴巴達(dá)摩院高級(jí)算法專家、七牛云AI實(shí)驗(yàn)室Leader等專家的高度評(píng)價(jià)和鼎力推薦。
本節(jié)將利用訓(xùn)練好的詞向量和段落向量對(duì)兩篇關(guān)于天津全運(yùn)會(huì)的新聞進(jìn)行向量化,并計(jì)算兩篇新聞的相似度。如下是兩篇新聞:
新聞1:6日,第十三屆全運(yùn)會(huì)女子籃球成年組決賽在天津財(cái)經(jīng)大學(xué)體育館打響,中國(guó)籃協(xié)主席姚明到場(chǎng)觀戰(zhàn)。姚明在接受媒體采訪時(shí)表示,天津全運(yùn)會(huì)是全社會(huì)的體育盛會(huì),他稱贊了賽事保障與服務(wù)工作,并表示中國(guó)籃協(xié)將在未來的工作中挖掘天津籃球文化的價(jià)值。
本屆天津全運(yùn)會(huì)增加了包括攀巖、馬拉松、象棋在內(nèi)的19個(gè)大項(xiàng)的群眾體育比賽項(xiàng)目,普通群眾成為賽場(chǎng)“主角”。對(duì)此,姚明表示:“引入群眾性的體育項(xiàng)目,真正做到了全運(yùn)會(huì)的‘全’字,這不僅僅是專業(yè)運(yùn)動(dòng)員的盛會(huì),更是全社會(huì)的體育盛會(huì)?!闭劶氨緦萌\(yùn)會(huì)賽事籌備與保障服務(wù)時(shí),姚明說:“全運(yùn)會(huì)得到了天津市委市政府和各區(qū)、各學(xué)校的大力幫助,籃球項(xiàng)目比賽(順利舉辦)要感謝天津方方面面的支持。”此外,姚明還對(duì)全運(yùn)村內(nèi)的保障服務(wù)和志愿者工作表示贊賞。“很多熟悉的教練員和運(yùn)動(dòng)員都表示服務(wù)保障很不錯(cuò),志愿者態(tài)度很積極?!薄拔阌怪靡?,天津是中國(guó)籃球發(fā)源地,1895年,在籃球運(yùn)動(dòng)誕生4年的時(shí)候就漂洋過海從天津上岸,這是中國(guó)籃球具有歷史意義的地方?!币γ髟谡劶疤旖蚧@球文化和未來發(fā)展時(shí)說,“天津保留著迄今為止世界上最古老的室內(nèi)籃球場(chǎng),這都是非常重要的籃球文化遺產(chǎn),希望能在未來的工作中挖掘這些歷史遺產(chǎn)的價(jià)值?!币γ髡f:“天津是座美麗的城市,這次來天津能夠感到濃厚的體育文化元素,希望運(yùn)動(dòng)員和教練員在比賽賽得好的同時(shí),也能領(lǐng)略到天津的城市文化?!?/p>
新聞2:從開幕式前入住全運(yùn)村到奔波于全運(yùn)三座籃球場(chǎng)館之間,中國(guó)籃協(xié)主席姚明抵津已有10多天了。昨天在天津財(cái)大籃球館,姚明還饒有興致地談了對(duì)本次天津全運(yùn)會(huì)的看法,能夠讓群眾融入進(jìn)來,是他覺得最有亮點(diǎn)的地方。 “全運(yùn)會(huì)是一項(xiàng)很有傳統(tǒng)的運(yùn)動(dòng)會(huì),這次來到天津,得到市委、市政府的大力支持,天津各個(gè)區(qū)學(xué)校對(duì)于籃球比賽從人員到場(chǎng)館給予很大幫助,中國(guó)籃協(xié)作為競(jìng)委會(huì)的一員,受到總局的委派承辦籃球的比賽,真的非常感謝天津?qū)ξ覀兎椒矫婷娴闹С??!北M管之前多次到訪津城,不過這次因?yàn)槿\(yùn),還是給了姚明很多不一樣的感受,“天津是座非常美麗的城市,我之前來這里很多次了,這次來感受到了非常濃烈的體育文化元素,我們希望運(yùn)動(dòng)員、教練員在這座美麗的城市比賽賽得好,同時(shí)能夠領(lǐng)略到天津的城市文化。”本屆全運(yùn)的群眾項(xiàng)目的比賽,引起了姚明極大的興趣,“這次天津全運(yùn)會(huì)最突出的特點(diǎn)是引入了群眾性體育和群眾性的項(xiàng)目,同時(shí)設(shè)立了群眾性的獎(jiǎng)牌和榮譽(yù),是真的做到了一個(gè)‘全’字,這也符合體育融入社會(huì)的一個(gè)大趨勢(shì),全運(yùn)會(huì)不該只是專業(yè)運(yùn)動(dòng)員的盛會(huì),也是所有社會(huì)人的一個(gè)盛會(huì)?!睂?duì)于這段時(shí)間在天津的生活,姚明也是贊不絕口,“我們作為籃協(xié)的官員都住在技術(shù)官員村,這段時(shí)間的生活工作都在里面,聽到了很多熟悉的運(yùn)動(dòng)員、教練員對(duì)本次全運(yùn)會(huì)的夸贊,生活工作非常方便,保障非常齊全,我們?yōu)樘旖蚋械椒浅8吲d。很多場(chǎng)館都很新,很多志愿者都很年輕,大家都積極奔波在各自的崗位上,這一點(diǎn)我們的運(yùn)動(dòng)員和教練員應(yīng)該是最有發(fā)言權(quán)的?!弊鳛橹袊?guó)最出色的籃球運(yùn)動(dòng)員,姚明也談了天津作為中國(guó)籃球故鄉(xiāng)的感受,“毋庸置疑,天津是中國(guó)籃球的發(fā)源地,是籃球傳入中國(guó)的第一故鄉(xiāng),在籃球1891年誕生之后4年就漂洋過海來到中國(guó),在天津上岸,這是對(duì)中國(guó)籃球具有歷史意義的地方,并且我們也知道這里保留了迄今為止世界上最古老的室內(nèi)籃球館,這些都是我們非常重要的文化遺產(chǎn)。我希望我們?cè)谖磥淼墓ぷ髦校梢宰屵@樣越來越多的歷史故事被重新挖掘出來。
1. word2vec計(jì)算網(wǎng)頁(yè)相似度
word2vec計(jì)算網(wǎng)頁(yè)相似度的基本方法是:抽取網(wǎng)頁(yè)新聞中的關(guān)鍵詞,接著將關(guān)鍵詞向量化,然后將得到的各個(gè)詞向量相加,最后得到的一個(gè)詞向量總和代表網(wǎng)頁(yè)新聞的向量化表示,利用這個(gè)總的向量計(jì)算網(wǎng)頁(yè)相似度。包括的步驟是:1)關(guān)鍵詞提取,2)關(guān)鍵詞向量化,3)相似度計(jì)算。
首先是關(guān)鍵詞提取,這里我們采用jiebag工具包中tfidf關(guān)鍵詞提取方法,如下圖7-14所示,函數(shù)KeyWord_Extract的功能就是提取句子的關(guān)鍵詞,并將關(guān)鍵詞保存在txt文件中。
def Word_cut(sentence, file_name):words = pseg.cut(sentence)for word in words:with open(file_name, "a") as f:f.write(str(word.word.encode("utf-8")) + " ")with open(file_name, "a") as f:f.write("\n")def KeyWord_Extract(data, file_name):tfidf = analyse.extract_tagskeywords = tfidf(data)for keyword in keywords:with open(file_name, "a") as f:f.write(str(word.word.encode("utf-8")) + " ")with open(file_name, "a") as f:f.write("\n")if __name__ == "__main__":DataFile = codes.open("P2.txt", "r")DataSet = DataFile.readlines()for data in DataSet:data = data[:len(data)-1]words = Word_cut(data, "P22.txt")KeyWord_Extract(data, "P22_keyword.txt")
圖7-14
圖7-15的函數(shù)word2vec便是從txt文件中讀取關(guān)鍵詞,利用上兩節(jié)訓(xùn)練好的詞向量獲取關(guān)鍵詞的詞向量。需要注意的是,由于本文訓(xùn)練詞向量的語料不是特別大(大約1.5G的純文本)無法包括所有的漢語詞語,所以在獲取一個(gè)詞語的詞向量時(shí),最好使用代碼25行所示的方式判斷模型是否包含該詞語,如果包含再獲取詞向量,否則會(huì)報(bào)錯(cuò)。
def word2vec(file_name, model):DataFile = codes.open(file_name, "r")DataSet = DataFile.readlines()word_vec_all = numpy.zeros(wordvec_size)for data in DataSet:data = data.decode("utf-8")space_pos = get_char_pos(data, " ")first_word = data[0:space_pos[0]]if model.__contains__(first_word):word_vec_all = word_vec_all + model[first_word]for i in range(len(space_pos) - 1):word = data[space_pos[i]:space_pos[i+1]]if model.__contains__(word):word_vec_all = word_vec_all + model[word]return word_vec_all
圖7.15關(guān)鍵詞向量化代碼
如圖7.16所示的詞向量相似度計(jì)算代碼,通過余弦相似度計(jì)算兩個(gè)向量的相似度。根據(jù)圖7.16的代碼,計(jì)算出新聞1和新聞2的相似度為0.66.
def SimlarityCalu(Vector1, Vector2):Vector1Mod = np.sqrt(Vector1.dot(Vector1))Vector2Mod = np.sqrt(Vector2.dot(Vector2))if Vector2Mod != 0 and Vector1Mod != 0:simlarity = (Vector1.dot(Vector2))/(Vector1Mod*Vector2Mod)else:simlarity = 0return simlarityif __name == "__main__":model = gensim.models.Word2Vec.load("zhiwiki_news")p1_vec = word2vec("P11_keyword.txt", model)p2_vec = word2vec("P22_keyword.txt", model)print(SimlarityCalu(p1_vec, p2_vec))
圖7-16 word2vec詞向量相似度計(jì)算
2. doc2vec計(jì)算網(wǎng)頁(yè)相似度
跟word2vec計(jì)算網(wǎng)頁(yè)相似度一樣,doc2vec計(jì)算網(wǎng)頁(yè)相似度主要包括如下三個(gè)步驟:1)預(yù)處理,2)句子向量化,3)計(jì)算文本相似。
預(yù)處理就是對(duì)文本進(jìn)行分詞,每個(gè)詞用空格隔開,具體代碼如圖7-14的Word_cut函數(shù)所示,該函數(shù)完成文本的分詞,并把分詞結(jié)果按要求保存在txt文檔中。在預(yù)處理文本之后便是利用doc2vec對(duì)句子向量化,句子向量的訓(xùn)練方法見7.3.2[計(jì)算機(jī)1]節(jié),這里直接利用訓(xùn)練好的句子向量。代碼如圖7-17的doc2vec函數(shù)所示。同樣用余弦相似度計(jì)算文本的相似度,代碼入圖7-17所示的main函數(shù)。最后經(jīng)計(jì)算所得利用doc2vec計(jì)算新聞1和新聞2間的相似度為0.97。
def doc2vec(file_name, model):docs = [x.strip().split() for x in codecs.open(file_name, "r", "utf-8".readlines()]doc_vec_all = numpy.zeros(docvec_size)for d in docs:doc_vec_all = doc_vec_all + model.infer_vector(d, alpha=start_alpha,steps=infer_epoch)return doc_vec_allif __name__ == "__main__":model = g.Doc2Vec.load(model_path)P1_doc2vec = doc2vec("toy_data/P11.txt", model)p2_doc2vec = doc2vec("toy_data/P22.txt", model)print(SimlarityCalu(p1_doc2vec, p2_doc2vec)
圖7-17 doc2vec文本相似度計(jì)算代碼
3.兩種相似度計(jì)算方法分析
前文介紹了word2vec和doc2vec兩種計(jì)算網(wǎng)頁(yè)相似度的方法,結(jié)果顯示利用doc2vec方法計(jì)算的相似度為0.97高于word2vec計(jì)算的0.66,顯然通過閱讀前兩篇新聞,知道這兩篇新聞極為相似,因此可以判斷doc2vec計(jì)算文本相似度的方法更勝一籌。這是因?yàn)椋?)doc2vec不僅利用了詞語的語義信息而且還綜合了上下文語序信息,而word2vec則丟失了語序信息;2)word2vec方法中的關(guān)鍵詞提取算法準(zhǔn)確率不高,丟失了很多關(guān)鍵信息。
(1)三位作者資歷深厚,分別是阿里巴巴的數(shù)據(jù)架構(gòu)師和NLP專家、百煉智能的NLP專家(前明略數(shù)據(jù)的技術(shù)合伙人和科學(xué)家)、七牛云AI實(shí)驗(yàn)室NLP&OCR方向負(fù)責(zé)人
(2)以實(shí)戰(zhàn)為導(dǎo)向,繞開各種復(fù)雜數(shù)學(xué)公式與證明,確保讀者零基礎(chǔ)入門,詳細(xì)講解自然語言處理 的各種核心技術(shù)、方法論和經(jīng)典算法
(3)阿里巴巴達(dá)摩院高級(jí)算法專家、百煉智能CEO、七牛云AI LAB負(fù)責(zé)人、天善智能創(chuàng)始人聯(lián)袂推薦
-
AI
+關(guān)注
關(guān)注
87文章
29885瀏覽量
268172 -
人工智能
+關(guān)注
關(guān)注
1791文章
46705瀏覽量
237220 -
大數(shù)據(jù)
+關(guān)注
關(guān)注
64文章
8856瀏覽量
137225 -
阿里
+關(guān)注
關(guān)注
6文章
434瀏覽量
32794
原文標(biāo)題:Python自然語言處理實(shí)戰(zhàn):計(jì)算兩篇文章的相似度
文章出處:【微信號(hào):AI_shequ,微信公眾號(hào):人工智能愛好者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論