此書專注于中文的自然語言處理,以Python及其相關框架為工具,以實戰(zhàn)為導向,詳細講解了自然語言處理的各種核心技術、方法論和經(jīng)典算法。三位作者在人工智能、大數(shù)據(jù)和算法領域有豐富的積累和經(jīng)驗,是阿里巴巴、前明略數(shù)據(jù)和七牛云的資深專家。同時,本書也得到了阿里巴巴達摩院高級算法專家、七牛云AI實驗室Leader等專家的高度評價和鼎力推薦。
本節(jié)將利用訓練好的詞向量和段落向量對兩篇關于天津全運會的新聞進行向量化,并計算兩篇新聞的相似度。如下是兩篇新聞:
新聞1:6日,第十三屆全運會女子籃球成年組決賽在天津財經(jīng)大學體育館打響,中國籃協(xié)主席姚明到場觀戰(zhàn)。姚明在接受媒體采訪時表示,天津全運會是全社會的體育盛會,他稱贊了賽事保障與服務工作,并表示中國籃協(xié)將在未來的工作中挖掘天津籃球文化的價值。
本屆天津全運會增加了包括攀巖、馬拉松、象棋在內(nèi)的19個大項的群眾體育比賽項目,普通群眾成為賽場“主角”。對此,姚明表示:“引入群眾性的體育項目,真正做到了全運會的‘全’字,這不僅僅是專業(yè)運動員的盛會,更是全社會的體育盛會。”談及本屆全運會賽事籌備與保障服務時,姚明說:“全運會得到了天津市委市政府和各區(qū)、各學校的大力幫助,籃球項目比賽(順利舉辦)要感謝天津方方面面的支持。”此外,姚明還對全運村內(nèi)的保障服務和志愿者工作表示贊賞。“很多熟悉的教練員和運動員都表示服務保障很不錯,志愿者態(tài)度很積極。”“毋庸置疑,天津是中國籃球發(fā)源地,1895年,在籃球運動誕生4年的時候就漂洋過海從天津上岸,這是中國籃球具有歷史意義的地方。”姚明在談及天津籃球文化和未來發(fā)展時說,“天津保留著迄今為止世界上最古老的室內(nèi)籃球場,這都是非常重要的籃球文化遺產(chǎn),希望能在未來的工作中挖掘這些歷史遺產(chǎn)的價值。”姚明說:“天津是座美麗的城市,這次來天津能夠感到濃厚的體育文化元素,希望運動員和教練員在比賽賽得好的同時,也能領略到天津的城市文化。”
新聞2:從開幕式前入住全運村到奔波于全運三座籃球場館之間,中國籃協(xié)主席姚明抵津已有10多天了。昨天在天津財大籃球館,姚明還饒有興致地談了對本次天津全運會的看法,能夠讓群眾融入進來,是他覺得最有亮點的地方。 “全運會是一項很有傳統(tǒng)的運動會,這次來到天津,得到市委、市政府的大力支持,天津各個區(qū)學校對于籃球比賽從人員到場館給予很大幫助,中國籃協(xié)作為競委會的一員,受到總局的委派承辦籃球的比賽,真的非常感謝天津對我們方方面面的支持。”盡管之前多次到訪津城,不過這次因為全運,還是給了姚明很多不一樣的感受,“天津是座非常美麗的城市,我之前來這里很多次了,這次來感受到了非常濃烈的體育文化元素,我們希望運動員、教練員在這座美麗的城市比賽賽得好,同時能夠領略到天津的城市文化。”本屆全運的群眾項目的比賽,引起了姚明極大的興趣,“這次天津全運會最突出的特點是引入了群眾性體育和群眾性的項目,同時設立了群眾性的獎牌和榮譽,是真的做到了一個‘全’字,這也符合體育融入社會的一個大趨勢,全運會不該只是專業(yè)運動員的盛會,也是所有社會人的一個盛會。”對于這段時間在天津的生活,姚明也是贊不絕口,“我們作為籃協(xié)的官員都住在技術官員村,這段時間的生活工作都在里面,聽到了很多熟悉的運動員、教練員對本次全運會的夸贊,生活工作非常方便,保障非常齊全,我們?yōu)樘旖蚋械椒浅8吲d。很多場館都很新,很多志愿者都很年輕,大家都積極奔波在各自的崗位上,這一點我們的運動員和教練員應該是最有發(fā)言權的。”作為中國最出色的籃球運動員,姚明也談了天津作為中國籃球故鄉(xiāng)的感受,“毋庸置疑,天津是中國籃球的發(fā)源地,是籃球傳入中國的第一故鄉(xiāng),在籃球1891年誕生之后4年就漂洋過海來到中國,在天津上岸,這是對中國籃球具有歷史意義的地方,并且我們也知道這里保留了迄今為止世界上最古老的室內(nèi)籃球館,這些都是我們非常重要的文化遺產(chǎn)。我希望我們在未來的工作中,可以讓這樣越來越多的歷史故事被重新挖掘出來。
1. word2vec計算網(wǎng)頁相似度
word2vec計算網(wǎng)頁相似度的基本方法是:抽取網(wǎng)頁新聞中的關鍵詞,接著將關鍵詞向量化,然后將得到的各個詞向量相加,最后得到的一個詞向量總和代表網(wǎng)頁新聞的向量化表示,利用這個總的向量計算網(wǎng)頁相似度。包括的步驟是:1)關鍵詞提取,2)關鍵詞向量化,3)相似度計算。
首先是關鍵詞提取,這里我們采用jiebag工具包中tfidf關鍵詞提取方法,如下圖7-14所示,函數(shù)KeyWord_Extract的功能就是提取句子的關鍵詞,并將關鍵詞保存在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文件中讀取關鍵詞,利用上兩節(jié)訓練好的詞向量獲取關鍵詞的詞向量。需要注意的是,由于本文訓練詞向量的語料不是特別大(大約1.5G的純文本)無法包括所有的漢語詞語,所以在獲取一個詞語的詞向量時,最好使用代碼25行所示的方式判斷模型是否包含該詞語,如果包含再獲取詞向量,否則會報錯。
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關鍵詞向量化代碼
如圖7.16所示的詞向量相似度計算代碼,通過余弦相似度計算兩個向量的相似度。根據(jù)圖7.16的代碼,計算出新聞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詞向量相似度計算
2. doc2vec計算網(wǎng)頁相似度
跟word2vec計算網(wǎng)頁相似度一樣,doc2vec計算網(wǎng)頁相似度主要包括如下三個步驟:1)預處理,2)句子向量化,3)計算文本相似。
預處理就是對文本進行分詞,每個詞用空格隔開,具體代碼如圖7-14的Word_cut函數(shù)所示,該函數(shù)完成文本的分詞,并把分詞結果按要求保存在txt文檔中。在預處理文本之后便是利用doc2vec對句子向量化,句子向量的訓練方法見7.3.2[計算機1]節(jié),這里直接利用訓練好的句子向量。代碼如圖7-17的doc2vec函數(shù)所示。同樣用余弦相似度計算文本的相似度,代碼入圖7-17所示的main函數(shù)。最后經(jīng)計算所得利用doc2vec計算新聞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文本相似度計算代碼
3.兩種相似度計算方法分析
前文介紹了word2vec和doc2vec兩種計算網(wǎng)頁相似度的方法,結果顯示利用doc2vec方法計算的相似度為0.97高于word2vec計算的0.66,顯然通過閱讀前兩篇新聞,知道這兩篇新聞極為相似,因此可以判斷doc2vec計算文本相似度的方法更勝一籌。這是因為:1)doc2vec不僅利用了詞語的語義信息而且還綜合了上下文語序信息,而word2vec則丟失了語序信息;2)word2vec方法中的關鍵詞提取算法準確率不高,丟失了很多關鍵信息。
(1)三位作者資歷深厚,分別是阿里巴巴的數(shù)據(jù)架構師和NLP專家、百煉智能的NLP專家(前明略數(shù)據(jù)的技術合伙人和科學家)、七牛云AI實驗室NLP&OCR方向負責人
(2)以實戰(zhàn)為導向,繞開各種復雜數(shù)學公式與證明,確保讀者零基礎入門,詳細講解自然語言處理 的各種核心技術、方法論和經(jīng)典算法
(3)阿里巴巴達摩院高級算法專家、百煉智能CEO、七牛云AI LAB負責人、天善智能創(chuàng)始人聯(lián)袂推薦
-
AI
+關注
關注
87文章
31000瀏覽量
269333 -
人工智能
+關注
關注
1792文章
47354瀏覽量
238815 -
大數(shù)據(jù)
+關注
關注
64文章
8894瀏覽量
137496 -
阿里
+關注
關注
6文章
438瀏覽量
32844
原文標題:Python自然語言處理實戰(zhàn):計算兩篇文章的相似度
文章出處:【微信號:AI_shequ,微信公眾號:人工智能愛好者社區(qū)】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論