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.整合公开的所有医学词典,尽可能包含更多的标准医学词汇: ...
随机推荐
- servlet中为什么doGet方法没有被调用的一种可能(笔记)
创建了一个servlet,然后在doGet()方法内写一些简单的测试语句,但是在实际运行中发现并没有调用到doGet()方法,后来发现自己在创建servlet是将service()方法也勾选上去了,而 ...
- maven项目依赖jar包报 java.lang.classnotfoundexception:Type com.xx.xx.xxx not present 的解决
今天在工作的时候遇到了这样一个奇葩的异常: java.lang.classnotfoundexception:Type com.ys.yahu.vo.file.MobileFileVo not pre ...
- java线程执行的优先级
1.1 线程的优先级 java 中的线程优先级的范围是1-10,默认的优先级是5.10极最高. 有时间片轮循机制.“高优先级线程”被分配CPU的概率高于“低优先级线程”.根据时间片轮循调度, ...
- C# : 泛型的继承关系实现的一个可以存放不同数据类型的链表
以下定义的是一个链表结点类型: internal sealed class Node<T> { public T m_data; public Node<T> m_next; ...
- boke练习: freemarker对空变量报错 (classic_compatible设置true,解决报空错误)
我有一个变量: commentModel 默认只是为空, 在freemarker模板中使用<#if>判断是报错 <#if commentModel> ..... </#i ...
- Windows Phone 8 开发必备资源
一.MVVM框架推荐 1. MVVM-Light 这个框架是我最常用的MVVM框架之一,它比Prism更轻量级,但对于一般的小应用,功能足够. 官方网站:http://mvvmlight.codepl ...
- android-------开发常用框架汇总
响应式编程 RxJava https://github.com/ReactiveX/RxJava RxAndroid https://github.com/ReactiveX/RxAndroid 消息 ...
- Confluence 6 查看所有空间
有下面 2 种方法在 Confluence 中查看空间: 空间目录(The space directory) – 在 Confluence 的头部选择 空间(Spaces )> 空间目录(Spa ...
- Django多表查询练习题
#一 model表:from django.db import models # Create your models here. class Teacher(models.Model): tid=m ...
- 苹果手机marquee显示文字不全,如何解决?
不能给marquee设定宽度,如果想只显示屏幕宽度的一部分,就给marquee外面包一个div,给外面的div设定宽度,这样就解决了文字显示不全的问题