一. 信息检索技术简述

  信息检索技术是当前比较热门的一项技术,我们通常意义上的论文检索,搜索引擎都属于信息检索的范畴。信息检索的问题可以抽象为:在文档集合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模型的更多相关文章

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

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

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

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

  3. 25.TF&IDF算法以及向量空间模型算法

    主要知识点: boolean model IF/IDF vector space model     一.boolean model     在es做各种搜索进行打分排序时,会先用boolean mo ...

  4. tf–idf算法解释及其python代码

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

  5. 转-Python自然语言处理入门

      Python自然语言处理入门 原文链接:http://python.jobbole.com/85094/ 分享到:20 本文由 伯乐在线 - Ree Ray 翻译,renlytime 校稿.未经许 ...

  6. Python自然语言处理工具小结

    Python自然语言处理工具小结 作者:白宁超 2016年11月21日21:45:26 目录 [Python NLP]干货!详述Python NLTK下如何使用stanford NLP工具包(1) [ ...

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

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

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

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

  9. 自然语言处理的CNN模型中几种常见的池化方法

    自然语言处理的CNN模型中几种常见的池化方法 本文是在[1]的基础上进行的二次归纳. 0x00 池化(pooling)的作用   首先,回顾一下NLP中基本的CNN模型的卷积和池化的大致原理[2].f ...

  10. Python自然语言处理(1):初识NLP

    由于我们从美国回来就是想把医学数据和医学人工智能的事认真做起来,所以我们选择了比较扎实的解决方法,想快速出成果的请绕道.我们的一些解决方法是:1.整合公开的所有医学词典,尽可能包含更多的标准医学词汇: ...

随机推荐

  1. VC.时间(网页内容收集)

    1.VC++获得当前系统时间的几种方案_记忆53秒_新浪博客.html(http://blog.sina.com.cn/s/blog_676271a60101i0hb.html) 1.1.内容保存: ...

  2. Android自定义权限

    一.自定义权限 自定义权限,一般是考虑到应用共享组件时的安全问题.我们知道在四大组件 AndroidManifest 中注册的时候,添加 exported = "true" 这一属 ...

  3. MySQL学习(十四)

    utf8的bom问题 在xp下,用记事本创建utf8文件的时候,前面多了3个字节,这3个字节不用来显示,是用来辨识编码用的,EF BB BF告诉记事本,这是utf8编码. 存储引擎和事务简单介绍 引擎 ...

  4. cocos2dx spine之二 :spine变色

    cocos2dx版本为3.10 1.具体原理和代码可以参考博文<利用shader改变图片色相Hue>,下面的代码根据该博文进行整理优化. 基本原理就是将RGB值转换为HSL值后加上输入的H ...

  5. JAVA中Action层, Service层 ,modle层 和 Dao层的功能区分

    Dao层是使用了Hibernate连接数据库.操作数据库(增删改查).Service层:引用对应的Dao数据库操作,在这里可以编写自己需要的代码(比如简单的判断).Action层:引用对应的Servi ...

  6. What is a working set and how do I use it?

    //http://www.avajava.com/tutorials/lessons/what-is-a-working-set-and-how-do-i-use-it.html Working se ...

  7. FireFox(火狐)浏览器的相关问题

    如何加快FireFox(火狐)浏览器浏览网页速度 大部分网页加载缓慢的原因:1.宽带连接.网速不稳定2.浏览器本身问题,如果多开窗口浏览会占大量内存,而且磁盘空间没有做过优化,就这样电脑资源不够用,也 ...

  8. learn the python the hard way习题11~17总结

    关于 input() 格式: input("prompt")功能:从 CLI 获取 User 的一个输入,显示 promt 的内容,并且返回一个 string 类型的数值其他:如果 ...

  9. HTML 第十三章总结

    前言 这一章的内容主要是处理 HTML 中的 tabular data,可以分为三个部分: 如何在 HTML 中创建表格 如何在 CSS 中 style 表格 如何在 CSS 中 style HTML ...

  10. springmvc如何进行热部署开发

    1.场景还原 在工程量大的情况下,tomcat运行部署一次会花费相当多的时间,这样太 浪费人力以及时间了:今天笔者将 讲解一下如何配置springmvc工程的热部署 2.实现方案 其实很简单! ①在t ...