
TF: 詞頻(Term Frequency)
IDF: 逆文本頻率指數(shù)(Inverse Document Frequency)
TF-IDF(term frequency–inverse document frequency)是一種用于信息檢索與數(shù)據(jù)挖掘的常用加權(quán)技術(shù)。
信息檢索概述
信息檢索是當(dāng)前應(yīng)用十分廣泛的一種技術(shù),論文檢索、搜索引擎都屬于信息檢索的范疇。
通常,人們把信息檢索問題抽象為:
在文檔集合D上,對于由關(guān)鍵詞w[1] … w[k]組成的查詢串q,返回一個按查詢q和文檔d匹配度 relevance (q, d)排序的相關(guān)文檔列表D’。
對于這一基問題,先后出現(xiàn)了布爾模型、向量模型等各種經(jīng)典的信息檢索模型,它們從不同的角度提出了自己的一套解決方案。
布爾模型以集合的布爾運算為基礎(chǔ),查詢效率高,但模型過于簡單,無法有效地對不同文檔進(jìn)行排序,查詢效果不佳。
向量模型把文檔和查詢串都視為詞所構(gòu)成的多維向量,而文檔與查詢的相關(guān)性即對應(yīng)于向量間的夾角。不過,由于通常詞的數(shù)量巨大,向量維度非常高,而大量的維度都是0,計算向量夾角的效果并不好。另外,龐大的計算量也使得向量模型幾乎不具有在互聯(lián)網(wǎng)搜索引擎這樣海量數(shù)據(jù)集上實施的可行性。
tf-idf 模型
當(dāng)前,真正在搜索引擎等實際應(yīng)用中廣泛使用的是 tf-idf 模型。tf-idf 模型的主要思想是:如果詞w在一篇文檔d中出現(xiàn)的頻率高,并且在其他文檔中很少出現(xiàn),則認(rèn)為詞w具有很好的區(qū)分能力,適合用來把文章d和其他文章區(qū)分開來。
算法
第一步,計算詞頻。

考慮到文章有長短之分,為了便于不同文章的比較,進(jìn)行"詞頻"標(biāo)準(zhǔn)化。

或者

第二步,計算逆文檔頻率。
這時,需要一個語料庫(corpus),用來模擬語言的使用環(huán)境。

如果一個詞越常見,那么分母就越大,逆文檔頻率就越小越接近0。分母之所以要加1,是為了避免分母為0(即所有文檔都不包含該詞)。log表示對得到的值取對數(shù)。
第三步,計算TF-IDF。

可以看到,TF-IDF與一個詞在文檔中的出現(xiàn)次數(shù)成正比,與該詞在整個語言中的出現(xiàn)次數(shù)成反比。所以,自動提取關(guān)鍵詞的算法就很清楚了,就是計算出文檔的每個詞的TF-IDF值,然后按降序排列,取排在最前面的幾個詞。
TF-IDF 的歷史
把查詢關(guān)鍵字(Query)和文檔(Document)都轉(zhuǎn)換成 “向量”,并且嘗試用線性代數(shù)等數(shù)學(xué)工具來解決信息檢索問題,這樣的努力至少可以追溯到 20 世紀(jì) 70 年代。
1971 年,美國康奈爾大學(xué)教授杰拉德 · 索爾頓(Gerard Salton)發(fā)表了《SMART 檢索系統(tǒng):自動文檔處理實驗》(The SMART Retrieval System—Experiments in Automatic Document Processing)一文,文中首次提到了把查詢關(guān)鍵字和文檔都轉(zhuǎn)換成 “向量”,并且給這些向量中的元素賦予不同的值。這篇論文中描述的 SMART 檢索系統(tǒng),特別是其中對 TF-IDF 及其變種的描述成了后續(xù)很多工業(yè)級系統(tǒng)的重要參考。
1972 年,英國的計算機(jī)科學(xué)家卡倫 · 瓊斯(Karen Sp?rck Jones)在《從統(tǒng)計的觀點看詞的特殊性及其在文檔檢索中的應(yīng)用》(A Statistical Interpretation of Term Specificity and Its Application in Retrieval) 一文中第一次詳細(xì)地闡述了 IDF 的應(yīng)用。其后卡倫又在《檢索目錄中的詞賦值權(quán)重》(Index Term Weighting)一文中對 TF 和 IDF 的結(jié)合進(jìn)行了論述。可以說,卡倫是第一位從理論上對 TF-IDF 進(jìn)行完整論證的計算機(jī)科學(xué)家,因此后世也有很多人把 TF-IDF 的發(fā)明歸結(jié)于卡倫。
杰拉德本人被認(rèn)為是 “信息檢索之父”。他 1927 年出生于德國的紐倫堡,并與 1950 年和 1952 年先后從紐約的布魯克林學(xué)院獲得數(shù)學(xué)學(xué)士和碩士學(xué)位,1958 年從哈佛大學(xué)獲得應(yīng)用數(shù)學(xué)博士學(xué)位,之后來到康奈爾大學(xué)參與組建計算機(jī)系。為了致敬杰拉德本人對現(xiàn)代信息檢索技術(shù)的卓越貢獻(xiàn),現(xiàn)在,美國計算機(jī)協(xié)會 ACM(Association of Computing Machinery)每三年頒發(fā)一次“杰拉德 · 索爾頓獎”(Gerard Salton Award),用于表彰對信息檢索技術(shù)有突出貢獻(xiàn)的研究人員??▊?· 瓊斯在 1988 年獲得了第二屆“杰拉德 · 索爾頓獎” 的殊榮。
參考資料
1.https://baike.baidu.com/item/tf-idf/8816134?fr=aladdin
2.https://towardsdatascience.com/tf-term-frequency-idf-inverse-document-frequency-from-scratch-in-python-6c2b61b78558
3.http://www.ruanyifeng.com/blog/2013/03/tf-idf.html
Kotlin開發(fā)者社區(qū)

專注分享 Java、 Kotlin、Spring/Spring Boot、MySQL、redis、neo4j、NoSQL、Android、JavaScript、React、Node、函數(shù)式編程、編程思想、"高可用,高性能,高實時"大型分布式系統(tǒng)架構(gòu)設(shè)計主題。
High availability, high performance, high real-time large-scale distributed system architecture design。
分布式框架:Zookeeper、分布式中間件框架等
分布式存儲:GridFS、FastDFS、TFS、MemCache、redis等
分布式數(shù)據(jù)庫:Cobar、tddl、Amoeba、Mycat
云計算、大數(shù)據(jù)、AI算法
虛擬化、云原生技術(shù)
分布式計算框架:MapReduce、Hadoop、Storm、Flink等
分布式通信機(jī)制:Dubbo、RPC調(diào)用、共享遠(yuǎn)程數(shù)據(jù)、消息隊列等
消息隊列MQ:Kafka、MetaQ,RocketMQ
怎樣打造高可用系統(tǒng):基于硬件、軟件中間件、系統(tǒng)架構(gòu)等一些典型方案的實現(xiàn):HAProxy、基于Corosync+Pacemaker的高可用集群套件中間件系統(tǒng)
Mycat架構(gòu)分布式演進(jìn)
大數(shù)據(jù)Join背后的難題:數(shù)據(jù)、網(wǎng)絡(luò)、內(nèi)存和計算能力的矛盾和調(diào)和
Java分布式系統(tǒng)中的高性能難題:AIO,NIO,Netty還是自己開發(fā)框架?
高性能事件派發(fā)機(jī)制:線程池模型、Disruptor模型等等。。。
合抱之木,生于毫末;九層之臺,起于壘土;千里之行,始于足下。不積跬步,無以至千里;不積小流,無以成江河。

Kotlin 簡介
Kotlin是一門非研究性的語言,它是一門非常務(wù)實的工業(yè)級編程語言,它的使命就是幫助程序員們解決實際工程實踐中的問題。使用Kotlin 讓 Java程序員們的生活變得更好,Java中的那些空指針錯誤,浪費時間的冗長的樣板代碼,啰嗦的語法限制等等,在Kotlin中統(tǒng)統(tǒng)消失。Kotlin 簡單務(wù)實,語法簡潔而強(qiáng)大,安全且表達(dá)力強(qiáng),極富生產(chǎn)力。
Java誕生于1995年,至今已有23年歷史。當(dāng)前最新版本是 Java 9。在 JVM 生態(tài)不斷發(fā)展繁榮的過程中,也誕生了Scala、Groovy、Clojure 等兄弟語言。
Kotlin 也正是 JVM 家族中的優(yōu)秀一員。Kotlin是一種現(xiàn)代語言(版本1.0于2016年2月發(fā)布)。它最初的目的是像Scala那樣,優(yōu)化Java語言的缺陷,提供更加簡單實用的編程語言特性,并且解決了性能上的問題,比如編譯時間。 JetBrains在這些方面做得非常出色。
Kotlin語言的特性
用 Java 開發(fā)多年以后,能夠嘗試一些新的東西真是太棒了。如果您是 Java 開發(fā)人員,使用 Kotlin 將會非常自然流暢。如果你是一個Swift開發(fā)者,你將會感到似曾相識,比如可空性(Nullability)。 Kotlin語言的特性有:
1.簡潔
大幅減少樣板代碼量。
2.與Java的100%互操作性
Kotlin可以直接與Java類交互,反之亦然。這個特性使得我們可以直接重用我們的代碼庫,并將其遷移到 Kotlin中。由于Java的互操作性幾乎無處不在。我們可以直接訪問平臺API以及現(xiàn)有的代碼庫,同時仍然享受和使用 Kotlin 的所有強(qiáng)大的現(xiàn)代語言功能。
3.擴(kuò)展函數(shù)
Kotlin 類似于 C# 和 Gosu, 它提供了為現(xiàn)有類提供新功能擴(kuò)展的能力,而不必從該類繼承或使用任何類型的設(shè)計模式 (如裝飾器模式)。
4.函數(shù)式編程
Kotlin 語言一等支持函數(shù)式編程,就像Scala一樣。具備高階函數(shù)、Lambda 表達(dá)式等函數(shù)式基本特性。
5.默認(rèn)和命名參數(shù)
在Kotlin中,您可以為函數(shù)中的參數(shù)設(shè)置一個默認(rèn)值,并給每個參數(shù)一個名稱。這有助于編寫易讀的代碼。
6.強(qiáng)大的開發(fā)工具支持
而由于是JetBrains出品,我們擁有很棒的IDE支持。雖然Java到Kotlin的自動轉(zhuǎn)換并不是100% OK 的,但它確實是一個非常好的工具。使用 IDEA 的工具轉(zhuǎn)換Java代碼為 Kotlin 代碼時,可以輕松地重用60%-70%的結(jié)果代碼,而且修改成本很小。
Kotlin 除了簡潔強(qiáng)大的語法特性外,還有實用性非常強(qiáng)的API以及圍繞它構(gòu)建的生態(tài)系統(tǒng)。例如:集合類 API、IO 擴(kuò)展類、反射API 等。同時 Kotlin 社區(qū)也提供了豐富的文檔和大量的學(xué)習(xí)資料,還有在線REPL。
A modern programming language that makes developers happier. Open source forever


