关键词提取_NLP 关键词 提取 实战 案例
生活随笔
收集整理的這篇文章主要介紹了
关键词提取_NLP 关键词 提取 实战 案例
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
訓練一個關鍵詞提取算法需要以下幾個步驟:
1)加載已有的文檔數據集;
2)加載停用詞表;
3)對數據集中的文檔進行分詞;
4)根據停用詞表,過濾干擾詞;
5)根據數據集訓練算法;
根據訓練好的關鍵詞提取算法對新文檔進行關鍵詞提取要經過以下環節:
1)對新文檔進行分詞;
2)根據停用詞表,過濾干擾詞;
3)根據訓練好的算法提取關鍵詞;
1 加載模塊
import math import jieba import jieba.posseg as psg from gensim import corpora, models from jieba import analyse import functools2 定義好停用詞表的加載方法
def get_stopword_list():# 停用詞表存儲路徑,每一行為一個詞,按行讀取進行加載# 進行編碼轉換確保匹配準確率stop_word_path = './stopword.txt'stopword_list = [sw.replace('/n', '') for sw in open(stop_word_path).readlines()]return stopword_list3 定義一個分詞方法
def seg_to_list(sentence, pos=False):''' 分詞方法,調用結巴接口。pos為判斷是否采用詞性標注 '''if not pos:# 不進行詞性標注的分詞方法seg_list = jieba.cut(sentence)else:# 進行詞性標注的分詞方法seg_list = psg.cut(sentence)return seg_list4 定義干擾詞過濾方法
def word_filter(seg_list, pos=False):''' 1. 根據分詞結果對干擾詞進行過濾;2. 根據pos判斷是否過濾除名詞外的其他詞性;3. 再判斷是否在停用詞表中,長度是否大于等于2等;'''stopword_list = get_stopword_list() # 獲取停用詞表filter_list = [] # 保存過濾后的結果# 下面代碼: 根據pos參數選擇是否詞性過濾## 下面代碼: 如果不進行詞性過濾,則將詞性都標記為n,表示全部保留for seg in seg_list:if not pos:word = segflag = 'n'else:word = seg.word # 單詞flag = seg.flag # 詞性if not flag.startswith('n'):continue# 過濾停用詞表中的詞,以及長度為<2的詞if not word in stopword_list and len(word)>1:filter_list.append(word)return filter_list5 加載數據集,并對數據集中的數據分詞和過濾干擾詞
def load_data(pos=False, corpus_path = './corpus.txt'):'''目的:調用上面方法對數據集進行處理,處理后的每條數據僅保留非干擾詞參數:1. 數據加載2. pos: 是否詞性標注的參數3. corpus_path: 數據集路徑'''doc_list = [] # 結果for line in open(corpus_path, 'r'):content = line.strip() # 每行的數據seg_list = seg_to_list(content, pos) # 分詞filter_list = word_filter(seg_list, pos) # 過濾停用詞doc_list.append(filter_list) # 將處理后的結果保存到doc_listreturn doc_list6 IDF 訓練
# TF-IDF的訓練主要是根據數據集生成對應的IDF值字典,后續計算每個詞的TF-IDF時,直接從字典中讀取。def train_idf(doc_list):idf_dic = {} # idf對應的字典tt_count = len(doc_list) # 總文檔數# 每個詞出現的文檔數for doc in doc_list: for word in set(doc):idf_dic[word] = idf_dic.get(word, 0.0) + 1.0# 按公式轉換為idf值,分母加1進行平滑處理for k, v in idf_dic.items():idf_dic[k] = math.log(tt_count/(1.0 + v))# 對于沒有在字典中的詞,默認其盡在一個文檔出現,得到默認idf值default_idf = math.log(tt_count/(1.0))return idf_dic, default_idf7 LSI 訓練
# LSI的訓練時根據現有的數據集生成文檔-主題分布矩陣和主題-詞分布矩陣,Gensim中有實現好的方法,可以直接調用。def train_lsi(self):lsi = models.LsiModel(self.corpus_tfidf, id2word=self.dictionary, num_topics=self.num_topics)return lsi8 LDA訓練
# LDA的訓練時根據現有的數據集生成文檔-主題分布矩陣和主題-詞分布矩陣,Gensim中有實現好的方法,可以直接調用。def train_lda(self):lda = models.LdaModel(self.corpus_tfidf, id2word=self.dictionary, num_topics=self.num_topics)return lda9 cmp函數
# 為了輸出top關鍵詞時,先按照關鍵詞的計算分值排序,在得分相同時,根據關鍵詞進行排序def cmp(e1, e2):''' 排序函數,用于topK關鍵詞的按值排序 '''import numpy as npres = np.sign(e1[1] - e2[1])if res != 0:return reselse:a = e1[0] + e2[0]b = e2[0] + e1[0]if a > b:return 1elif a == b:return 0else:return -110 TF-IDF實現方法
根據具體要處理的文本,計算每個詞的TF值,并獲取前面訓練好的IDF數據,直接獲取每個詞的IDF值,綜合計算每個詞的TF-IDF。
class TfIdf(object):# 四個參數分別是:訓練好的idf字典,默認idf字典,處理后的待提取文本, 關鍵詞數量def __init__(self, idf_dic, default_idf, word_list, keyword_num):self.idf_dic, self.default_idf = idf_dic, default_idfself.word_list = word_listself.tf_dic = self.get_tf_dic() # 統計tf值self.keyword_num = keyword_numdef get_tf_dic(self):# 統計tf值tf_dic = {}for word in self.word_list:tf_dic[word] = tf_dic.get(word, 0.0) + 1.0tt_count = len(self.word_list)for k, v in tf_dic.items():tf_dic[k] = float(v) / tt_count # 根據tf求值公式return tf_dicdef get_tfidf(self):# 計算tf-idf值tfidf_dic = {}for word in self.word_list:idf = self.idf_dic.get(word, self.default_idf)tf = self.tf_dic.get(word, 0)tfidf = tf * idftfidf_dic[word] = tfidftfidf_dic.items()# 根據tf-idf排序,去排名前keyword_num的詞作為關鍵詞for k, v in sorted(tfidf_dic.items(), key=functools.cmp_to_key(cmp), reverse=True)[:self.keyword_num]:print(k + '/', end='')print()11 完整的主題模型實現方法
分別實現了LSI,LDA算法,根據傳入參數model進行選擇,幾個參數如下:
12 對上面的各個方法進行封裝,統一算法調用接口
def tfidf_extract(word_list, pos=False, keyword_num=10):doc_list = load_data(pos)idf_dic, default_idf = train_idf(doc_list)tfidf_model = TfIdf(idf_dic, default_idf, word_list, keyword_num)tfidf_model.get_tfidf()def textrank_extract(text, pos=False, keyword_num=10):textrank = analyse.textrankkeywords = textrank(text, keyword_num)# 輸出抽取出的關鍵詞for keyword in keywords:print(keyword + "/", end='')print()def topic_extract(word_list, model, pos=False, keyword_num=10):doc_list = load_data(pos)topic_model = TopicModel(doc_list, keyword_num, model=model)topic_model.get_simword(word_list)13 主函數調用
if __name__ == "__main__":text = '6月19日,《2012年度“中國愛心城市”公益活動新聞發布會》在京舉行。' + '中華社會救助基金會理事長許嘉璐到會講話。基金會高級顧問朱發忠,全國老齡' + '辦副主任朱勇,民政部社會救助司助理巡視員周萍,中華社會救助基金會副理事長耿志遠,' + '重慶市民政局巡視員譚明政。晉江市人大常委會主任陳健倩,以及10余個省、市、自治區民政局' + '領導及四十多家媒體參加了發布會。中華社會救助基金會秘書長時正新介紹本年度“中國愛心城' + '市”公益活動將以“愛心城市宣傳、孤老關愛救助項目及第二屆中國愛心城市大會”為主要內容,重慶市' + '、呼和浩特市、長沙市、太原市、蚌埠市、南昌市、汕頭市、滄州市、晉江市及遵化市將會積極參加' + '這一公益活動。中國雅虎副總編張銀生和鳳凰網城市頻道總監趙耀分別以各自媒體優勢介紹了活動' + '的宣傳方案。會上,中華社會救助基金會與“第二屆中國愛心城市大會”承辦方晉江市簽約,許嘉璐理' + '事長接受晉江市參與“百萬孤老關愛行動”向國家重點扶貧地區捐贈的價值400萬元的款物。晉江市人大' + '常委會主任陳健倩介紹了大會的籌備情況。'pos = Falseseg_list = seg_to_list(text, pos)filter_list = word_filter(seg_list, pos)print("TF-IDF模型結果:")tfidf_extract(filter_list)print("TextRank模型結果:")textrank_extract(text)print("LSI模型結果:")topic_extract(filter_list, 'LSI', pos)print("LDA模型結果:")topic_extract(filter_list, 'LDA', pos)14 輸出結果:
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的关键词提取_NLP 关键词 提取 实战 案例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 预测足球_利用 Pytho
- 下一篇: 保尔偷走德国中尉的手枪后把他藏在哪里这只