1. TF-IDF简介

TF-IDF(Term Frequency/Inverse Document Frequency)是信息检索领域非常重要的搜索词重要性度量;用以衡量一个关键词\(w\)对于查询(Query,可看作文档)所能提供的信息。词频(Term Frequency, TF)表示关键词\(w\)在文档\(D_i\)中出现的频率:

\[TF_{w,D_i}= \frac {count(w)} {\left| D_i \right|}
\]

其中,\(count(w)\)为关键词\(w\)的出现次数,\(\left| D_i \right|\)为文档\(D_i\)中所有词的数量。逆文档频率(Inverse Document Frequency, IDF)反映关键词的普遍程度——当一个词越普遍(即有大量文档包含这个词)时,其IDF值越低;反之,则IDF值越高。IDF定义如下:

\[IDF_w=\log \frac {N}{\sum_{i=1}^N I(w,D_i)}
\]

其中,\(N\)为所有的文档总数,\(I(w,D_i)\)表示文档\(D_i\)是否包含关键词,若包含则为1,若不包含则为0。若词\(w\)在所有文档中均未出现,则IDF公式中的分母为0;因此需要对IDF做平滑(smooth):

\[IDF_w=\log \frac {N}{1+\sum_{i=1}^N I(w,D_i)}
\]

关键词\(w\)在文档\(D_i\)的TF-IDF值:

\[TF-IDF_{w,D_i}=TF_{w,D_i}*IDF_w
\]

从上述定义可以看出:

  • 当一个词在文档频率越高并且新鲜度高(即普遍度低),其TF-IDF值越高。
  • TF-IDF兼顾词频与新鲜度,过滤一些常见词,保留能提供更多信息的重要词。

TF-IDF模型的概率解释》从概率的角度给出TF-IDF的数学解释,《The Vector Space Model of text》为TF-IDF的实操教程,包括TF-IDF的一般计算、正则化,以及如何使用scikit-learn(sklearn)来计算TF-IDF矩阵。

2. 关键词提取

最近碰到一个需求,挖掘行业关键词;比如,IT行业的关键词有:Java、Python、机器学习等。TF-IDF正好可用来做关键词的抽取,词TF-IDF值越大,则说明该词为关键词。那么,问题来了:如何套用TF-IDF模型呢?

模型套用

为了做关键词挖掘,首先得有数据;我们从某招聘网站爬取了20个行业招聘信息数据。然后,对数据进行分词。我们发现,行业关键词具有领域特定性,即一个行业的关键词一般不会同属于另外几个行业。因此,我们每一个行业的分词结果作为一个大doc,则doc的总数量为20。用sklearn计算TF-IDF矩阵,取每个行业top词。

在上述模型套用中,因为doc总数少,发现top词中会有一些常见词,诸如“认真负责”、“岗位”之类。为了过滤常见词,采取两个办法:

  • jieba分词对每一条招聘信息做关键词抽取(也是基于TF-IDF),如此能在生成大doc时剔除掉部分常见词。
  • 引入max_df,如果词的df超过某一阈值则被词表过滤。

代码实现

分词采用的jieba,如果觉得分词效果不太理想,可采用百度词条作为自定义分词词典;TF-IDF计算依赖于sklearn;求matrix 的row top则用到了numpy。具体代码如下:

# -*- coding: utf-8 -*-
# @Time : 2016/9/6
# @Author : rain
import codecs
import os import jieba.analyse
import numpy as np
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer base_path = "./resources/corpus/"
seg_path = "./resources/segmented/" def segment():
"""word segment"""
for txt in os.listdir(base_path):
whole_base = os.path.join(base_path, txt)
whole_seg = os.path.join(seg_path, txt)
with codecs.open(whole_base, 'r', 'utf-8') as fr:
fw = codecs.open(whole_seg, 'w', 'utf-8')
for line in fr.readlines():
# seg_list = jieba.cut(line.strip())
seg_list = jieba.analyse.extract_tags(line.strip(), topK=20, withWeight=False, allowPOS=())
fw.write(" ".join(seg_list))
fw.close() def read_doc_list():
"""read segmented docs"""
trade_list = []
doc_list = []
for txt in os.listdir(seg_path):
trade_list.append(txt.split(".")[0])
with codecs.open(os.path.join(seg_path, txt), "r", "utf-8") as fr:
doc_list.append(fr.read().replace('\n', ''))
return trade_list, doc_list def tfidf_top(trade_list, doc_list, max_df, topn):
vectorizer = TfidfVectorizer(max_df=max_df)
matrix = vectorizer.fit_transform(doc_list)
feature_dict = {v: k for k, v in vectorizer.vocabulary_.items()} # index -> feature_name
top_n_matrix = np.argsort(-matrix.todense())[:, :topn] # top tf-idf words for each row
df = pd.DataFrame(np.vectorize(feature_dict.get)(top_n_matrix), index=trade_list) # convert matrix to df
return df segment()
tl, dl = read_doc_list()
tdf = tfidf_top(tl, dl, max_df=0.3, topn=500)
tdf.to_csv("./resources/keywords.txt", header=False, encoding='utf-8')

TF-IDF提取行业关键词的更多相关文章

  1. SnowNLP:•中文分词•词性标准•提取文本摘要,•提取文本关键词,•转换成拼音•繁体转简体的 处理中文文本的Python3 类库

    SnowNLP是一个python写的类库,可以方便的处理中文文本内容,是受到了TextBlob的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个方便处理中文的类库,并且和Te ...

  2. TF/IDF(term frequency/inverse document frequency)

    TF/IDF(term frequency/inverse document frequency) 的概念被公认为信息检索中最重要的发明. 一. TF/IDF描述单个term与特定document的相 ...

  3. 基于TF/IDF的聚类算法原理

        一.TF/IDF描述单个term与特定document的相关性TF(Term Frequency): 表示一个term与某个document的相关性. 公式为这个term在document中出 ...

  4. TF/IDF计算方法

    FROM:http://blog.csdn.net/pennyliang/article/details/1231028 我们已经谈过了如何自动下载网页.如何建立索引.如何衡量网页的质量(Page R ...

  5. 信息检索中的TF/IDF概念与算法的解释

    https://blog.csdn.net/class_brick/article/details/79135909 概念 TF-IDF(term frequency–inverse document ...

  6. 使用solr的函数查询,并获取tf*idf值

    1. 使用函数df(field,keyword) 和idf(field,keyword). http://118.85.207.11:11100/solr/mobile/select?q={!func ...

  7. tf–idf算法解释及其python代码实现(下)

    tf–idf算法python代码实现 这是我写的一个tf-idf的简单实现的代码,我们知道tfidf=tf*idf,所以可以分别计算tf和idf值在相乘,首先我们创建一个简单的语料库,作为例子,只有四 ...

  8. tf–idf算法解释及其python代码实现(上)

    tf–idf算法解释 tf–idf, 是term frequency–inverse document frequency的缩写,它通常用来衡量一个词对在一个语料库中对它所在的文档有多重要,常用在信息 ...

  9. 文本分类学习(三) 特征权重(TF/IDF)和特征提取

    上一篇中,主要说的就是词袋模型.回顾一下,在进行文本分类之前,我们需要把待分类文本先用词袋模型进行文本表示.首先是将训练集中的所有单词经过去停用词之后组合成一个词袋,或者叫做字典,实际上一个维度很大的 ...

随机推荐

  1. Palm是一家英國智能手機公司

    據TCL方面介紹,本次收購只涉及品牌,不會涉及員工和其他資產.被收購之後,Palm仍將繼續把總部設於美國加州矽谷,以發揮該區域所獨有的先進技術和人才的優勢. TCL通訊CEO郭愛平表示TCL將把Pal ...

  2. 推荐升级ASP.NET Web API 2

    ASP.NET Web API 使用很长时间了,期间也碰到不少问题,升级到WebAPI2后这些问题都解决了,稳定性方面也提升不少,所以推荐使用.碰到的问题是下面的2类: 1.multipart/for ...

  3. Key/Value之王Memcached初探:三、Memcached解决Session的分布式存储场景的应用

    一.高可用的Session服务器场景简介 1.1 应用服务器的无状态特性 应用层服务器(这里一般指Web服务器)处理网站应用的业务逻辑,应用的一个最显著的特点是:应用的无状态性. PS:提到无状态特性 ...

  4. 基于存储过程的MVC开源分页控件--LYB.NET.SPPager

    摘要 现在基于ASP.NET MVC的分页控件我想大家都不陌生了,百度一下一大箩筐.其中有不少精品,陕北吴旗娃杨涛大哥做的分页控件MVCPager(http://www.webdiyer.com/)算 ...

  5. 【Java并发编程实战】-----“J.U.C”:ReentrantLock之三unlock方法分析

    前篇博客LZ已经分析了ReentrantLock的lock()实现过程,我们了解到lock实现机制有公平锁和非公平锁,两者的主要区别在于公平锁要按照CLH队列等待获取锁,而非公平锁无视CLH队列直接获 ...

  6. 当程序以Windows Services形式启动时当前路径不对

    当程序以Windows Services形式启动时当前路径不对 @(操作系统)[博客|dotNet] 很多时候我们需要将我们的程序写成利用Windows服务的形式来让它能够自启动.今天遇到一个问题,当 ...

  7. TODO:MongoDB MySQL数据库备份

    TODO:MongoDB MySQL数据库备份 1. MongoDB使用命令备份 mongodump进行整个数据库备份,主要用到的命令参数: -d 要备份的数据库 -o 输出的路径 ./mongodu ...

  8. 2013 duilib入门简明教程 -- 前言(1)

        关于duilib的介绍就不多讲了,一来不熟,二来小伙伴们想必已经对比了多个界面库,也无需赘述.下面进入正题:     不看广告看疗效! 已有众多知名公司采用duilib做为界面库,如华为网盘. ...

  9. iOS开发-闪退问题-解决之前上架的 App 在 iOS 9 会闪退问题

    最新更新:(2015.10.02) 开发环境: Delphi 10 Seattle OS X El Capitan v10.11 需使用下列 HotfixID: 30398, PAServer Hot ...

  10. 元素绝对定位以后设置了高宽,a标签不能点击的原因总结

    元素绝对定位以后设置了高宽,a标签不能点击的原因: 1.元素内并无内容 2.背景是透明的,无任何背景图或者颜色 解决方法: 1.如果不是绝对定位元素的,可以用相对定位 2.给元素加透明的背景图 3.I ...