关键词提取
参考:
NLP关键词提取方法总结及实现_关键词提取算法-CSDN博客
使用pandas库实现csv行和列的获取 - chuyaoxin - 博客园 (cnblogs.com)
一看到地图数据下钻显示我就烦。。。。没关系的。。。。。额。看错了原来不用实现太好辣哈哈哈哈哈哈哈哈额。
那就用TextRank提取关键词吧~
可能出现的错误:
1.module'networks 'has no attribute 'from_numpy_ matrix ',可参考这篇文章进行解决文本摘要 - 使用 TextRank4ZH 抽取中文文本摘要_textrank4sentence-CSDN博客
2.ImportError: cannot import name 'gcd' from 'fractions' 可以尝试在lib文件夹中找到fractions.py文件,在导入库那里加入一行from math import gcd
文件在哪找:看报错提示后面有写。
主要实现代码(主要就是改改text的获取,然后在输出到想要的文件即可):
文本文件处理方法可参考如下代码
# coding=utf-8 from textrank4zh import TextRank4Keyword, TextRank4Sentence import jieba.analyse import codecs # from snownlp import SnowNLP import pandas as pd # import numpy as np # 关键词抽取 def keywords_extraction(text): tr4w = TextRank4Keyword(allow_speech_tags=['n', 'nr', 'nrfg', 'ns', 'nt', 'nz']) # allow_speech_tags --词性列表,用于过滤某些词性的词 tr4w.analyze(text=text, window=2, lower=True, vertex_source='all_filters', edge_source='no_stop_words', pagerank_config={'alpha': 0.85, }) # text -- 文本内容,字符串 # window -- 窗口大小,int,用来构造单词之间的边。默认值为2 # lower -- 是否将英文文本转换为小写,默认值为False # vertex_source -- 选择使用words_no_filter, words_no_stop_words, words_all_filters中的哪一个来构造pagerank对应的图中的节点 # -- 默认值为`'all_filters'`,可选值为`'no_filter', 'no_stop_words', 'all_filters' # edge_source -- 选择使用words_no_filter, words_no_stop_words, words_all_filters中的哪一个来构造pagerank对应的图中的节点之间的边 # -- 默认值为`'no_stop_words'`,可选值为`'no_filter', 'no_stop_words', 'all_filters'`。边的构造要结合`window`参数 # pagerank_config -- pagerank算法参数配置,阻尼系数为0.85 keywords = tr4w.get_keywords(num=6, word_min_len=2) # num -- 返回关键词数量 # word_min_len -- 词的最小长度,默认值为1 return keywords # 关键短语抽取 def keyphrases_extraction(text): tr4w = TextRank4Keyword() tr4w.analyze(text=text, window=2, lower=True, vertex_source='all_filters', edge_source='no_stop_words', pagerank_config={'alpha': 0.85, }) keyphrases = tr4w.get_keyphrases(keywords_num=6, min_occur_num=1) # keywords_num -- 抽取的关键词数量 # min_occur_num -- 关键短语在文中的最少出现次数 return keyphrases # 关键句抽取 def keysentences_extraction(text): tr4s = TextRank4Sentence() tr4s.analyze(text, lower=True, source='all_filters') # text -- 文本内容,字符串 # lower -- 是否将英文文本转换为小写,默认值为False # source -- 选择使用words_no_filter, words_no_stop_words, words_all_filters中的哪一个来生成句子之间的相似度。 # -- 默认值为`'all_filters'`,可选值为`'no_filter', 'no_stop_words', 'all_filters' # sim_func -- 指定计算句子相似度的函数 # 获取最重要的num个长度大于等于sentence_min_len的句子用来生成摘要 keysentences = tr4s.get_key_sentences(num=3, sentence_min_len=6) return keysentences def keywords_textrank(text): keywords = jieba.analyse.textrank(text, topK=6) return keywords if __name__ == "__main__": f = codecs.open('../数据清洗/t1_test_test.txt', mode='r', encoding='utf-8') lines = f.readlines() # 第八列是项目成果简介,提取出来 lines = lines[:160] text_list = [] # 项目成果简介 key_list = [] # 关键词 keyphrases_list = [] # 关键短语 for line in lines: # print(line.strip().split("|")[8]) text_list.append(line.strip().split("|")[8]) print(text_list) # 关键词抽取 for text in text_list: key_list.append(keywords_extraction(text)) keyphrases_list.append(keyphrases_extraction(text)) # keysentences_extraction(text) # 关键句抽取 print(key_list) print(keyphrases_list)
对csv文件可参考一下代码
# coding=utf-8 from textrank4zh import TextRank4Keyword, TextRank4Sentence import jieba.analyse import codecs # from snownlp import SnowNLP import pandas as pd # import numpy as np # 关键词抽取 def keywords_extraction(text): tr4w = TextRank4Keyword(allow_speech_tags=['n', 'nr', 'nrfg', 'ns', 'nt', 'nz']) # allow_speech_tags --词性列表,用于过滤某些词性的词 tr4w.analyze(text=text, window=2, lower=True, vertex_source='all_filters', edge_source='no_stop_words', pagerank_config={'alpha': 0.85, }) # text -- 文本内容,字符串 # window -- 窗口大小,int,用来构造单词之间的边。默认值为2 # lower -- 是否将英文文本转换为小写,默认值为False # vertex_source -- 选择使用words_no_filter, words_no_stop_words, words_all_filters中的哪一个来构造pagerank对应的图中的节点 # -- 默认值为`'all_filters'`,可选值为`'no_filter', 'no_stop_words', 'all_filters' # edge_source -- 选择使用words_no_filter, words_no_stop_words, words_all_filters中的哪一个来构造pagerank对应的图中的节点之间的边 # -- 默认值为`'no_stop_words'`,可选值为`'no_filter', 'no_stop_words', 'all_filters'`。边的构造要结合`window`参数 # pagerank_config -- pagerank算法参数配置,阻尼系数为0.85 keywords = tr4w.get_keywords(num=6, word_min_len=2) # num -- 返回关键词数量 # word_min_len -- 词的最小长度,默认值为1 return keywords # 关键短语抽取 def keyphrases_extraction(text): tr4w = TextRank4Keyword() tr4w.analyze(text=text, window=2, lower=True, vertex_source='all_filters', edge_source='no_stop_words', pagerank_config={'alpha': 0.85, }) keyphrases = tr4w.get_keyphrases(keywords_num=6, min_occur_num=1) # keywords_num -- 抽取的关键词数量 # min_occur_num -- 关键短语在文中的最少出现次数 return keyphrases # 关键句抽取 def keysentences_extraction(text): tr4s = TextRank4Sentence() tr4s.analyze(text, lower=True, source='all_filters') # text -- 文本内容,字符串 # lower -- 是否将英文文本转换为小写,默认值为False # source -- 选择使用words_no_filter, words_no_stop_words, words_all_filters中的哪一个来生成句子之间的相似度。 # -- 默认值为`'all_filters'`,可选值为`'no_filter', 'no_stop_words', 'all_filters' # sim_func -- 指定计算句子相似度的函数 # 获取最重要的num个长度大于等于sentence_min_len的句子用来生成摘要 keysentences = tr4s.get_key_sentences(num=3, sentence_min_len=6) return keysentences def keywords_textrank(text): keywords = jieba.analyse.textrank(text, topK=6) return keywords if __name__ == "__main__": df = pd.read_csv("t2.csv",encoding= 'utf-8') # 如果导出的csv文件没有行头,可以设置一个 df.columns=['ID','成果名称','行业','年度','批准登记号','单位名称','课题来源','主要人员','评价单位名称','成果简介'] # t2的最后一列是成果简介列,提取出来 # 这里要注意iloc和loc的区别,loc是从1开始,iloc从0开始 # (这俩种方法也可以)text_list = df[['成果简介']] text_list = df.loc[:,'成果简介'] t2_text = df.iloc[:,[9]] # 项目成果简介 print(t2_text) t2_key_list = [] # 关键词+比重 t2_keyphrases_list = [] # 关键短语 print(t2_text.values[2]) # 关键词抽取 for i in range(len(t2_text)): # print(t2_text.values[i]) # 打印出来的是1X1数组 # 所以这里需要再取一下数组里面的具体内容(字符串) t2_key_list.append(keywords_extraction(t2_text.values[i][0])) t2_keyphrases_list.append(keyphrases_extraction(t2_text.values[i][0])) # 关键短语 # 将关键词数据添加到文件中 # df['关键短语']=t2_keyphrases_list # 如果直接这样子写,有些关键词是一个数组,写入也是数组的形式['玉米播种', '施肥技术', '农艺技术'] # 所以我们将期合并下,如[['生态预测'], ['品系侵染'], ['柴胡根腐病'], ['玉米播种', '施肥技术', '农艺技术']] # 变为[['生态预测'], ['品系侵染'], ['柴胡根腐病'], ['玉米播种 施肥技术 农艺技术']] for i in range(len(t2_keyphrases_list)): t2_keyphrases_list[i] = ' '.join([elem for elem in t2_keyphrases_list[i]]) # print(t2_keyphrases_list) df['关键短语'] = t2_keyphrases_list df.to_csv('t2_add.csv',index=False) """ f = codecs.open('../数据清洗/t1_test_test.txt', mode='r', encoding='utf-8') lines = f.readlines() # 第9列是项目成果简介,提取出来 lines = lines[:160] text_list = [] # 项目成果简介 key_list = [] # 关键词 keyphrases_list = [] # 关键短语 for line in lines: # print(line.strip().split("|")[8]) text_list.append(line.strip().split("|")[8]) print(text_list) # 关键词抽取 for text in text_list: key_list.append(keywords_extraction(text)) keyphrases_list.append(keyphrases_extraction(text)) # keysentences_extraction(text) # 关键句抽取 print(key_list) print(keyphrases_list) """
ok