提取关键词算法
A. 用Py做文本分析5:关键词提取
关键词指的是原始文档的和核心信息,关键词提取在文本聚类、分类、自动摘要等领域中有着重要的作用。
针对一篇语段,在不加人工干预的情况下提取出其关键词
无监督学习——基于词频
思路1:按照词频高低进行提取
思路2:按照词条在文档中的重要性进行提取
IF-IDF是信息检索中最常用的一种文本关键信息表示法,其基本的思想是如果某个词在一篇文档中出现的频率高,并且在语料库中其他文档中很少出现,则认为这个词具有很好的类别区分能力。
TF:Term Frequency,衡量一个term在文档中出现得有多频繁。平均而言出现越频繁的词,其重要信姿贺性可能就越高。考虑到文章长度的差异,需要对册带词频做标准化:
IDF:Inverse Document Frequency,逆文档概率,用于模拟在该语料的实际使用环境中,目标term的重要性。
TF-IDF:TF*IDF
优点:
(1)jieba
(2)sklearn
(3)gensim
前面介绍的TF-IDF属于无监督中基于词频的算法,TextRank算法是基于图形的算法。
TextRank算法的思想来源于PageRank算法:
和基于词频的算法相比,TextRank进一步考滑派虑了文档内词条间的语义关系。
参考资料:
python数据分析--玩转文本挖掘
B. 关键词提取算不算自然语言处理的任务
算
⾃然语⾔处理(⼀)--关键词提取
最近学习使⽤了传统的⾃然语⾔处理技术进⾏关键词的提取,接下来我介绍⼀下两种常⽤的算法:TFIDF和TextRank。⽬前BiLSTM 也可以⽤于提取⽂本关键词,有空再学。
1.TF-IDF
TF-IDF(term frequency-inverse document frequency)是⼀种⽤于信息检索与数据挖掘的常⽤加权技术。TF-IDF是⼀种统计⽅法,⽤来评估⼀个字词对于⼀个⽂件集或语料库中的⼀份⽂件的重要程度。
⾸先解释⼀下TF-IDF的意思:
TF(term frequency):词语在⼀篇⽂章中出现的频率
IDF(inverse document frequency):反⽂档频率,与词语在其他⽂档中出现的频率负相关
TF-IDF的主要思想是:如果某个词或短语在⼀篇⽂章中出现的频率⾼,即TF值⾼;并且在其他⽂章中很少出现,即IDF值⾼,那么认为这个词或短语具有很好的类别区分能⼒,适合作为该⽂章的关键词。
TF-IDF的具体计算公式为:
⽂档中词的tfidf值越⾼,便认为该词越可以代表该⽂档的主题。TF-IDF算法的python实现如下,同时jieba库中也实现了TF-IDF,有兴趣的话也可以去了解⼀下。
# TF-IDf算法python实现
import re
import math
# 获取⼀个⽂档中每个词的TF值,doc参数保存⽂档中的句⼦列表,返回单词与其tf值的字典
# ⾸先对⽂档中的单词进⾏切分,然后统计每个词的词频
def GetWordTF(doc):
words_count =0# 单词总数
words_map ={}# 单词与单词数的映射
tf_map ={}# tf值映射词典,格式: tf_map[word] = tf_word
for sentence in doc:# 遍历⽂档中的每个句⼦
# 单词的切分⽅式可以根据所给的数据格式进⾏修改
# 我将提取英⽂句⼦中的每个单词,使⽤正则表达式提取并去除空字符串
words_arr =[word for word in re.split(r'\W+',sentence)if word]
words_count +=len(words_arr)# 统计有效词的总长度
for word in words_arr:# 遍历每⼀个词并进⾏统计单词数
words_map[word]= words_map.get(word,0)+1
for key,val in words_map.items():# 计算每个单词的tf值
tf_map[key]= val / words_count
return tf_map
# 获取⽂档每个单词在⽂档集docSet中的IDF值映射
def GetWordIDF(tfMap,docSet):
docs_num =len(docSet)# ⽂档集中⽂档的总数
word_doc_num ={}# 包含word的⽂档数,格式为word_doc_num[word] = num of doc that contains word
idf_map ={}# idf值映射字典,格式idf_map[word] = idf_word
for key,val in tfMap.items():# 遍历⽂档中出现的单词
for doc in docSet:# 遍历每个⽂档,检查该⽂档中是否出现了单词key
for sentence in doc:# 遍历⽂档中的每个句⼦
words_arr =[word for word in re.split(r'\W+', sentence)if word]# 提取句⼦中的每个单词
if key in words_arr:# 如果该⽂档中有该词,则统计
word_doc_num[key]= word_doc_num.get(key,0)+1
break
for key,val in word_doc_num.items():# 计算每个单词的idf值
idf_map[key]= math.log(docs_num / val)
return idf_map
# 使⽤TFIDF算法获取⽂档的前topNum个关键词,其中每个⽂档是以列表表⽰的,列表项为⽂档的⼀个句⼦
def GetKeywordsByTFIDF(entityDescriptionList,docSet,topNum):
tf_map = GetWordTF(entityDescriptionList)# 获取每个单词的tf值
idf_map = GetWordIDF(tf_map,docSet)# 获取每个单词的idf值
tfidf_map ={}
for key,val in tf_map.items():# 计算每个词的tfidf值
tfidf_map[key]= tf_map[key]* idf_map[key]
tfidf_sorted_list =sorted(tfidf_map.items(),key =lambda x:x[1],reverse=True)# 将字典按值从⼤到⼩排序
if topNum >len(tfidf_sorted_list):# 保证topNum不⼤于⽂档中词的总数
topNum =len(tfidf_sorted_list)
keywords =[]# 保存⽂档的前topNum个关键字
for i in range(topNum):
keywords.append(tfidf_sorted_list[i][0])# 关键字保存在元组的第0个元素中
return keywords
2.TextRank
TF-IDF算法对于有多段⽂本的关键词提取⾮常有效,但是对于单篇或⽂档集较少的⽂本则表现得不很好。对于单篇⽂档,可以使⽤TextRank算法实现关键词提取。
TextRank是⼀种基于图排序的算法,思想源于⾕歌的PageRank算法,通过把⽂本分割为若⼲组成单元(单词、句⼦)并建⽴图模型,利⽤投票机制对⽂本中的重要成分进⾏排序,仅利⽤单篇⽂档本⾝的信息即可实现关键词提取。
TextRank利⽤投票的原理,让每⼀个单词给它的邻居投赞成票,票的权重取决于⾃⼰的票数。假设每⼀个词是⼀个顶点(Vertex),那么所有的词就构成了⼀个⽹络,这个⽹络⾥⾯每个顶点会有指向其他顶点的边,也会有其他顶点指向⾃⼰的边。通过计算每个顶点所连接的指向⾃⼰的顶点的权重和,最终得到该顶点的权重值。
TextRank存在的主要问题是初始值的确定,为了后续计算的简便性,这⾥会给初值赋为⼀个⾮0值。同时,引⼊了⼀个阻尼系数的概念,该参数表⽰从某⼀个指定的顶点,到任意⼀个其他顶点的概率。TextRank的具体公式如下:
于是,使⽤TextRank算法提取关键词时,⾸先需要把图构建出来。图的节点就是单词,⾄于边可以利⽤n-gram的思路,认为某个单词只与它附近的n个单词有关,即与它附近的n个词对应的节点连⼀条⽆向边。也可以做⼀些其他操作,⽐如把某类词性的词删掉,⼀些⾃定义词删掉,只保留⼀部分单词等。我的代码实现中,假设每个长为k的滑动窗⼝中的任意两个单词对应的节点之间存在⼀条⽆向⽆权边。当构图成功后,就可以使⽤上述公式进⾏迭代求解了。Python实现的代码如下:
# 使⽤TextRank算法实现关键词提取,返回关键词列表,参数含义如下:
# sentence 保存待提取关键字的句⼦
# windowLength 保存滑动窗⼝的⼤⼩
# topNum 表⽰需要返回排名前topNum的关键词
# d 表⽰textrank算法的阻尼系数,默认为0.85
# maxIter 表⽰算法最⼤迭代次数
# minDiff 迭代后变化值⼩于minDiff时也停⽌迭代
def GetKeywordsByTextRank(sentence,windowLength,topNum=3,d=0.85,maxIter=10000,minDiff=0.0001):
# 单词的切分⽅式可以根据所给的数据格式进⾏修改
# 我将提取英⽂句⼦中的每个单词,使⽤正则表达式提取并去除空字符串
words_arr =[word for word in re.split(r'\W+', sentence)if word]
words_num =len(words_arr)# 句⼦的长度
word_graph ={}# 保存每个单词的连接状态,格式为word_graph[word] = [与该词存在边的单词的集合]
textrank_map ={}# 保存每个textrank值的字典,格式为textrank_map[word] = textrank value of the word
textrank_map_t ={}# ⽤于保存前⼀次迭代的tankrank结果
for words_index in range(words_num):# 遍历句⼦中的每个单词,开始根据给定的窗⼝值构图
textrank_map[words_arr[words_index]]=1- d # 为每个词初始化⼀个textrank值
window_lower =max(0, words_index - windowLength)# 滑动窗⼝的下边界
window_upper =min(words_num, words_index + windowLength)# 滑动窗⼝的上边界
for window_index in range(window_lower,window_upper):# 遍历窗⼝中的单词,构建单词的连接关系
if window_index == words_index:# ⾃⼰与⾃⼰认为没有边
continue
if not words_arr[window_index]in word_graph.get(words_arr[words_index],[]):# 检查两词节点之间是否有边
if word_graph.get(words_arr[words_index],0)==0:# 检查该词的边集是否为空
word_graph[words_arr[words_index]]=[words_arr[window_index]]# 为空则⽣成包含该点的边集
else:
word_graph[words_arr[words_index]].append(words_arr[window_index])# 将该边添加到边集中
for iter_i in range(maxIter):# 利⽤textrank计算公式迭代计算
max_diff =0# 表⽰迭代前后两次的变化
for word,neibor_list in word_graph.items():# 遍历每个单词
for con_word in neibor_list:# 遍历与每个单词存在相邻关系的单词
con_word_out_len =len(word_graph[con_word])# 计算当前节点连接的节点个数
if word == con_word or con_word_out_len ==0:
continue# 如果是该节点本⾝或⽆连出节点则不更新
# 使⽤公式对textrank值进⾏更新
textrank_map[word]=1- d + d * textrank_map_t.get(con_word,0)/con_word_out_len
max_diff =max(max_diff,abs(textrank_map[word]-textrank_map_t.get(word,0)))
for word,val in textrank_map.items():
textrank_map_t[word]= val
if(max_diff < minDiff):# 各个单词节点的textrank值如果均⽆明显变化,则可结束迭代
break
textrank_sorted_list =sorted(textrank_map.items(),key=lambda x:x[1],reverse=True)# 按照textrank值从⼤到⼩排序
if topNum >len(textrank_sorted_list):# 保证topNum不⼤于⽂档中词的总数
topNum =len(textrank_sorted_list)
if topNum <1:# 保证topNum⼤于0
topNum =1
keywords =[]# 保存将要返回的关键词
for i in range(topNum):
keywords.append(textrank_sorted_list[i][0])
return keywords
可以看出TextRank算法对于⼀段⽂本中多次出现的词,会赋予更⼤的权重,因为它连出的节点更多,所以当各个节点初始权重⼀致时,则最终出现次数最多的词权重就会更⼤。这也会使该算法对类似于“的”、“你、我、他”等常⽤词,会出现⽐较⼤的误差。对于这种情况,可以在最开始构建边时进⾏处理,去掉⼀些停⽤词或者选择⾃⼰需要的词性的词,从⽽得出实际有⽤的词语。
后记:前端暂时不⽀持Latex,公式我只能贴图了。深度学习最近⽐较流⾏,还有很多需要学的呀!
网络文库VIP已帮您省69元现在恢复最低仅需0.3元/天
立即续费
自然语言处理(一)--关键词提取
⾃然语⾔处理(⼀)--关键词提取
最近学习使⽤了传统的⾃然语⾔处理技术进⾏关键词的提取,接下来我介绍⼀下两种常⽤的算法:TFIDF和TextRank。⽬前BiLSTM 也可以⽤于提取⽂本关键词,有空再学。
1.TF-IDF
TF-IDF(term frequency-inverse document frequency)是⼀种⽤于信息检索与数据挖掘的常⽤加权技术。TF-IDF是⼀种统计⽅法,⽤来评估⼀个字词对于⼀个⽂件集或语料库中的⼀份⽂件的重要程度。
C. TFIDF算法实现关键词抽取
其实这是一个很简单的算法。
先来学习一下概念:
在实际的使用过程中,实际上先使用历史存量数据计算出每个词的IDF值,作为一个原始信息,在对新内容进行处理时,只需要计算出TF值就可以了,然后对这篇内容的所有词计算出TFIDF值,然后进行排序就ok了。
TFIDF是一种十分简单的关键词提取方案,在实际的应用中,还可以进行多种算法的融合,之后我再慢慢介绍。
当然了,该算法还有一些变种,基本上基于下面几种方法,有兴趣的可以了解一下。
D. 大数据算法:分类算法
KNN算法,即K近邻(K Nearest Neighbour)算法,是一种基本的分类算法。其主要原理是:对于一个需要分类的数据,将其和一组已经分类标注好的样本集合进行比较,得到距离最近的K个样本,K个样本最多归属的类别,就是这个需要分类数据的类别。下面我给你画了一个KNN算法的原理图。
图中,红蓝绿三种颜色的点为样本数据,分属三种类别 、 、 。对于待分类点 ,计算和它距离最近的5个点(即K为5),这5个点最多归属的类别为 (4个点归属 ,1个点归属 ),那么 的类别被分类为 。
KNN的算法流程也非常简单,请看下面的流程图。
KNN算法是一种非常简单实用的分类算法,可用于各种分类的场景,比如新闻分类、商品分类等,甚至可用于简单的文字识别。对于新闻分类,可以提前对若干新闻进行人工标注,标好新闻类别,计算好特征向量。对于一篇未分类的新闻,计算其特征向量后,跟所有已标注新闻进行距离计算,然后进一步利用KNN算法进行自动分类。
读到这你肯定会问,如何计算数据的距离呢?如何获得新闻的特征向量呢?
KNN算法的关键是要比较需要分类的数据与样本数据之间的距离,这在机器学习中通常的做法是:提取数据的特征值,根据特征值组成一个n维实数向量空间(这个空间也被称作特征空间),然后计算向量之间的空间距离。空间之间的距离计算方法有很多种,常用的有欧氏距离、余弦距离等。
对于数据 和 ,若其特征空间为n维实数向量空间 ,即 , ,则其欧氏距离计算公式为
这个欧式距离公式其实我们在初中的时候就学过,平面几何和立体几何里两个点之间的距离,也是用这个公式计算出来的,只是平面几何(二维几何)里的n=2,立体几何(三维几何)里的n=3,而机器学习需要面对的每个数据都可能有n维的维度,即每个数据有n个特征值。但是不管特征值n是多少,两个数据之间的空间距离的计算公式还是这个欧氏计算公式。大多数机器学习算法都需要计算数据之间的距离,因此掌握数据的距离计算公式是掌握机器学习算法的基础。
欧氏距离是最常用的数据计算公式,但是在文本数据以及用户评价数据的机器学习中,更常用的距离计算方法是余弦相似度。
余弦相似度的值越接近1表示其越相似,越接近0表示其差异越大,使用余弦相似度可以消除数据的某些冗余信息,某些情况下更贴近数据的本质。我举个简单的例子,比如两篇文章的特征值都是:“大数据”“机器学习”和“极客时间”,A文章的特征向量为(3, 3, 3),即这三个词出现次数都是3;B文章的特征向量为(6, 6, 6),即这三个词出现次数都是6。如果光看特征向量,这两个向量差别很大,如果用欧氏距离计算确实也很大,但是这两篇文章其实非常相似,只是篇幅不同而已,它们的余弦相似度为1,表示非常相似。
余弦相似度其实是计算向量的夹角,而欧氏距离公式是计算空间距离。余弦相似度更关注数据的相似性,比如两个用户给两件商品的打分分别是(3, 3)和(4, 4),那么两个用户对两件商品的喜好是相似的,这种情况下,余弦相似度比欧氏距离更合理。
我们知道了机器学习的算法需要计算距离,而计算距离需要还知道数据的特征向量,因此提取数据的特征向量是机器学习工程师们的重要工作,有时候甚至是最重要的工作。不同的数据以及不同的应用场景需要提取不同的特征值,我们以比较常见的文本数据为例,看看如何提取文本特征向量。
文本数据的特征值就是提取文本关键词,TF-IDF算法是比较常用且直观的一种文本关键词提取算法。这种算法是由TF和IDF两部分构成。
TF是词频(Term Frequency),表示某个单词在文档中出现的频率,一个单词在一个文档中出现的越频繁,TF值越高。
词频:
IDF是逆文档频率(Inverse Document Frequency),表示这个单词在所有文档中的稀缺程度,越少文档出现这个词,IDF值越高。
逆文档频率:
TF与IDF的乘积就是TF-IDF。
所以如果一个词在某一个文档中频繁出现,但在所有文档中却很少出现,那么这个词很可能就是这个文档的关键词。比如一篇关于原子能的技术文章,“核裂变”“放射性”“半衰期”等词汇会在这篇文档中频繁出现,即TF很高;但是在所有文档中出现的频率却比较低,即IDF也比较高。因此这几个词的TF-IDF值就会很高,就可能是这篇文档的关键词。如果这是一篇关于中国原子能的文章,也许“中国”这个词也会频繁出现,即TF也很高,但是“中国”也在很多文档中出现,那么IDF就会比较低,最后“中国”这个词的TF-IDF就很低,不会成为这个文档的关键词。
提取出关键词以后,就可以利用关键词的词频构造特征向量,比如上面例子关于原子能的文章,“核裂变”“放射性”“半衰期”这三个词是特征值,分别出现次数为12、9、4。那么这篇文章的特征向量就是(12, 9, 4),再利用前面提到的空间距离计算公式计算与其他文档的距离,结合KNN算法就可以实现文档的自动分类。
贝叶斯公式是一种基于条件概率的分类算法,如果我们已经知道A和B的发生概率,并且知道了B发生情况下A发生的概率,可以用贝叶斯公式计算A发生的情况下B发生的概率。事实上,我们可以根据A的情况,即输入数据,判断B的概率,即B的可能性,进而进行分类。
举个例子:假设一所学校里男生占60%,女生占40%。男生总是穿长裤,女生则一半穿长裤一半穿裙子。假设你走在校园中,迎面走来一个穿长裤的学生,你能够推断出这个穿长裤学生是男生的概率是多少吗?
答案是75%,具体算法是:
这个算法就利用了贝叶斯公式,贝叶斯公式的写法是:
意思是A发生的条件下B发生的概率,等于B发生的条件下A发生的概率,乘以B发生的概率,除以A发生的概率。还是上面这个例子,如果我问你迎面走来穿裙子的学生是女生的概率是多少。同样带入贝叶斯公式,可以计算出是女生的概率为100%。其实这个结果我们根据常识也能推断出来,但是很多时候,常识受各种因素的干扰,会出现偏差。比如有人看到一篇博士生给初中学历老板打工的新闻,就感叹读书无用。事实上,只是少见多怪,样本量太少而已。而大量数据的统计规律则能准确反映事物的分类概率。
贝叶斯分类的一个典型的应用场合是垃圾邮件分类,通过对样本邮件的统计,我们知道每个词在邮件中出现的概率 ,我们也知道正常邮件概率 和垃圾邮件的概率 ,还可以统计出垃圾邮件中各个词的出现概率 ,那么现在一封新邮件到来,我们就可以根据邮件中出现的词,计算 ,即得到这些词出现情况下,邮件为垃圾邮件的概率,进而判断邮件是否为垃圾邮件。
现实中,贝叶斯公式等号右边的概率,我们可以通过对大数据的统计获得,当有新的数据到来的时候,我们就可以带入上面的贝叶斯公式计算其概率。而如果我们设定概率超过某个值就认为其会发生,那么我们就对这个数据进行了分类和预测,具体过程如下图所示。
训练样本就是我们的原始数据,有时候原始数据并不包含我们想要计算的维度数据,比如我们想用贝叶斯公式自动分类垃圾邮件,那么首先要对原始邮件进行标注,需要标注哪些邮件是正常邮件、哪些邮件是垃圾邮件。这一类需要对数据进行标注才能进行的机器学习训练也叫作有监督的机器学习。
E. 寻找找关键词
寻找关键词,主要可以通过以下几种方法:
1. 查看词频统计。可以利用词频统计工具,查看相关词出现的频率,高频词往往就是关键词。如jieba,TextRank等工具可以对文本进行词频统计分析。
2. 关键词提取算法。使用TextRank, TF-IDF等关键词提取算法,提取文档中的关键词。这些算法可以综合考虑词频、词处在文本中的位置以及与其他词的关系等,准确提取关键词。
3. 查看标题、摘要、开头与结尾。文章的标题、摘要及开头结尾处的词,往往都是作者想要表达的核心主题或关键词。梳理这些部分中的词,可以找到关键词。
4. 人工分析文档主题。人工浏览和分析文档的主要内容与主题,理解作者想要表达的核心观点,确定文档覆盖的关键话题与词汇,这也是找到关键词的有效方法。
5. 专家知识补充。在某个领域内,专家对关键词和话题有独到认知。可以咨询相关领域的专家学者,寻求他们的意见建议,补充找到的关键词,提高准确性。
6. 同义词和相关词扩充。对找到的关键词,利用同义词表、词林表等扩充同义词和相关词。同义词和相关词也可被视为关键词,扩充关键词列表。
7. 查看其他语言版雹铅猜本。如果存激键在文章的其他语言版本,那么关键词很可能在不同语言版本中重复出现。比对不同语言版本,可以找到文档的关键词。
综上,关键词的寻找需要全面考虑词频、算法检测、人工分析与专家知识等方法。区分文档标题、摘要、正文词汇,理解作者想表达的主旨观点。扩充同义词与相关词,借助其他语言版本进行比较。才可以准确全面地找到文档的关键词。
关键词的寻找是一个迭代优化的过程。可以从一种方法入手,然后逐步结合其他方法,在精确与全面之间取得平衡,找到最能源型概括文档主题与内容的关键词。这需要语言知识,理解能力与文档分析的综合运用。
F. TextRank——关键词提取
TextRank 算法可以脱离语料库的背景,仅对单篇文档进行分析就可以提取该文档谈握山的关键词。
TextRank 算法基于 PageRank 算法的。 PageRank 算法是一种网页排名算法,其基本思想有两条:
d 表示阻尼系数,为了解决没有入链网页的得分。 在 0.85 的阻尼系数下,大约 100 多次迭代 PR 值就能收敛到一个稳定的值,而当阻尼系数接近 1 时,需要的迭代次数会陡然增加很多,且排序不稳定。
链接网页的初始分数如何确定: 算法开始时会将所有网页的得分初始化为 1,然后通过多次迭代来对每个网页的分数进行收敛。收敛时的得分就是网页最终得分。若不能收敛,也可以通过设定最大迭代次数来对计算进行控制,计算停止时的分数就含中是网页皮羡的得分。
https://www.zybuluo.com/evilking/note/902585
G. 如何挖掘关键词
挖掘关键词、长尾关键词、常用关键词,作为网站站长、做SEO、宣传客、淘宝客、其他一般用户使用等都是必备工具,那么最好、最方便快捷的方法都有哪些?小编和大家分享更多挖掘关键词方法的工具。
工具/原料
可以上网电脑一台
方法/步骤
1
打开网络搜索“飞达鲁长”关键词点击第一项即可下载。特点:1、自动保管结果系统查询
2、多词查询、断点查询。
3、点击鼠标右键即可追寻到所要搜索的关键词4、过滤功用。过滤可以更加清楚知道哪些词语是自己想要的词语。
5、过滤功NEW用法:可以修正过滤的词。查找到相同关键词会自动删除,有效保证搜索到宽樱厅准确并有效能的词
长尾主要词又叫长尾词: 长尾词就是市场占据份额大,但不人看重,未来可能存在很多搜索量的词。
名风seo关键词工具,特点:
1.可以设置在同一段时间操作搜索关键词
2.人性化提取关键词,其他关颂隐键词工具稍微一改,网络及搜索量很少
3. 两次搜索功能,独立运行文件搜索
站长工具关键词挖掘 --特点,能够有效查阅多的长尾关键词,容易优化
爱站关键词挖掘工具--特点:简单,迅捷 ,网页定位准确慎隐
注意事项
只要用好这几个关键词工具,做好SEO优化,相信你一定很厉害,加油
H. 把测试集里的文本用tfidf算法提取出关键词,求个java代码
//直接粘贴就行。
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Scanner;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import javax.swing.border.EtchedBorder;
import javax.swing.filechooser.FileFilter;
public class Application2 extends JFrame implements Cloneable{
public Application2(){
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.setSize(800,700);
this.setLayout(new BorderLayout());
keyWords1=new String[]{"那么","还是","sdf"};
keyWords2=new String[]{"所以","而且",};
input=new JTextArea();
JPanel ip=new JPanel();
ip.setLayout(new BorderLayout());
ip.add(input,BorderLayout.CENTER);
ip.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED), "输入文本"));
output1=new JTextArea();
JPanel o1p=new JPanel();
o1p.setLayout(new BorderLayout());
o1p.add(output1,BorderLayout.CENTER);
o1p.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED), "以下为"));
output2=new JTextArea();
JPanel o2p=new JPanel();
o2p.setLayout(new BorderLayout());
o2p.add(output2,BorderLayout.CENTER);
o2p.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEtchedBorder(EtchedBorder.LOWERED), "以下为"));
JSplitPane split1=new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,o1p,o2p);
split1.setDividerLocation(350);
JSplitPane split2=new JSplitPane(JSplitPane.VERTICAL_SPLIT,ip,split1);
split2.setDividerLocation(300);
this.add(split2,BorderLayout.CENTER);
open=new JButton("导入");
open.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
JFileChooser chooser=new JFileChooser(".");
chooser.setMultiSelectionEnabled(false);
chooser.addChoosableFileFilter(new FileFilter(){
@Override
public boolean accept(File file) {
if(file.isDirectory())
return true;
int length=file.getName().length();
if(length<5)
return false;
if(file.getName().substring(length-4).equals(".txt"))
return true;
return false;
}
@Override
public String getDescription() {
return "文本文件";
}
});
chooser.showOpenDialog(Application2.this);
File file=chooser.getSelectedFile();
if(file==null)
return;
try {
Scanner sc=new Scanner(file);
String text="";
while(sc.hasNextLine())
text+=sc.nextLine()+"\n";
input.setText(text);
String[] array=getSentences();
output1.setText(getKeySentences(keyWords1,array));
output2.setText(getKeySentences(keyWords2,array));
}catch (IOException e1) {
e1.printStackTrace();
}
}
});
save=new JButton("导出");
save.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
JFileChooser chooser=new JFileChooser(".");
chooser.setMultiSelectionEnabled(false);
chooser.addChoosableFileFilter(new FileFilter(){
@Override
public boolean accept(File file) {
if(file.isDirectory())
return true;
int length=file.getName().length();
if(length<5)
return false;
if(file.getName().substring(length-4).equals(".txt"))
return true;
return false;
}
@Override
public String getDescription() {
return "文本文件";
}
});
chooser.showSaveDialog(Application2.this);
File file=chooser.getSelectedFile();
if(file==null)
return;
try {
PrintWriter pw=new PrintWriter(file);
pw.print(output1.getText());
pw.flush();
pw.print(output2.getText());
pw.flush();
}catch (IOException e1) {
e1.printStackTrace();
}
}
});
JPanel buttonPane=new JPanel();
buttonPane.add(open);
buttonPane.add(save);
this.add(buttonPane,BorderLayout.SOUTH);
}
public String[] getSentences(){
ArrayList<String> set=new ArrayList<String>();
int length=input.getText().length();
for(int i=0,last=0;i<length;i++){
String s=String.valueOf(input.getText().charAt(i));
if(s.equals("\n"))
last=i+1;
if(s.equals(".")||s.equals(",")||s.equals("。")||s.equals("。")||s.equals("!")||s.equals("?")||s.equals("?")||s.equals("!")||s.equals(",")){
set.add(input.getText().substring(last,i)+s);
last=i+1;
}
}
return set.<String>toArray(new String[set.size()]);
}
public String getKeySentences(String[] key,String[] sentences){
String result="";
A: for(int i=0;i<sentences.length;i++){
for (int k = 0; k < key.length; k++)
if (sentences[i].contains(key[k].subSequence(0, key[k].length()))) {
result += sentences[i] + "\n";
continue A;
}
}
return result;
}
private JTextArea input;
private JTextArea output1;
private JTextArea output2;
private JButton open;
private JButton save;
private String[] keyWords1;
private String[] keyWords2;
public static void main(String... args){
EventQueue.invokeLater(new Runnable(){
public void run(){
new Application2().setVisible(true);
}
});
}
}
I. 怎么在一堆图片中抓取关键词
可以用抽取方法。
有监督无监督抽取方法:无监督关键词提取方法主要有三类:基于统计特征的关键词提取(TF,TF-IDF);基于词图模型的关键词提取(PageRank,TextRank);基于主题模型的关键词提取(LDA)基于统计特征的关键词提取算法的思想是利用文档中词语的统计信息抽取文档的关键词;基于词图模型的关键词提取首先要构建文档的语言网络图,然后对语言进行网络图分析,在这个图上寻找具有重要作用的词或者短语,这些短语就是文档的关键词;基于主题关键词提取算法主要利用的是主题模型中关于主题分布的性质进行关键词提取;
将关键词抽取过程视为二分类问题,先提取出候选词,然后对于每个候选词划定标签,要么是关键词,要么不是关键词,然后训练关键词抽取分类器。当新来一篇文档时,提取出所有的候选词,然后利用训练好的关键词提取分类器,对各个候选词进行分类,最终将标签为关键词的候选词作为关键词。
J. php 要从文章内容,提取关键词,要怎么写!
提取关键词,你必须得有个词库。然后根据词库匹配文章内容。词库越多效率越低,文章内容长度桥册越长敏樱宏效率越低。
网上针对php有相干的分词算法,你可以搜 ”颂裂SCWS 中文分词“ 来看一下。你可以根据里面的例子来做扩展