關鍵詞提取之TF-IDF - jieba源碼研讀筆記(十七) - 代码先锋网
文章推薦指數: 80 %
在前篇介紹了 jieba/analyse/tfidf.py 的架構,本篇將介紹該檔案中的 TFIDF 類別。
TFIDF 類別的 extract_tags 函數負責實現核心算法。
透過 allowPOS 這個參數可以選擇 ...
代码先锋网 代码片段及技术文章聚合
首页
联系我们
版权申明
隐私政策
首页
联系我们
版权申明
隐私政策
jieba源碼研讀筆記(十七)-關鍵詞提取之TF-IDF
jieba源碼研讀筆記(十七)-關鍵詞提取之TF-IDF前言TF-IDF算法初始化set_idf_path函數extract_tags函數參考連結
前言
在前篇介紹了jieba/analyse/tfidf.py的架構,本篇將介紹該檔案中的TFIDF類別。
TFIDF類別的extract_tags函數負責實現核心算法。
透過allowPOS這個參數可以選擇要使用一般的tokenizer或是用於詞性標注的tokenizer。
TF-IDF算法
參考維基百科中的tf-idf頁面:
TF代表的是termfrequency,即文檔中各詞彙出現的頻率。
IDF代表的是inversedocumentfrequency,代表詞彙在各文檔出現頻率倒數的對數值(以10為底)。
而TF-IDF值則是上述兩項的乘積。
TF-IDF值是在各詞彙及各文檔間計算的。
如果詞彙i在文檔j中的TF-IDF值越大,則代表詞彙i在文檔j中越重要。
初始化
classTFIDF(KeywordExtractor):
def__init__(self,idf_path=None):
#定義兩種tokenizer,分別在兩種模式下使用
self.tokenizer=jieba.dt
self.postokenizer=jieba.posseg.dt
#self.STOP_WORDS繼承自KeywordExtractor類別
self.stop_words=self.STOP_WORDS.copy()
#DEFAULT_IDF為全局變數
#如果有傳參數到IDFLoader建構子內,
#那麼它就會自動呼叫set_new_path函數,
#來將idf_freq,median_idf這兩個屬性設定好
self.idf_loader=IDFLoader(idf_pathorDEFAULT_IDF)
self.idf_freq,self.median_idf=self.idf_loader.get_idf()
set_idf_path函數
如果使用者想要換一個新的idf檔案,可以直接使用set_idf_path函數。
它會調用IDFLoader類別的set_new_path函數,讀取idf.txt這個文檔,並設定TFIDF物件的idf_freq及median_idf這兩個屬性。
classTFIDF(KeywordExtractor):
#...
defset_idf_path(self,idf_path):
new_abs_path=_get_abs_path(idf_path)
ifnotos.path.isfile(new_abs_path):
raiseException("jieba:filedoesnotexist:"+new_abs_path)
self.idf_loader.set_new_path(new_abs_path)
self.idf_freq,self.median_idf=self.idf_loader.get_idf()
extract_tags函數
jieba文檔中關於extract_tags參數的說明:
jieba.analyse.extract_tags(sentence,topK=20,withWeight=False,allowPOS=())
sentence为待提取的文本
topK为返回几个TF/IDF权重最大的关键词,默认值为20
withWeight为是否一并返回关键词权重值,默认值为False
allowPOS仅包括指定词性的词,默认值为空,即不筛选
classTFIDF(KeywordExtractor):
#...
defextract_tags(self,sentence,topK=20,withWeight=False,allowPOS=(),withFlag=False):
"""
ExtractkeywordsfromsentenceusingTF-IDFalgorithm.
Parameter:
-topK:returnhowmanytopkeywords.`None`forallpossiblewords.
-withWeight:ifTrue,returnalistof(word,weight);
ifFalse,returnalistofwords.
-allowPOS:theallowedPOSlisteg.['ns','n','vn','v','nr'].
ifthePOSofwisnotinthislist,itwillbefiltered.
-withFlag:onlyworkwithallowPOSisnotempty.
ifTrue,returnalistofpair(word,weight)likeposseg.cut
ifFalse,returnalistofwords
"""
ifallowPOS:
#參考[Pythonfrozenset()](https://www.programiz.com/python-programming/methods/built-in/frozenset)
#Thefrozenset()methodreturnsanimmutablefrozensetobject
#initializedwithelementsfromthegiveniterable.
allowPOS=frozenset(allowPOS)
#words為generatorofpair(pair類別定義於jieba/posseg/__init__.py檔)
#其中pair類別的物件具有word及flag(即詞性)兩個屬性
words=self.postokenizer.cut(sentence)
else:
#words為generatorofstr
words=self.tokenizer.cut(sentence)
#計算詞頻(即TF,termfrequency)
freq={}
forwinwords:
ifallowPOS:
ifw.flagnotinallowPOS:#僅選取存在於allowPOS中詞性的詞
continue
elifnotwithFlag:#僅回傳詞彙本身
w=w.word
#在allowPOS及withFlag皆為True的情況下,從w中取出詞彙本身,設為wc
#如果不符上述情況,則直接將wc設為w
wc=w.wordifallowPOSandwithFlagelsew
iflen(wc.strip())<2orwc.lower()inself.stop_words:
#略過長度小於等於1的詞及停用詞?
continue
freq[w]=freq.get(w,0.0)+1.0
#所有詞頻的總和
total=sum(freq.values())
#將詞頻(TF)乘上逆向文件頻率(即IDF,inversedocumentfrequency)
forkinfreq:
kw=k.wordifallowPOSandwithFlagelsek
#如果idf_freq字典中未記錄該詞,則以idf的中位數替代
freq[k]*=self.idf_freq.get(kw,self.median_idf)/total
#現在freq變為詞彙出現機率乘上IDF
ifwithWeight:
#回傳詞彙本身及其TF-IDF
#itemgetter(1)的參數是鍵值對(因為是sorted(freq.items()))
#它回傳tuple的第1個元素(index從0開始),即字典的值
#所以sorted會依value來排序
#reverse=True:由大至小排列
tags=sorted(freq.items(),key=itemgetter(1),reverse=True)
else:
#僅回傳詞彙本身
#freq.__getitem__的參數是字典的鍵(因為是sorted(freq))
#它回傳的是字典的值,所達到的效用是sortbyvalue
tags=sorted(freq,key=freq.__getitem__,reverse=True)
iftopK:
#僅回傳前topK個
returntags[:topK]
else:
returntags
總結一下,extract_tags函數會先用tokenizer或postokenizer分詞後,再計算各詞的詞頻。
得到詞頻後,再與idf_freq這個字典中相對應的詞做運算,得到每個詞的TF-IDF值。
最後依據withWeight及topK這兩個參數來對結果做後處理再回傳。
參考連結
維基百科中的tf-idf頁面
jieba源碼研讀筆記(八)-分詞函數入口cut及tokenizer函數
jieba源碼研讀筆記(十四)-詞性標注函數入口
版权声明:本文为keineahnung2345原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/keineahnung2345/article/details/88125834
智能推荐
一、创建一个容器,这里是一个以centos7为基础镜像-v/sys/fs/cgroup:/sys/fs/cgroup在容器中创建服务时,带上这个会少很多报错二、安装软件及启动三、管理帐号的配置先用一个命令生成一个LDAP管理用户root密码:[[email protected]~]#slappasswdvimrootpwd.ldif下面使用ldapadd命令将上面的root...
题目:编写程序,给定一个非负整数n,返回n!的结果,及结果尾数中零的个数。
...
关于LNMP的安装,见这个帖子:http://blog.csdn.net/kimsoft/article/details/7100595(LNMP最新版本+YUM方式安装指南(CentOS5.5+Nginx1.0.x+MySQL5.5.x+PHP5.3.x))安装要注意几点:一、Nginx+PHP的组合,问题多出在配置上,解决办法有多种,不废话,直接上配置假定:/...
学习笔记,仅供参考,有错必纠文章目录多线程多线程引入什么是线程多线程并行和并发的区别Java程序运行原理多线程的实现方式多线程实现的方式1多线程程序实现的方式2以上两种实现方式的区别获取和设置线程名字获取当前线程对象休眠线程守护线程加入线程礼让线程(略)多线程多线程引入什么是线程线程是程序执行的一条路径,一个进程中可以包含多条线程;多线程并发执行可以提高程...
cloudcompare(简称CC)的开发资料相对较少。
在写具体的插件时,笔者原本的算法是基于Eigen3矩阵库实现了,需要将ccPointCLoud转换为Eigen3的矩阵Matrix的,代码如下:...
猜你喜欢
问题描述: 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。
同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。
例如,“student.aamI”。
后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“Ia...
题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1247题意给你一系列字符串,问哪些字符串是由其他两个字符串(一个字符串*2也可以)一个作为前缀一个作为后缀组成的么。
思路暴力枚举每一个字符串的前缀和后缀的中间位置,然后字典树匹配或者直接map也可以。
(主要尝试一下动态建树)代码...
文章目录方法一:字符串只包含小写字符,总共有26个小写字符。
可以用HashTable来映射字符与出现次数,因为键值范围很小,因此可以使用长度为26的整型数组对字符串出现的字符进行统计,比较两个字符串出现的字符数量是否相同。
方法二:...
instruments在iOS上进行性能分析的时候,首先考虑借助instruments这个利器分析出问题出在哪,不要凭空想象,不然你可能把精力花在了1%的问题上,最后发现其实啥都没优化,比如要查看程序哪些部分最耗时,可以使用TimeProfiler,要查看内存是否泄漏了,可以使用Leaks等。
关于instruments网上有很多资料,作为一个合格iOS开发者,熟悉这个工具还是很有必要的。
目录...
为了缓解服务器压力,可以cache赋值数据集,填充,代码如下...
相关文章
jieba源碼研讀筆記(十六)-關鍵詞提取之tfidf.py檔初探
jieba源碼研讀筆記(十八)-關鍵詞提取之TF-IDF使用示例
jieba源碼研讀筆記(十二)-詞性標注(不使用HMM)
jieba源碼研讀筆記(十一)-詞性標注之POSTokenizer初探
jieba源碼研讀筆記(四)-正則表達式
Lucene實戰開發手記(七)---關鍵詞提示
mve-KneipP3P代碼研讀筆記
PCL-ICP代碼研讀(十七)-CorrespondenceRejectorDistance架構
TensorRT/samples/common/argsParser.h源碼研讀
TensorRT/parsers/caffe/caffeMacros.h源碼研讀
热门文章
【mysql基础系列之四】字段属性
第六章类和对象
Python:使用itcaht库实现微信自动收发消息
内部类(3)
1005继续(3n+1)猜想(PAT-B)
Python之路(一)
jQuery的after()与insertAfter()
CSS深入理解之padding
得到第一个元素和最后一个元素
分享一个python调试程序的技巧
推荐文章
第一次博客作业
iOS9之后AFNetWorking的使用(详细)
CmdUtils
关于std::stringfind的返回值
HadoopHDFSBlock和InputSplits(转)
C语言:输入10个整数,找出其中绝对值最小的数
C++红黑树补充分析(基于两篇大佬的文章)
VBA程序_格式调整_针对所有工作表_取消所有行_所有列的隐藏项
FindTheMultiple
kafka常用命令总结
相关标签
jieba
nlp
三維重建
三维重建
p3p
kneip
c++
三維點雲
pcl
icp
©2018-2022Allrightsreservedbycodeleading.com
延伸文章資訊
- 1基於jieba分詞的TF-IDF提取關鍵詞算法中 - 台部落
TF-IDF的概念TF(Term Frequency,縮寫爲TF)也就是詞頻,即一個詞在文中出現的次數,統計出來就是詞頻TF,顯而易見,一個詞在文章中出現很多次, ...
- 2將使用jieba分詞的語料庫轉化成TFIDF向量 - IT人
二、使用jieba元件對分類語料庫分詞本文參考 ... corpus_tfidf.py 檔案:已分詞語料庫轉為tfidf向量執行檔案。 stopword 目錄:停用詞路徑。
- 3jieba 基于TF-IDF 算法的关键词提取| 计算机科学论坛 - LearnKu
import jieba.analyse jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=())...
- 4Python的jieba分詞及TF-IDF和TextRank 演算法提取關鍵字
基於TF-IDF演算法的關鍵詞抽取 import jieba import jieba.analyse sentence = '全國港澳研究會會長徐澤在會上發言指出,學習系列重要講話要深刻領會 ...
- 5提取關鍵字 - iT 邦幫忙
jieba.analyse.extract_tags(sentence, topK=20, withWeight=False, allowPOS=()). sentence為待提取的文本; to...