Python自然语言处理---TF-IDF模型
一. 信息检索技术简述
信息检索技术是当前比较热门的一项技术,我们通常意义上的论文检索,搜索引擎都属于信息检索的范畴。信息检索的问题可以抽象为:在文档集合D上,对于关键词w[1]…w[k]组成的查询串q,返回一个按查询串q和文档d匹配度relevance(q,d)排序的相关文档列表D。
经典的信息检索模型包括布尔模型,向量模型,TF-IDF模型。布尔模型以集合的布尔运算为基础,查询效率高,但模型过于简单,无法有效地对不同文档进行排序,所以查询效果不佳。向量模型把文档和查询串都视为词所构成的多维向量,而文档与查询的相关性即对应于向量间的夹角。不过,由于通常词的数量巨大,向量维度非常高,而大量的维度都是0,计算向量夹角的效果并不好。加上庞大的计算也使得向量模型几乎不具有在互联网搜索引擎这样海量数据集上实施的可行性。TF-IDF模型目前广泛被应用于搜索引擎等实际应用中。其主要思想是:如果词w在一篇文档d中出现的频率高,并且在其他文档中很少出现,则认为词w具有很好的区分能力,适合用来把文章d和其他文章区别开来。
二. TF-IDF模型
1. 概念
1)词w在文档d中的词频tf(Term Frequency),指词w在文档d中出现的频率。
tf(w, d)=count(w, d) / size (d)
2)词w在整个文档集合中的逆向文档频率idf(Inverse Document Frequency), 即文档总数n与词w所出现文件数docs(W, D)比值的对数:
idf = log (n / docs (W, D))
3)Tf-idf模型通过计算tf和idf为每一个文档d和由关键词w[1]…w[k]组成的查询串q计算一个权值,用于表示查询串q与文档d的匹配度:
Tf-idf (q, d)
= sum { i=I …k | tf-idf(w[i], d) }
= sum { i=1…k | tf(w[i], d) * idf( w[i]) }
2.应用(处理包含14个TXT文档的语料库)
1)分别处理各个TXT,计算词频。
import nltk
from nltk.corpus import * def mid_text_dir():
corpus_root=r"D:\segfile"
wordlists=PlaintextCorpusReader(corpus_root, '.*')
return wordlists def getTextTermFreq(wordlists):
filelist=wordlists.fileids()
path='D:/mi-result/' for file in filelist:
word=wordlists.words(file)
vocab=set(word)
f1=open(path+file+'.txt', 'w+')
tip="the text has %d different words and the sum of vocab is %d" % (len(vocab),len(word))
print(tip) f1.write(tip)
f1.write('----------------------\n\n')
fdist=nltk.FreqDist(word)
for w in vocab:
f1.write(w.ljust(25)+str(fdist[w]).ljust(10)+str(fdist[w]/len(word))+'\n')
f1.close()
print(tip)
运行结果如下截图:

2)运用TF-IDF算法
def getFilelist(path) : //访问目标语料库,获得文件列表
filelist = []
files = os.listdir(path)
for f in files :
if(f[0] == '.') :
pass
else :
filelist.append(f)
return filelist,path def fenci(argv,path) : //分词,并保存文件
sFilePath = 'D:/my_segfile/'
if not os.path.exists(sFilePath) :
os.mkdir(sFilePath)
filename = argv
try:
f = open(path+filename,'r+', encoding= 'gbk')
file_list = f.read()
except UnicodeDecodeError:
f = open(path+filename,'r+', encoding= 'utf-8')
file_list = f.read()
f.close() seg_list = jieba.cut(file_list,cut_all=True)
result = []
for seg in seg_list :
seg = ' '.join(seg.split())
if (seg != '' and seg != "\n" and seg != "\n\n") :
result.append(seg) f = open(sFilePath+"/"+filename+"-seg.txt","w+")
f.write(' '.join(result))
f.close() def Tfidf(filelist) : //运用TF-IDF算法进行匹配度计算, 该算法首先遍历所有文件,获得所有单词的列表,然后以文章为元素,每个文章保存相同位置的词的词频,然后分别计算每个词的词频。
path = 'D:/segfile/'
corpus = []
for ff in filelist :
fname = path + ff
f = open(fname,'r+')
content = f.read()
f.close()
corpus.append(content) vectorizer = CountVectorizer()
transformer = TfidfTransformer() x= vectorizer.fit_transform(corpus)
print ("line of x.toarray is %d" % len(x.toarray()))
print ("rows of x.toarray is %d" % len(x.toarray()[0])) tfidf = transformer.fit_transform(vectorizer.fit_transform(corpus)) word = vectorizer.get_feature_names()
f = open('D:/mi-result/Word.txt','w+')
for i in word:
f.write(i.ljust(20))
f.close() Term_freq=x.toarray()
for h in range(len(Term_freq)):
temp_path="D:/mi-result/Term_frequence_text%d.txt" % h
f = open(temp_path,'w+')
for i in range(len(Term_freq[0])):
f.write(word[i].ljust(25)+""+str(Term_freq[h][i])+"\n")
f.close() weight = tfidf.toarray() sFilePath = 'D:/tfidffile'
if not os.path.exists(sFilePath) :
os.mkdir(sFilePath) for i in range(len(weight)) :
print ("--------Writing all the tf-idf in the %d file into %s/re%d.txt--------" % (i, sFilePath, i))
path= "%s/re%d.txt" % (sFilePath, i)
##f = open(sFilePath+'/re'+i+'.txt','w+')
f = open(path,'w+')
for j in range(len(word)) :
f.write(word[j].ljust(25)+""+str(weight[i][j])+"\n")
f.close() if __name__ == "__main__" :
wordlists=mid_text_dir()
getTextTermFreq(wordlists)
argv='D:/segfile/'
(allfile,path) = getFilelist(argv)
for ff in allfile:
print ("Using jieba on %s " % ff)
fenci(ff,path) Tfidf(allfile)
运行结果如下:


Python自然语言处理---TF-IDF模型的更多相关文章
- tf–idf算法解释及其python代码实现(下)
tf–idf算法python代码实现 这是我写的一个tf-idf的简单实现的代码,我们知道tfidf=tf*idf,所以可以分别计算tf和idf值在相乘,首先我们创建一个简单的语料库,作为例子,只有四 ...
- tf–idf算法解释及其python代码实现(上)
tf–idf算法解释 tf–idf, 是term frequency–inverse document frequency的缩写,它通常用来衡量一个词对在一个语料库中对它所在的文档有多重要,常用在信息 ...
- 25.TF&IDF算法以及向量空间模型算法
主要知识点: boolean model IF/IDF vector space model 一.boolean model 在es做各种搜索进行打分排序时,会先用boolean mo ...
- tf–idf算法解释及其python代码
tf–idf算法python代码实现 这是我写的一个tf-idf的简单实现的代码,我们知道tfidf=tf*idf,所以可以分别计算tf和idf值在相乘,首先我们创建一个简单的语料库,作为例子,只有四 ...
- 转-Python自然语言处理入门
Python自然语言处理入门 原文链接:http://python.jobbole.com/85094/ 分享到:20 本文由 伯乐在线 - Ree Ray 翻译,renlytime 校稿.未经许 ...
- Python自然语言处理工具小结
Python自然语言处理工具小结 作者:白宁超 2016年11月21日21:45:26 目录 [Python NLP]干货!详述Python NLTK下如何使用stanford NLP工具包(1) [ ...
- TF/IDF(term frequency/inverse document frequency)
TF/IDF(term frequency/inverse document frequency) 的概念被公认为信息检索中最重要的发明. 一. TF/IDF描述单个term与特定document的相 ...
- 文本分类学习(三) 特征权重(TF/IDF)和特征提取
上一篇中,主要说的就是词袋模型.回顾一下,在进行文本分类之前,我们需要把待分类文本先用词袋模型进行文本表示.首先是将训练集中的所有单词经过去停用词之后组合成一个词袋,或者叫做字典,实际上一个维度很大的 ...
- 自然语言处理的CNN模型中几种常见的池化方法
自然语言处理的CNN模型中几种常见的池化方法 本文是在[1]的基础上进行的二次归纳. 0x00 池化(pooling)的作用 首先,回顾一下NLP中基本的CNN模型的卷积和池化的大致原理[2].f ...
- Python自然语言处理(1):初识NLP
由于我们从美国回来就是想把医学数据和医学人工智能的事认真做起来,所以我们选择了比较扎实的解决方法,想快速出成果的请绕道.我们的一些解决方法是:1.整合公开的所有医学词典,尽可能包含更多的标准医学词汇: ...
随机推荐
- SPOJ 刷题记录
按点赞数降序 297 二分 #include<bits/stdc++.h> using namespace std; #define fi first #define se second ...
- ThinkPHP执行原生的SQL语句
执行原生的SQL语句: $sql="insert select update delete...."; ①查询语句: $model对象 -> query($sql); ...
- 开发自己的R包(转)
R不必说,数据统计分析可视化的必备语言,R包开发的门槛比较低,所以现在随便一篇文章都会发表一个自己的R包,这样有好处(各种需求早有人帮你解决了)也有坏处(R包太多,混乱,新手上手较难).作为生信工程师 ...
- BGP - 5,BGP属性
metric,自己决定去哪个EBGP邻居 local-pre,影响AS内部IBGP邻居的路由决策 med,影响AS外部EBGP邻居的路由决策 1,BGP属性 公认传递(well-known ...
- codeforces 578a//A Problem about Polyline// Codeforces Round #320 (Div. 1)
题意:一个等腰直角三角形一样的周期函数(只有x+轴),经过给定的点(a,b),并且半周期为X,使X尽量大,问X最大为多少? 如果a=b,结果就为b 如果a<b无解. 否则,b/(2*k*x-a) ...
- 什么是EOS(不一样的角度看柚子)
是时候给写写EOS了,现在EOS主网已经上线,尽管我个人不是很喜欢EOS项目(不过也一直在关注EOS),但是不可否认EOS这个争议性很大的项目给区块链世界带来的变化. 写在前面 阅读本文前,如果了解过 ...
- android--------自定义控件 之 基本流程篇
在我们平常的Android开发中经常和控件打交道,有时Android提供的控件未必能满足业务的需求,这个时候就需要我们实现自定义一些控件 自定义控件可以设计出很多你想要的功能和模块,在开发中是很重要的 ...
- react中的核心概念
DOM:浏览器中提供的概念: 虚拟DOM:框架中的概念:需要开发框架的程序员手动用JS对象来模拟DOM元素和嵌套关系: 本质:用JS对象,模拟DOM树: 目的:实现页面的按需更新: 要求:点击列头,实 ...
- https请求排错过程
1. 看请求有没有到nginx 此时需要查看nginx的日志.一般每一个项目都会配置一个nginx站点,而一个站点都会又一个nginx配置文件,这个文件位于哪里呢?不出意外应该在:下面,如果找不到的话 ...
- POJ No.2386 Lake Counting
题目链接:http://poj.org/problem?id=2386 分析:八联通的则为水洼,我们则需遍历一个单位附近的八个单位并将它们都改成'.',但附近单位可能仍连接着有'W'的区域,这种情况下 ...