task3_TF-IDF_互信息

基于 TF-IDF 算法的关键词抽取

1.什么是TF-IDF呢?

TF(Term Frequency)词频
IDF(Inverse Document Frequency)逆文档频率,表示一个词的大小与常见词的反比
假如我们需要通过计算机来找到文本的关键词如何查找呢,一般是统计出现最高词语的频率也就是TF词频。但是在统计词语的过程中通常会遇到如下问题—最高出现的词汇可能是”停用词”,如”的”,”是”,”在”,在文本当中有的词的重要性是不同的,假如我们统计词频发现这五个词的频率最高,如”中国”、”土地”、”房子”、”蜜蜂”、”养殖”,其中中国、土地这些词汇经常出现而蜜蜂、养殖等词语不常出现。如果某个词比较少见,但是它在这篇文章中多次出现,那么它很可能就反映了这篇文章的特性,正是我们所需要的关键词。
所以我们需要对文本词语进行一个权重处理,给蜜蜂、养殖等词语高权重,而”是”、”在”、”的”、”中国”等词语低权重等方法来处理文本。
知道了"词频"(TF)和"逆文档频率"(IDF)以后,将这两个值相乘,就得到了一个词的TF-IDF值。某个词对文章的重要性越高,它的TF-IDF值就越大。所以,排在最前面的几个词,就是这篇文章的关键词。

2.如何进行TF-IDF算法?

第一步,计算词频。
TF=某词在文章中出现的次数,考虑到文章有长短之分,为了便于不同文章的比较,进行"词频"标准化。
TF = 某词在文章中出现的次数/文章的总次数
第二步,计算逆文档频率
这时,需要一个语料库(corpus),用来模拟语言的使用环境。
逆文档频率(IDF)=log(语料库的文档总数/包含该词的文档数+1)
如果一个词越常见,那么分母就越大,逆文档频率就越小越接近0。分母之所以要加1,是为了避免分母为0(即所有文档都不包含该词)。log表示对得到的值取对数。
第三步,计算TF-IDF。
TF-IDF=TF*IDF
可以看到,TF-IDF与一个词在文档中的出现次数成正比,与该词在整个语言中的出现次数成反比。所以,自动提取关键词的算法就很清楚了,就是计算出文档的每个词的TF-IDF值,然后按降序排列,取排在最前面的几个词。

第一步导入包
import sys,codecs
import pandas as pd
import numpy as np
import jieba.posseg
import jieba.analyse
from sklearn import feature_extraction
from sklearn.feature_extraction.text import TfidfTransformer#构建tfidf权重计算
from sklearn.feature_extraction.text import CountVectorizer#构建词频矩阵

# 数据预处理操作:分词,词性筛选
def dataPrepos(text):
    l = []
    pos = ['n','nz','v','vd','vn','l','a','d']#定义选取的词性
    seg = jieba.posseg.cut(text)
    for i in seg:
        if i.word and i.flag in pos:
            l.append(i.word)
        return l
# tf-idf获取文本top10关键词
def getKeywords_tfidf(data,topK):
    idList, titleList, abstractList = data['id'], data['title'], data['abstract']
    corpus = [] # 将所有文档输出到一个list中,一行就是一个文档
    for index in range(len(idList)):
        text = '%s。%s' % (titleList[index], abstractList[index]) # 拼接标题和摘要
        text = dataPrepos(text) # 文本预处理
        text = " ".join(text) # 连接成字符串,空格分隔
        corpus.append(text)
# tf-idf获取文本top10关键词
def getKeywords_tfidf(data,topK):
    idList, titleList, abstractList = data['id'], data['title'], data['abstract']
    corpus = [] # 将所有文档输出到一个list中,一行就是一个文档
    for index in range(len(idList)):
        text = '%s。%s' % (titleList[index], abstractList[index]) # 拼接标题和摘要
        text = dataPrepos(text) # 文本预处理
        text = " ".join(text) # 连接成字符串,空格分隔
        corpus.append(text)

    # 1、构建词频矩阵,将文本中的词语转换成词频矩阵
    vectorizer = CountVectorizer()
    X = vectorizer.fit_transform(corpus) # 词频矩阵,a[i][j]:表示j词在第i个文本中的词频
    # 2、统计每个词的tf-idf权值
    transformer = TfidfTransformer()
    tfidf = transformer.fit_transform(X)
    # 3、获取词袋模型中的关键词
    word = vectorizer.get_feature_names()
    # 4、获取tf-idf矩阵,a[i][j]表示j词在i篇文本中的tf-idf权重
    weight = tfidf.toarray()
    # 5、打印词语权重
    ids, titles, keys = [], [], []
    for i in range(len(weight)):
        print(u"-------这里输出第", i+1 , u"篇文本的词语tf-idf------")
        ids.append(idList[i])
        titles.append(titleList[i])
        df_word,df_weight = [],[] # 当前文章的所有词汇列表、词汇对应权重列表
        for j in range(len(word)):
            print (word[j],weight[i][j])
    
    return corpus
def main():
    # 读取数据集
    dataFile = '/data/NLP/sample_data.csv'
    data = pd.read_csv(dataFile)
    # tf-idf关键词抽取
    global corpusA
    corpusA = getKeywords_tfidf(data,10)
    print(corpusA)
    
corpusA = []
main()
一定 0.054830755756848815
一段时间 0.0
主体 0.0
乘客 0.0
乘车 0.0
事件 0.0
二者 0.0
互相 0.0
交叉 0.0
产品 0.0
产生 0.09322230345997895
介绍 0.0
仍然 0.054830755756848815
仪表板 0.0
传感器 0.054830755756848815
估计 0.0
位置 0.0407792498624949
作为 0.0
使得 0.0
使用 0.0
使能 0.054830755756848815
使该 0.0
信号 0.09322230345997895
倾斜 0.0
偏压 0.0
停转 0.0
储能 0.0
元件 0.0
免受 0.0
关闭 0.0
具有 0.0
内燃机 0.0
内管 0.0
凹陷 0.0
分析 0.0
分部 0.0
分隔 0.0
切换 0.054830755756848815
利用 0.0
制动 0.10966151151369763
制造 0.0
刹车 0.054830755756848815
力矩 0.16449226727054644
功能 0.054830755756848815
包围 0.0
包括 0.0
单元 0.21932302302739526
卸载 0.0

点互信息PMI

PMI(Pointwise Mutual Information)这个指标来衡量两个事物之间的相关性(比如两个词)。
原理
在这里插入图片描述

互信息MI

其衡量的是两个随机变量之间的相关性,即一个随机变量中包含的关于另一个随机变量的信息量。

mr_dict = {}
    for i in range(len(weight)):
        for j in range(len(weight)):
            mr_dict[(i,j)] = mr.mutual_info_score(weight[i],weight[j])
    for k,v in mr_dict.items():
        print({k},":",{v})         
        {(7, 3)} : {0.19939294427676363}
{(6, 9)} : {0.08886803115507075}
{(1, 3)} : {0.10198173036522945}
{(4, 8)} : {0.1445993595088306}
{(3, 0)} : {0.09944057978761305}
{(2, 8)} : {0.09001424826730232}
{(9, 8)} : {0.09393707548600558}
{(8, 0)} : {0.09742607975961579}
{(0, 7)} : {0.15285611022312634}
{(6, 2)} : {0.05772518267515081}
{(1, 6)} : {0.04656903617202687}
{(3, 7)} : {0.19939294427676363}
{(2, 5)} : {0.10108396263496681}
{(8, 5)} : {0.060561906849773584}
{(5, 8)} : {0.060561906849773584}
{(4, 0)} : {0.10604624458066056}
{(9, 0)} : {0.05025573636377372}
{(6, 7)} : {0.038027192299043916}
{(5, 5)} : {0.49082296434988737}
{(7, 6)} : {0.03802719229904393}
{(5, 0)} : {0.09715689617128141}
{(0, 4)} : {0.10604624458066053}
{(3, 5)} : {0.0702326010857185}
{(1, 1)} : {0.5510434079226729}
{(3, 2)} : {0.10701990821164017}
{(2, 6)} : {0.05772518267515081}
{(8, 2)} : {0.09001424826730234}
{(4, 5)} : {0.06307599238862405}
{(9, 3)} : {0.06457339148266805}
{(6, 0)} : {0.07303473139702996}
{(1, 4)} : {0.07987535226835876}
{(7, 5)} : {0.05046833575143042}
{(2, 3)} : {0.10701990821164016}
{(1, 9)} : {0.049954307427271485}
{(8, 7)} : {0.05131331970053732}
{(4, 2)} : {0.11326544140309289}
{(9, 6)} : {0.08886803115507078}
{(6, 5)} : {0.17790500592129016}
{(5, 3)} : {0.0702326010857185}
{(0, 1)} : {0.08545739355421618}
{(7, 0)} : {0.1528561102231263}
{(6, 8)} : {0.10504267143809964}
{(3, 1)} : {0.10198173036522949}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值