Python与自然语言处理——关键词提取算法
关键词提取算法(二)
前面我们已经介绍了关键词提取算法的一些理论知识,这里我们主要看一些简单的示例。我们用到的库包括Jieba和Gensim。
算法流程
除了TextRank,其他的算法都需要一个已知的数据集才能正常工作。
训练一个关键词提取算法
- 加载已有的文档数据集
- 加载停用词表
- 对数据集中的文档进行分词
- 根据停用词过滤干扰词
- 根据数据集训练算法
对新文档进行关键词提取
- 对新文档进行分词
- 根据停用词去除干扰词
- 根据训练好的算法提取关键词
具体实现
引入相关库
import math
import jieba
import jieba.posseg as psg
from gensim import corpora,models
from jieba import analyse
import functools
数据预处理
定义停用词表的加载方法
######停用词表加载######
def get_stopword_list():
stop_word_path='./stopword.txt' #停用词所在的路径
stopword_list=[sw.replace('\n','') for sw in open(stop_word_path).readlines()] #获取其中的停用词
return stopword_list
定义分词方法
######定义分词方法######
###pos为是否只保留名词的依据
def seg_to_list(sentence,pos=False):
if not pos:
seg_list=jieba.cut(sentence) #不进行词性标注的分词
else:
seg_list=psg.cut(sentence) #进行词性标注的分词
return seg_list
定义干扰词过滤方法
######定义干扰词过滤方法######
def word_filter(seg_list,pos=False):
stopword_list=get_stopword_list() #获得停用词
filter_list=[] #存储过滤后的词
##根据pos确定是否进行此行过滤
####不进行此行过滤则都标记为n并保留
for seg in seg_list:
if not pos:
word=seg
flag='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_list
加载数据集
######加载数据集######
def load_data(pos=False,corpus_path='./corpus.txt'):
#对数据进行预处理
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)
return doc_list
输出top关键词
######TopK关键词######
def cmp(e1,e2):
import numpy as np
res