gensim在“中文查找(关键词)“与“txt文本“之间做相似度计算(返回最相似的文本)
本文目的
搜索關鍵詞,返回最相關的txt文本內容(模仿搜索引擎)
網上的例子都是一個list里面放入幾句話,然后輸入關鍵詞去計算相似度.
無法在實際中應用,例如
http://blog.csdn.net/appleyuchi/article/details/78062721
下面改進了下,
下面改為輸入一句話,不是去list中查找,而是去文件夾中查找,這樣就有一個搜索引擎的雛形
下面代碼在python2.7,linux下運行,運行時,修改path以及question即可
path代表存放一大堆txt文件的文件夾的路徑
下面代碼實現question與這些txt文件做相似度計算的功能.
?
?
運行環境
?
| 組件 | 版本 |
| Ubuntu | 18.10 |
| python | 2.7.12 |
運行方法
①mkdir train
②mkdir train_corpus_seg
③解壓tc-corpus-train.zip到train文件夾中
注:
解壓后會有一大堆文件夾,為了運行調試方便的目的,可以刪除其余文件夾,只留兩個文件夾即可,
每個文件夾表示一個大類。
④python corpus_segment.py
⑤python top.py
?
數據集采用復旦大學的新聞數據集tc-corpus-train.zip
下載鏈接是:
鏈接: https://pan.baidu.com/s/1hAxkar56UM6U_Eo8vm0rOA ?密碼: mpqd
?
實驗大意
?
附錄代碼中設置搜索關鍵詞question:“鄒家華 礦產”(模仿搜索引擎中輸入關鍵詞)
返回與關鍵詞最相關的一篇文章內容。(模仿搜索引擎返回最相關的網頁)
附錄代碼中有三個模型,每個模型都返回了最匹配的文章的序號。
第一個模型額外增加代碼get_article,返回了"最匹配的文章的序號"對應的"具體的內容"
其他兩個模型僅僅返回最相關的文章的序號,不返回內容(若要返回文章內容可以模仿第一個模型的例子來添加)
?
實驗運行結果
?
-------------------下面是tfidf模型(第1個提問)----------------------------------------------------
Building prefix dict from the default dictionary ...
Loading model from cache /tmp/jieba.cache
Loading model cost 0.545 seconds.
Prefix dict has been built succesfully.
[(1, 0.3586881756782532), (18, 0.28805285692214966), (15, 0.2172296941280365), (13, 0.20284029841423035), (21, 0.06617657840251923)]
搜索得到最匹配的文章是: 【 日期 】 19960404 【 版號 】 2 【 標題 】 全國 礦產資源 委員會 成立 鄒家華 提出 全面 加強 礦產 資源管理 【 作者 】 朱幼棣 【 正文 】 據 新華社 北京 4 月 3 日電 ( 記者 朱幼棣 ) 全國 礦產資源 委員會 第一次 會議 今天 召開 , 國務院 副 總理 、 全國 資源委 主任 鄒家華 說 , 國務院 決定 成立 全國 礦產資源 委員會 , 取代 原來 的 全國 礦產 儲量 委員會 , 這是 國務院 為了 全面 加強 礦產 資源管理 的 一項 重要 措施 , 是 我國 礦產 資源管理 體制 上 的 一項 重要 改革 。 鄒家華 說 , 國務院 十分重視 作為 國民經濟 發展 的 基礎產業 礦產資源 工作 。 我國 礦產 資源管理 體制 , 隨著 國家 經濟 的 發展 和 歷史 演變 , 發生 了 許多 變化 , 總的來說 也 是 不斷 適應 生產力 的 發展 , 也 因此 大大 推進 了 國民經濟 的 發展 。 但 從 當前 實踐 中看 , 礦產 資源管理 體制 不能 進一步 適應 生產力 發展 的 需要 , 沒有 能夠 按照 憲法 的 要求 , 真正 體現 中央政府 的 集中 、 統一 和 有效 的 管理 , 不能 在 維護 礦產資源 國家所有 的 權益 , 合理 規劃 利用 資源 , 加強 政策 調控 等 方面 發揮 應有 的 作用 , 還 存在 著 多頭管理 、 地方 保護 和 部門 分割 的 狀況 。 為此 , 從 我國 國情 出發 , 需要 一個 高層次 的 議事 協調 機構 , 不僅 是 對 全國 礦產 儲量 的 確認 , 而且 是 在 全國 范圍 內 , 統籌 礦產資源 勘查 、 開發 、 利用 、 保護 與 管理 方面 的 政策 和 方針 , 協調 各 部門 和 各大 公司 的 工作 , 共同努力 辦 一些 大事 、 實事 , 解決 一些 重大 問題 。 鄒家華 說 , 黨 的 十四屆 五中全會 《 建議 》 和 八屆 人大 四次會議 批準 的 《 綱要 》 , 對 加強 自然資源 保護 、 環境 、 生態 保護 也 提出 了 目標 、 工作 重點 和 政策措施 。 這 充分 顯示 了 黨中央 、 國務院 對 資源管理 工作 的 高度 關心 、 重視 和 支持 , 也 表明 了 資源管理 工作 責任 更 重大 、 任務 更 艱巨 。 對 今后 礦產資源 保護 管理 的 重要性 與 緊迫性 , 各 部門 、 各級 地方 政府 都 要 從 戰略 高度 深刻 認識 。 全國 礦產資源 委員會 的 主要 任務 是 研究 礦產資源 政策 , 醞釀 一個 時期 內 資源 開發 與 保護 的 行動計劃 和 重大項目 , 協調 各 部門 和 地方 的 關系 。 礦產資源 委員會 要 承擔 起 維護 礦產資源 國家所有 、 促進 礦產資源 的 開發 與 保護 、 實現 可 持續 發展 的 歷史使命 。 鄒家華 提出 , 今后 資源 委員會 要 緊緊圍繞 《 建議 》 和 《 綱要 》 的 目標 , 開拓 新 體制 、 探索 新 政策 、 制定 新 戰略 , 做好 工作 , 一是 促進 資源管理 新 體制 的 建立 , 建設 統一 、 協調 、 高效 、 權威 的 中央 統一 管理 與 授權 地方 管理 相結合 的 資源管理 體系 ; 二是 促進 地質 勘查 和 礦業 的 健康 發展 , 為 國民經濟 與 社會 發展 提供 必要 的 資源 保障 , 努力 達到 資源 供需平衡 ; 三是 通過 實施 可 持續 發展 戰略 與 科教興國 戰略 , 最大 限度 地 合理 開發利用 礦產資源 , 提高 資源 的 綜合利用 水平 , 保護 生態環境 ; 四是 促進 礦產資源 法制建設 , 推動 礦產資源 開發 與 管理 的 整體 水平 上 一個 新臺階 。 國務院 副 秘書長 周正慶 宣讀 了 《 國務院辦公廳 關于 將 全國 礦產 儲量 委員會 更名 為 全國 礦產資源 委員會 及 組成 人員 的 通知 》 。
-------------------下面是tfidf模型(第2個提問)----------------------------------------------------
[(1, 0.3586881756782532), (18, 0.28805285692214966), (15, 0.2172296941280365)]
-------------------下面是LSI模型-----------------------------------
[(1, 0.948716402053833), (13, 0.8921045064926147)]
?
參考文獻
Reference:
[1]https://blog.csdn.net/github_36326955/article/details/54891204
[2]https://blog.csdn.net/u011630575/article/details/80159298
?
附錄
corpus_segment.py
#!/usr/bin/env python # -*- coding: UTF-8 -*- """ @version: python2.7.8 @author: XiangguoSun @contact: sunxiangguodut@qq.com @file: corpus_segment.py @time: 2017/2/5 15:28 @software: PyCharm """ import sys import os import jieba # 配置utf-8輸出環境 reload(sys) sys.setdefaultencoding('utf-8') # 保存至文件 def savefile(savepath, content): with open(savepath, "wb") as fp: fp.write(content) ''''' 上面兩行是python2.6以上版本增加的語法,省略了繁瑣的文件close和try操作 2.5版本需要from __future__ import with_statement 新手可以參考這個鏈接來學習http://zhoutall.com/archives/325 ''' # 讀取文件 def readfile(path): with open(path, "rb") as fp: content = fp.read() return content def corpus_segment(corpus_path, seg_path): ''''' corpus_path是未分詞語料庫路徑 seg_path是分詞后語料庫存儲路徑 ''' catelist = os.listdir(corpus_path) # 獲取corpus_path下的所有子目錄 ''''' 其中子目錄的名字就是類別名,例如: train_corpus/art/21.txt中,'train_corpus/'是corpus_path,'art'是catelist中的一個成員 ''' # 獲取每個目錄(類別)下所有的文件 for mydir in catelist: ''''' 這里mydir就是train_corpus/art/21.txt中的art(即catelist中的一個類別) ''' class_path = corpus_path + mydir + "/" # 拼出分類子目錄的路徑如:train_corpus/art/ seg_dir = seg_path + mydir + "/" # 拼出分詞后存貯的對應目錄路徑如:train_corpus_seg/art/ if not os.path.exists(seg_dir): # 是否存在分詞目錄,如果沒有則創建該目錄 os.makedirs(seg_dir) file_list = os.listdir(class_path) # 獲取未分詞語料庫中某一類別中的所有文本 ''''' train_corpus/art/中的 21.txt, 22.txt, 23.txt ... file_list=['21.txt','22.txt',...] ''' for file_path in file_list: # 遍歷類別目錄下的所有文件 fullname = class_path + file_path # 拼出文件名全路徑如:train_corpus/art/21.txt content = readfile(fullname) # 讀取文件內容 '''''此時,content里面存貯的是原文本的所有字符,例如多余的空格、空行、回車等等, 接下來,我們需要把這些無關痛癢的字符統統去掉,變成只有標點符號做間隔的緊湊的文本內容 ''' content = content.replace("\r\n", "") # 刪除換行 content = content.replace(" ", "")#刪除空行、多余的空格 content_seg = jieba.cut(content) # 為文件內容分詞 savefile(seg_dir + file_path, " ".join(content_seg)) # 將處理后的文件保存到分詞后語料目錄 print "中文語料分詞結束!!!" if __name__=="__main__": #對訓練集進行分詞 corpus_path = "./train/" # 未分詞分類語料庫路徑 seg_path = "./train_corpus_seg/" # 分詞后分類語料庫路徑,本程序輸出結果 corpus_segment(corpus_path,seg_path) # #對測試集進行分詞 # corpus_path = "/home/appleyuchi/PycharmProjects/MultiNB/csdn_blog/54891204_tenwhy/chinese_text_classification-master/answer/" # 未分詞分類語料庫路徑 # seg_path = "/home/appleyuchi/PycharmProjects/MultiNB/csdn_blog/54891204_tenwhy/chinese_text_classification-master/test_corpus_seg/" # 分詞后分類語料庫路徑,本程序輸出結果 # corpus_segment(corpus_path,seg_path)top.py
# #-*- coding:utf-8 -*- # import sys # reload(sys) # sys.setdefaultencoding("utf-8")import os from gensim import corpora,models,similarities folders="./train_corpus_seg/" path="files/" import jieba#這個其實相當于搜索引擎(實際中是爬蟲) # 得到的各大網站的網頁內容存儲到一個個文件夾里面, # 當用戶搜索的時候,從文件夾里面搜索最相關文章匹配的鏈接返回給用戶file_list=[] for folder in os.listdir(folders):#遍歷所有類別的文件夾for file in os.listdir(folders+folder):file_list.append(file)corpora_documents=[] for folder in os.listdir(folders):#遍歷所有類別的文件夾for file in os.listdir(folders+folder):#遍歷每一類文件夾中的每個文件f=open(folders+folder+'/'+file)strs=f.read().replace('\n', '')#去掉回車鍵item_seg=strs.split()#根據空格保存分詞后的結果corpora_documents.append(item_seg)#下面部分代碼來自[2]# 生成字典和向量語料 dictionary = corpora.Dictionary(corpora_documents) # 通過下面一句得到語料中每一篇文檔對應的稀疏向量(這里是bow向量) corpus = [dictionary.doc2bow(text) for text in corpora_documents] # 向量的每一個元素代表了一個word在這篇文檔中出現的次數 # print(corpus) # corpora.MmCorpus.serialize('corpuse.mm',corpus)#保存生成的語料 # corpus=corpora.MmCorpus('corpuse.mm')#加載 # corpus是一個返回bow向量的迭代器。下面代碼將完成對corpus中出現的每一個特征的IDF值的統計工作 tfidf_model = models.TfidfModel(corpus) corpus_tfidf = tfidf_model[corpus] #根據關鍵詞返回最相關的一篇文章(模仿搜索引擎) def get_article(index):best_matchfile=file_list[index]for folder in os.listdir(folders):#遍歷所有類別的文件夾for file in os.listdir(folders+folder):#遍歷每一類文件夾中的每個文件if file==best_matchfile:f=open(folders+folder+'/'+file)strs=f.read().replace('\n', '')#去掉回車鍵return strs#返回最匹配的文章內容question='鄒家華 礦產' print("-------------------下面是tfidf模型(第1個提問)----------------------------------------------------")similarity = similarities.Similarity('Similarity-tfidf-index', corpus_tfidf,num_features=len(dictionary.dfs)) #注意這里的num_features如果隨意改的話,可能會導致segmentation fault(原因不明).test_data_1 = question test_cut_raw_1 = list(jieba.cut(test_data_1)) # ['北京', '霧', '霾', '紅色', '預警'] test_corpus_1 = dictionary.doc2bow(test_cut_raw_1) # [(51, 1), (59, 1)],即在字典的56和60的地方出現重復的字段,這個值可能會變化 similarity.num_best = 5 test_corpus_tfidf_1 = tfidf_model[test_corpus_1] # 根據之前訓練生成的model,生成query的IFIDF值,然后進行相似度計算 # [(51, 0.7071067811865475), (59, 0.7071067811865475)] print(similarity[test_corpus_tfidf_1]) # 返回最相似的樣本材料,(index_of_document, similarity) tuplesbest_match_article=get_article(similarity[test_corpus_tfidf_1][0][0]) print("搜索得到最匹配的文章是:",best_match_article)print("-------------------下面是tfidf模型(第2個提問)----------------------------------------------------") test_data_2 = question test_cut_raw_2 = list(jieba.cut(test_data_2)) test_corpus_2 = dictionary.doc2bow(test_cut_raw_2) test_corpus_tfidf_2 = tfidf_model[test_corpus_2] similarity.num_best = 3 print(similarity[test_corpus_tfidf_2]) # 返回最相似的樣本材料,(index_of_document, similarity) tuples print("-------------------下面是LSI模型-----------------------------------") # 使用LSI模型進行相似度計算 lsi = models.LsiModel(corpus_tfidf) corpus_lsi = lsi[corpus_tfidf] similarity_lsi = similarities.Similarity('Similarity-LSI-index', corpus_lsi, num_features=400, num_best=2) # save # LsiModel.load(fname, mmap='r')#加載 test_data_3 = question test_cut_raw_3 = list(jieba.cut(test_data_3)) # 1.分詞 test_corpus_3 = dictionary.doc2bow(test_cut_raw_3) # 2.轉換成bow向量(bow=bag of words) test_corpus_tfidf_3 = tfidf_model[test_corpus_3] # 3.計算tfidf值 test_corpus_lsi_3 = lsi[test_corpus_tfidf_3] # 4.計算lsi值 # lsi.add_documents(test_corpus_lsi_3) #更新LSI的值 print(similarity_lsi[test_corpus_lsi_3])?
?
?
?
?
總結
以上是生活随笔為你收集整理的gensim在“中文查找(关键词)“与“txt文本“之间做相似度计算(返回最相似的文本)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gensim出现segmentation
- 下一篇: 所谓的inference场景与深度学习终