0.关键词提取

  • 定义:从文本中把与这篇文章意义最相关的一些词语抽取出来。
  • 应用:在文献检索、自动文摘、文本聚类/分类等方面有着重要的应用,它不仅是进行这些工作不可或缺的基础和前提,也是互联网上信息建库的一项重要工作。

1.关键词抽取的方法-----主要有两种

  • 关键词分配:给定一个已有的关键词库,对于新来的文档从该词库里面匹配几个词语作为这篇文档的关键词。
  • 关键词提取:针对新文档,通过算法分析,提取文档中一些词语作为该文档的关键词。目前。大多数应用领域的关键词抽取算法都是基于第二种方法实现的,因为第二种方法在实际应用中更准确。

2.基于TF-IDF算法进行关键词提取

  • 在信息检索理论中,TF-IDF是(Term Frequency-Inverse Document Frequency)的简写。TF-IDF是一种数值统计,用来反映一个词语对于语料中某篇文档的重要性。在信息检索和文本挖掘领域,它经常用于因子加权。TF-IDF的主要思想:如果某个词在一篇文档中出现的频率越高,即TF越高;并且在语料库中其他文档中很少出现,即DF低,也就是IDF越高,则认为这个词具有很好的类别区分能力。
  • TF(Term Frequency)词频:表示词语在文档d中出现的概率,计算公式如下:
    tfi,j=ni,j∑knk,j\mathrm{tf}_{\mathrm{i}, \mathrm{j}}=\frac{n_{i, j}}{\sum_{k} n_{k, j}} tfi,j​=∑k​nk,j​ni,j​​
    其中,ni,j\boldsymbol{n}_{i, j}ni,j​是该词语ti\boldsymbol{t}_{i}ti​在文档dj\boldsymbol{d}_{j}dj​中出现的次数,而分母则是在文档dj\boldsymbol{d}_{j}dj​中所有字词的出现次数之和。
  • IDF(Inverse Document Frequency)逆文档频率:表示语料库中包含词语ti\boldsymbol{t}_{i}ti​的文档的数目的倒数,计算公式如下:
    idfi=log⁡∣D∣∣{j:ti∈dj}∣\mathrm{idf}_{\mathbf{i}}=\log \frac{|D|}{\left|\left\{j : t_{i} \in d_{j}\right\}\right|} idfi​=log∣{j:ti​∈dj​}∣∣D∣​
    其中,∣D∣|D|∣D∣表示语料库中文档的总数,∣{j:ti∈dj}∣\left|\left\{j : t_{i} \in d_{j}\right\}\right|∣{j:ti​∈dj​}∣表示包含词语ti\boldsymbol{t}_{i}ti​的文档数量。如果该词语不出现在语料库中,就会导致被除数为0,因此一般情况下使用1+∣{j:ti∈dj}∣\left|\left\{j : t_{i} \in d_{j}\right\}\right|∣{j:ti​∈dj​}∣
  • TF-IDF在实际中主要是将上面的两者相乘,即TF*IDF,计算公式如下:
    TF−IDFi,j=tfi,j×idfi\mathrm{TF}-\mathrm{IDF}_{i, j}=\mathrm{tf}_{i, j} \times \mathrm{idf}_{i} TF−IDFi,j​=tfi,j​×idfi​
    因此,TF-IDF倾向于过滤常见的词语,保留重要的词语。例如,某一特定文档内的高频词语,以及该词语在整个文档集合中的低文件频率,可以产生出高权重的TF-IDF。
  • jieba分词库已经实现了基于TF-IDF算法的关键词抽取,通过import jieba.analyse引入,函数参数解释如下:
    jieba.analyse.extract_tags(sentence, topK=20, withWeight=False,allowPOS=())
    
    • sentence:待提取的文本语料
    • topK:返回TF-IDF权重最大的关键词个数,默认是20
    • withWeight:是否需要返回关键词权重值,默认是False
    • allowPOS:仅包括指定词性的词,默认值是空,即不筛选
     import jieba.analysesentence = "人工智能(Artificial Intelligence),英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器,该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。人工智能从诞生以来,理论和技术日益成熟,应用领域也不断扩大,可以设想,未来人工智能带来的科技产品,将会是人类智慧的“容器”。人工智能可以对人的意识、思维的信息过程的模拟。人工智能不是人的智能,但能像人那样思考、也可能超过人的智能。人工智能是一门极富挑战性的科学,从事这项工作的人必须懂得计算机知识,心理学和哲学。人工智能是包括十分广泛的科学,它由不同的领域组成,如机器学习,计算机视觉等等,总的说来,人工智能研究的一个主要目标是使机器能够胜任一些通常需要人类智能才能完成的复杂工作。但不同的时代、不同的人对这种“复杂工作”的理解是不同的。 [1]  2017年12月,人工智能入选“2017年度中国媒体十大流行语”。"keywords = " ".join(jieba.analyse.extract_tags(sentence=sentence, topK=20, withWeight=False, allowPOS=()))print(keywords)keywords = jieba.analyse.extract_tags(sentence, topK=10, withWeight=True, allowPOS=(['n', 'v']))   # 只提取前10个名词和动词print(keywords)
    

3.基于TextRank算法进行关键词提取

  • TextRank是由PangeRank改进而来的,核心思想是将文本中的词语当作图中的节点,通过边相互连接,不同的节点会有不同的权重,权重高的节点可以作为关键字。TextRank的计算公式如下:
    WS(Vi)=(1−d)+d∗∑Vj∈In(Vi)wji∑Vk∈Out(Vj)WS(Vj)W S\left(V_{i}\right)=(1-d)+d * \sum_{V_{j} \in I n\left(V_{i}\right)} \frac{w_{j i}}{\sum_{V_{k} \in O u t\left(V_{j}\right)}} W S\left(V_{j}\right) WS(Vi​)=(1−d)+d∗Vj​∈In(Vi​)∑​∑Vk​∈Out(Vj​)​wji​​WS(Vj​)
    从上式可以看出,节点i的权重取决于节点i的邻接节点中i到j这条边的权重、j节点的所有出度的边的权重、节点j的权重这三个因素。将这些邻接节点计算的权重相加,再乘上一定的阻尼系数,就是节点i的权重,阻尼系数d一般取0.85
  • TextRank用于关键词提取的算法如下:
    • (1)把给定的文本T按照完整句子进行分割,即:
      T=[S1,S2,⋯ ,Sm]T=\left[S_{1}, S_{2}, \cdots, S_{m}\right] T=[S1​,S2​,⋯,Sm​]
    • (2)对每个句子,进行分词和词性标注处理,并过滤掉停用词,只保留指定词性的词语(如名词、动词、形容词),其中ti,jt_{i, j}ti,j​是保留后的候选关键词。
      Si=[ti,1,ti,2,⋯ ,ti,n]S_{i}=\left[t_{i, 1}, t_{i, 2}, \cdots, t_{i, n}\right] Si​=[ti,1​,ti,2​,⋯,ti,n​]
    • (3)构建候选关键词图G=(V,E),其中V是节点集,由(2)步中生成的候选关键词组成。然后采用共现关系(Co-Occurrence)构造任意两个节点之间的边,两个节点之间存在边即仅当它们对应的词汇在长度为K的窗口中共现,K表示窗口大小,即最多共现K个单词。
    • (4)根据TextRank的公式,迭代传播各节点的权重,直到收敛。
    • (5)对节点权重进行倒序排列,从而得到最重要的T个单词,作为候选关键词。
    • (6)由第(5)步得到最重要的T个词汇,在原始文本中进行标记,如果构成相邻词组,则组合成多词关键词。
  • jieba库中已经实现了基于TextRank算法的关键词抽取,通过命令import jieba.analyse
jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v'))
result = " ".join(jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=("ns", "n", "vn", "v")))
print(result)result = " ".join(jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=("n", "v")))  # 只看动词和名词
print(result)

4.基于LDA主题模型进行关键词抽取

  • 语料是一个关于汽车的短文本,下面通过gensim库完成基于LDA的关键词提取。整个过程的步骤为:

    • (1)文件加载
    • (2)jieba分词
    • (3)去停用词
    • (4)构建词袋模型
    • (5)LDA模型训练
    • (6)结果可视化
import jieba.analyse as analyse
import jieba
import pandas as pd
from gensim import corpora, models, similarities
import gensim
import numpy as np
import matplotlib.pyplot as plt%matplotlib inline# 设置文件路径
dir = "E://DeepLearning//jupyter_code//dataset//corpus//02_project//"
file_desc = "".join([dir, "car.csv"])
stop_words = "".join([dir, "stopwords.txt"])# 定义停用词
stopwords = pd.read_csv(stop_words, index_col=False, quoting=3, sep="\t", names=["stopword"], encoding="utf-8")
stopwords = stopwords['stopword'].values# 加载语料
df = pd.read_csv(file_desc, encoding='utf-8')# 删除nan行
df.dropna(inplace=True)
lines = df.content.values.tolist()# 开始分词
sentences = []
for line in lines:try:segs = jieba.lcut(line)segs = [v for v in segs if not str(v).isdigit()]  # 去数字segs = list(filter(lambda x: x.strip(), segs))  # 去空格segs = list(filter(lambda x: x not in stopwords, segs))  # 去停用词sentences.append(segs)except Exception:print(line)continue# 构建词袋模型
dictionary = corpora.Dictionary(sentences)
corpus = [dictionary.doc2bow(sentence) for sentence in sentences]
# lda模型,num_topics是主题个数
lda = gensim.models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=10)# 查一下第1号分类,其中最常出现的5个词
print(lda.print_topic(1, topn=5))
print("---------------------------------分割线-------------------------------------")
# 打印所有10个主题,每个主题显示8个词
for topic in lda.print_topics(num_topics=10, num_words=8):print(topic[1])# 显示中文matplotlib
plt.rcParams["font.sans-serif"] = [u'SimHei']
plt.rcParams["axes.unicode_minus"] = False
# 在可视化部分,首先画出10个主题的8个词的概率分布图
num_show_term = 8  # 每个主题下显示几个词
num_topics = 10
for i, k in enumerate(range(num_topics)):ax = plt.subplot(2, 5, i+1)item_dis_all = lda.get_topic_terms(topicid=k)item_dis = np.array(item_dis_all[:num_show_term])ax.plot(range(num_show_term), item_dis[:, 1], 'b*')item_word_id = item_dis[:, 0].astype(np.int)word = [dictionary.id2token[i] for i in item_word_id]ax.set_ylabel(u"概率")for j in range(num_show_term):ax.text(j, item_dis[j, 1], word[j], bbox=dict(facecolor='green', alpha=0.1))
plt.suptitle(u"10个主题及其8个主要词的概率", fontsize=18)
plt.show()

5.基于pyhanlp进行关键词提取

  • HanLP也可以进行关键词提取,内部采用TextRankKeyword实现,如下面所示:
from pyhanlp import *result = HanLP.extractKeyword(sentence, 20)
print(result)

6.代码及数据集下载

  • 链接

中文文本中的关键字提取算法总结相关推荐

  1. 第03课:动手实战中文文本中的关键字提取

    前言 关键词提取就是从文本里面把跟这篇文章意义最相关的一些词语抽取出来.这个可以追溯到文献检索初期,关键词是为了文献标引工作,从报告.论文中选取出来用以表示全文主题内容信息的单词或术语,在现在的报告和 ...

  2. textrank4zh是_GitHub - 997666901/TextRank4ZH: 从中文文本中自动提取关键词和摘要

    TextRank4ZH TextRank算法可以用来从文本中提取关键词和摘要(重要的句子).TextRank4ZH是针对中文文本的TextRank算法的python算法实现. 安装 方式1: $ py ...

  3. textrank4zh是_GitHub - renxiaowei941015/TextRank4ZH: 从中文文本中自动提取关键词和摘要...

    TextRank4ZH TextRank算法可以用来从文本中提取关键词和摘要(重要的句子).TextRank4ZH是针对中文文本的TextRank算法的python算法实现. 安装 方式1: $ py ...

  4. 统计中文文本中人物出现次数

      大家好,今天跟大家介绍一下如何统计文本中人物出现的次数? 共现关系 统计人物出现次数和人物关系输出到文件 一.共现关系:   在文献计量学中,关键词的共词方法常用来确定该文献集所代表学科中各主题之 ...

  5. Excel如何将文本中的英文提取出来

    在excel日常办公中,我们可能会遇到在文本中提取英文的情况.现在就跟大家介绍一下. 1.打开要处理的Excel文件 2.选中C2:C11单元格区域 3.点击下图选项(Excel工具箱,百度即可了解详 ...

  6. python 去除英文或中文文本中标点和数字及指定字符串

    例一 from string import punctuation from string import digits import redef preprocess_English(text,rm_ ...

  7. html中怎么给url格式化,如何将文本中的url提取出来格式化,然后将其它的html escape?...

    这个问题比你想象的要复杂! 比如有以下内容: "http://www.google.com [img]http://some.where.site/a.gif[/img] " 结果 ...

  8. python 英文文本中的关键词提取

    python 英文关键词提取详细教程: https://opensourcelibs.com/lib/pytextrank # To install from PyPi: 慢就加镜像 -i pytho ...

  9. 大规模中文文本处理中的自动切词和标注技术

    Internet网络通信技术和大容量存储技术的发展,加速了信息流通的速度,形成了大规模真实文本库.这些信息具有规模大.实时性强.内容分布广和格式灵活多样等特点,从而迫使人们考虑语言信息处理的新理论和新 ...

最新文章

  1. Java入门之HelloWorld
  2. 解决局域网IP冲突的问题
  3. boost::endian模块实现data的测试程序
  4. 游戏行业的人工智能设计(二):路径搜寻和感知
  5. Beaglebone bootloader杂谈
  6. linux查询匹配个数,查找与linux中目录中的模式匹配的文件数
  7. 推荐阅读啃饼随笔的《玩聚网的案例分析》
  8. 经典神经网络 -- GoogLeNet / Inception : 设计原理与pytorch实现
  9. 时钟天气小插件显示没服务器,天气时钟小插件大全
  10. 51单片机矩阵键盘控制数码管
  11. DES加密解密算法(简单、易懂、超级详细)
  12. 小米路由器AC2100开启IPV6的方法
  13. 爱国者p8880e java_口袋里的电脑 爱国者P8880E MID评测
  14. 机器学习 | 线性方法降维(理论篇)
  15. 【python多版本共存】
  16. 在线与本地文件同步方案
  17. [异常检测]Learning Regularity in Skeleton Trajectories for Anomaly Detection in Videos
  18. MacOs在线重装系统教程
  19. eclipse写python怎么样_eclipse python 使用教程(怎么用eclipse写python)
  20. 人体运动检测与跟踪(转)

热门文章

  1. 在MVC框架上定时执行某种操作
  2. 牛人博客!!!各大招聘网站信息实时查询浏览【转】
  3. HDU 1285 确定比赛名次 拓扑排序(邻接矩阵 邻接表
  4. Nginx 限制百度等爬虫连接
  5. iOS 最新版 CocoaPods 的安装流程
  6. ionic中使用Cordova Uglify 压缩js与css
  7. PreTranslateMessage作用和用法
  8. Java Bad version
  9. unity在中文环境下的支持不好
  10. 使用VMware Workstation搭建基于Linux的Oracle 10g RAC