所有源码都在github上(https://github.com/seasonyao/Keyword-extraction-based-on-tf-idf)
论文的关键词有着其特殊的重要使命,首先当然是方便别人浏览,可以一目了然的知道论文论述的主题,从而决定是否要花费时间阅读正文,节约大家的时间;其次也是更重要的一点,能够方便论文的归类和搜索。所以对待任意一段文本,如果我们能快速得到它的关键词,也就能达到和论文一样的效果。本demo用python语言结合jieba分词库+urllib爬虫库+beautifulsoup的html分析工具实现了tf-idf法判断文本关键词的效果,本文计算tf-idf的值主要是结合了百度文库里对应词出现的词条数来计算,有些地方显的略为复杂是因为加入了自己对文章关键词选取的个人理解,接下来和大家分享。
首先你的工作路径下应该是这个样子的
2.txt是你要寻找关键词的文本,moreattentionword.txt是你觉得有可能会在你要找的文章的中十分可能出现的一些特殊专业的高频词汇(当然,里面没有内容也可以)。mydictionary.txt是jieba给你的词典+moreattentionword.txt里的内容,result.txt保存下面代码第一部分的分词结果,stopword.txt是停用词表,你也可以加入一些你认为没有的词汇(比如得到的预测关键词有一个很不靠谱的词汇,你就可以加入进以后就再也看不到他了),test.py就是我们的程序文件了
#coding:utf-8
import jieba
jieba.load_userdict("myDictionary.txt")
import jieba.posseg as psg
from collections import Counter
from urllib import request
from urllib.parse import quote
from bs4 import BeautifulSoup
import string
import chardet
import math
import operator;
开头给出程序的编码和一些import的操作。load的txt文件是自建的词汇字典,是在jieba原始字典的基础上加入一些自己将要查看的文章有一定可能要用到的一些词汇,它们有的是专业词汇,有的是两三个词汇合在一起构成的词汇(但是在你将要涉猎的论文主题经常出现),因为代码是为有关博物馆的文章所写,所以myDictionary.txt的内容基本上如下截图:
按照jieba给出的官方说明,一个词一行,可以在词后边加上词频和词性,以空格隔开。接下来初始化了一堆接下来将要用到的变量,这里逐一介绍:
s = u''
f = open('2.txt',encoding='UTF-8')
line = f.readline()
while line:
s=s+line
line = f.readline()
f.close()
S保存了从txt读进的待操作的文本内容,当然2.txt就是你想要操作的文章
importantWord=[]
f = open('moreAttentionWord.txt',encoding='UTF-8')
line = f.readline()
while line:
importantWord.append(line)
line = f.readline()
f.close()
importantWord保存着重要的词汇,和mydictionary新加入的一样就是那些你依仗自己的经验感觉有可能会出现的东西(无论长短),只不过上边的dictionary是给jieba用的,这个importantword我是用来给自己后面处理分出来的词汇用的。
stopWord=[]
f = open('stopwords.txt',encoding='UTF-8')
line = f.readline()
while line:
stopWord.append(line.split('\n')[0])
line = f.readline()
f.close()
stopword保存着停用词,jieba会根据你的stopwords.txt里的词来对分词出的结果进行筛选,一般保存着如下截图中的这种没有实际意义的词汇。
word=[]
cixing=[]
phrasestore=[]
nstore=[]
vstore=[]
sstore=[]
剩下这几个list分别是一会用来保存东西的中间容器,后边再说。
store=[(x.word,x.flag) for x in psg.cut(s)]
for x in store:
if x in stopWord:
continue
word.append(str(x).split(',')[0].split("'")[1])
cixing.append(str(x).split(',')[1].split("'")[1])
首先利用psg的cut将文本s的内容分词,按照jieba官方给出的格式store链表将会以 词,词性 的形式保存下来(没错,就是这么为所欲为就分好了)。然后对分好的词进行处理,如果在停用词表里就不要这个词,否则把对应的词和词性装入word和cixing链表。
for i in range(1,len(word)):
if cixing[i]=='n' and cixing[i-1]=='n' and len(word[i])>1 and len(word[i-1])>1:
phrasestore.append(word[i-1]+word[i])
if cixing[i]=='v' and cixing[i-1]=='n' and len(word[i])>1 and len(word[i-1])>1:
phrasestore.append(word[i-1]+word[i])
if cixing[i]=='n' and cixing[i-1]=='v' and len(word[i])>1 and len(word[i-1])>1:
phrasestore.append(word[i-1]+word[i])
if cixing[i]=='a' and cixin