自然語(yǔ)言處理系列二》Java代碼實(shí)現(xiàn)TF-IDF

*注:此文章內(nèi)容均節(jié)選自充電了么創(chuàng)始人,CEO兼CTO陳敬雷老師的新書《分布式機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》(人工智能科學(xué)與技術(shù)叢書)【陳敬雷編著】【清華大學(xué)出版社】

自然語(yǔ)言處理系列二

詞頻-逆文檔頻率(TF-IDF)

TF-IDF是Term Frequency - Inverse Document Frequency的縮寫钝域,即“詞頻-逆文本頻率”释牺。它由兩部分組成罪针,TF和IDF。前面的TF也就是我們前面說(shuō)到的詞頻师崎,我們之前做的向量化也就是做了文本中各個(gè)詞的出現(xiàn)頻率統(tǒng)計(jì)拂酣,并作為文本特征,這個(gè)很好理解比原。關(guān)鍵是后面的這個(gè)IDF插佛,即“逆文本頻率”如何理解。在上一節(jié)中量窘,我們講到幾乎所有文本都會(huì)出現(xiàn)的"to"其詞頻雖然高雇寇,但是重要性卻應(yīng)該比詞頻低的"China"和“Travel”要低。我們的IDF就是來(lái)幫助我們來(lái)反應(yīng)這個(gè)詞的重要性的蚌铜,進(jìn)而修正僅僅用詞頻表示的詞特征值锨侯。概括來(lái)講, IDF反應(yīng)了一個(gè)詞在所有文本中出現(xiàn)的頻率冬殃,如果一個(gè)詞在很多的文本中出現(xiàn)囚痴,那么它的IDF值應(yīng)該低,比如上文中的“to”审葬。而反過(guò)來(lái)如果一個(gè)詞在比較少的文本中出現(xiàn)深滚,那么它的IDF值應(yīng)該高。比如一些專業(yè)的名詞如“Machine Learning”涣觉。這樣的詞IDF值應(yīng)該高成箫。一個(gè)極端的情況,如果一個(gè)詞在所有的文本中都出現(xiàn)旨枯,那么它的IDF值應(yīng)該為0。

之前我們已經(jīng)介紹過(guò)TF-IDF算法原理

自然語(yǔ)言處理系列一——TF-IDF算法原理

自然語(yǔ)言處理系列一——Java代碼實(shí)現(xiàn)TFIDF

Java代碼實(shí)現(xiàn)TFIDF》

TF-IDF基于Java代碼如下所示:

package com.chongdianleme.job;

import java.io.BufferedReader;

import java.io.File;

import java.io.FileReader;

import java.util.HashMap;

import java.util.Map;

import java.util.Set;

/**

* Created by 充電了么App - 陳敬雷

* 充電了么App官網(wǎng):http://chongdianleme.com/

* 充電了么App - 專注上班族職業(yè)技能提升充電學(xué)習(xí)的在線教育平臺(tái)

* 詞頻-逆文檔頻率(TF-IDF)

*/

public class TfIdfDemo {

? ? public static void main(String[] args) throws Exception {

? ? ? ? String str = "充電了么App"; // 要計(jì)算的候選詞

? ? ? ? String path = "D:\\充電了么TFIDF"; // 語(yǔ)料庫(kù)路徑

? ? ? ? computeTFIDF(path, str);

? ? }

? ? /**

? ? * @param @param path 語(yǔ)料路經(jīng)

? ? * @param @param word 候選詞

? ? * @param @throws Exception

? ? * @return void

? ? */

? ? static void computeTFIDF(String path, String word) throws Exception {

? ? ? ? File fileDir = new File(path);

? ? ? ? File[] files = fileDir.listFiles();

? ? ? ? // 每個(gè)領(lǐng)域出現(xiàn)候選詞的文檔數(shù)

? ? ? ? Map<String, Integer> containsKeyMap = new HashMap<>();

? ? ? ? // 每個(gè)領(lǐng)域的總文檔數(shù)

? ? ? ? Map<String, Integer> totalDocMap = new HashMap<>();

? ? ? ? // TF = 候選詞出現(xiàn)次數(shù)/總詞數(shù)

? ? ? ? Map<String, Double> tfMap = new HashMap<>();

? ? ? ? // 掃描目錄下的文件

? ? ? ? for (File f : files) {

? ? ? ? ? ? // 候選詞詞頻

? ? ? ? ? ? double termFrequency = 0;

? ? ? ? ? ? // 文本總詞數(shù)

? ? ? ? ? ? double totalTerm = 0;

? ? ? ? ? ? // 包含候選詞的文檔數(shù)

? ? ? ? ? ? int containsKeyDoc = 0;

? ? ? ? ? ? // 詞頻文檔計(jì)數(shù)

? ? ? ? ? ? int totalCount = 0;

? ? ? ? ? ? int fileCount = 0;

? ? ? ? ? ? // 標(biāo)記文件中是否出現(xiàn)候選詞

? ? ? ? ? ? boolean flag = false;

? ? ? ? ? ? FileReader fr = new FileReader(f);

? ? ? ? ? ? BufferedReader br = new BufferedReader(fr);

? ? ? ? ? ? String s = "";

? ? ? ? ? ? // 計(jì)算詞頻和總詞數(shù)

? ? ? ? ? ? while ((s = br.readLine()) != null) {

? ? ? ? ? ? ? ? if (s.equals(word)) {

? ? ? ? ? ? ? ? ? ? termFrequency++;

? ? ? ? ? ? ? ? ? ? flag = true;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? // 文件標(biāo)識(shí)符

? ? ? ? ? ? ? ? if (s.equals("$$$")) {

? ? ? ? ? ? ? ? ? ? if (flag) {

? ? ? ? ? ? ? ? ? ? ? ? containsKeyDoc++;

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? fileCount++;

? ? ? ? ? ? ? ? ? ? flag = false;

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? totalCount++;

? ? ? ? ? ? }

? ? ? ? ? ? // 減去文件標(biāo)識(shí)符的數(shù)量得到總詞數(shù)

? ? ? ? ? ? totalTerm += totalCount - fileCount;

? ? ? ? ? ? br.close();

? ? ? ? ? ? // key都為領(lǐng)域的名字

? ? ? ? ? ? containsKeyMap.put(f.getName(), containsKeyDoc);

? ? ? ? ? ? totalDocMap.put(f.getName(), fileCount);

? ? ? ? ? ? tfMap.put(f.getName(), (double) termFrequency / totalTerm);

? ? ? ? ? ? System.out.println("----------" + f.getName() + "----------");

? ? ? ? ? ? System.out.println("該領(lǐng)域文檔數(shù):" + fileCount);

? ? ? ? ? ? System.out.println("候選詞出現(xiàn)詞數(shù):" + termFrequency);

? ? ? ? ? ? System.out.println("總詞數(shù):" + totalTerm);

? ? ? ? ? ? System.out.println("出現(xiàn)候選詞文檔總數(shù):" + containsKeyDoc);

? ? ? ? ? ? System.out.println();

? ? ? ? }

? ? ? ? //計(jì)算TF*IDF

? ? ? ? for (File f : files) {

? ? ? ? ? ? // 其他領(lǐng)域包含候選詞文檔數(shù)

? ? ? ? ? ? int otherContainsKeyDoc = 0;

? ? ? ? ? ? // 其他領(lǐng)域文檔總數(shù)

? ? ? ? ? ? int otherTotalDoc = 0;

? ? ? ? ? ? double idf = 0;

? ? ? ? ? ? double tfidf = 0;

? ? ? ? ? ? System.out.println("~~~~~" + f.getName() + "~~~~~");

? ? ? ? ? ? Set<Map.Entry<String, Integer>> containsKeyset = containsKeyMap.entrySet();

? ? ? ? ? ? Set<Map.Entry<String, Integer>> totalDocset = totalDocMap.entrySet();

? ? ? ? ? ? Set<Map.Entry<String, Double>> tfSet = tfMap.entrySet();

? ? ? ? ? ? // 計(jì)算其他領(lǐng)域包含候選詞文檔數(shù)

? ? ? ? ? ? for (Map.Entry<String, Integer> entry : containsKeyset) {

? ? ? ? ? ? ? ? if (!entry.getKey().equals(f.getName())) {

? ? ? ? ? ? ? ? ? ? otherContainsKeyDoc += entry.getValue();

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? ? ? // 計(jì)算其他領(lǐng)域文檔總數(shù)

? ? ? ? ? ? for (Map.Entry<String, Integer> entry : totalDocset) {

? ? ? ? ? ? ? ? if (!entry.getKey().equals(f.getName())) {

? ? ? ? ? ? ? ? ? ? otherTotalDoc += entry.getValue();

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? ? ? // 計(jì)算idf

? ? ? ? ? ? idf = log((float) otherTotalDoc / (otherContainsKeyDoc + 1), 2);

? ? ? ? ? ? // 計(jì)算tf*idf并輸出

? ? ? ? ? ? for (Map.Entry<String, Double> entry : tfSet) {

? ? ? ? ? ? ? ? if (entry.getKey().equals(f.getName())) {

? ? ? ? ? ? ? ? ? ? tfidf = (double) entry.getValue() * idf;

? ? ? ? ? ? ? ? ? ? System.out.println("tfidf:" + tfidf);

? ? ? ? ? ? ? ? }

? ? ? ? ? ? }

? ? ? ? }

? ? }

? ? static float log(float value, float base) {

? ? ? ? return (float) (Math.log(value) / Math.log(base));

? ? }

}

總結(jié)

此文章有對(duì)應(yīng)的配套視頻混驰,其它更多精彩文章請(qǐng)大家下載充電了么app攀隔,可獲取千萬(wàn)免費(fèi)好課和文章,配套新書教材請(qǐng)看陳敬雷新書:《分布式機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》(人工智能科學(xué)與技術(shù)叢書)

【新書介紹】

《分布式機(jī)器學(xué)習(xí)實(shí)戰(zhàn)(人工智能科學(xué)與技術(shù)叢書)》(陳敬雷)【摘要 書評(píng) 試讀】- 京東圖書

新書特色:深入淺出栖榨,逐步講解分布式機(jī)器學(xué)習(xí)的框架及應(yīng)用配套個(gè)性化推薦算法系統(tǒng)昆汹、人臉識(shí)別、對(duì)話機(jī)器人等實(shí)戰(zhàn)項(xiàng)目

【新書介紹視頻】

分布式機(jī)器學(xué)習(xí)實(shí)戰(zhàn)(人工智能科學(xué)與技術(shù)叢書)新書【陳敬雷】-學(xué)習(xí)視頻教程-騰訊課堂

視頻特色:重點(diǎn)對(duì)新書進(jìn)行介紹婴栽,最新前沿技術(shù)熱點(diǎn)剖析满粗,技術(shù)職業(yè)規(guī)劃建議!聽完此課你對(duì)人工智能領(lǐng)域?qū)⒂幸粋€(gè)嶄新的技術(shù)視野愚争!職業(yè)發(fā)展也將有更加清晰的認(rèn)識(shí)映皆!

【精品課程】

《分布式機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》大數(shù)據(jù)人工智能AI專家級(jí)精品課程-學(xué)習(xí)視頻教程-騰訊課堂

【免費(fèi)體驗(yàn)視頻】:

人工智能百萬(wàn)年薪成長(zhǎng)路線/從Python到最新熱點(diǎn)技術(shù)_騰訊課堂

從Python編程零基礎(chǔ)小白入門到人工智能高級(jí)實(shí)戰(zhàn)系列課_騰訊課堂

視頻特色: 本系列專家級(jí)精品課有對(duì)應(yīng)的配套書籍《分布式機(jī)器學(xué)習(xí)實(shí)戰(zhàn)》挤聘,精品課和書籍可以互補(bǔ)式學(xué)習(xí),彼此相互補(bǔ)充捅彻,大大提高了學(xué)習(xí)效率组去。本系列課和書籍是以分布式機(jī)器學(xué)習(xí)為主線,并對(duì)其依賴的大數(shù)據(jù)技術(shù)做了詳細(xì)介紹步淹,之后對(duì)目前主流的分布式機(jī)器學(xué)習(xí)框架和算法進(jìn)行重點(diǎn)講解从隆,本系列課和書籍側(cè)重實(shí)戰(zhàn),最后講幾個(gè)工業(yè)級(jí)的系統(tǒng)實(shí)戰(zhàn)項(xiàng)目給大家缭裆。 課程核心內(nèi)容有互聯(lián)網(wǎng)公司大數(shù)據(jù)和人工智能那些事键闺、大數(shù)據(jù)算法系統(tǒng)架構(gòu)、大數(shù)據(jù)基礎(chǔ)澈驼、Python編程辛燥、Java編程、Scala編程盅藻、Docker容器购桑、Mahout分布式機(jī)器學(xué)習(xí)平臺(tái)、Spark分布式機(jī)器學(xué)習(xí)平臺(tái)氏淑、分布式深度學(xué)習(xí)框架和神經(jīng)網(wǎng)絡(luò)算法勃蜘、自然語(yǔ)言處理算法、工業(yè)級(jí)完整系統(tǒng)實(shí)戰(zhàn)(推薦算法系統(tǒng)實(shí)戰(zhàn)假残、人臉識(shí)別實(shí)戰(zhàn)缭贡、對(duì)話機(jī)器人實(shí)戰(zhàn))、就業(yè)/面試技巧/職業(yè)生涯規(guī)劃/職業(yè)晉升指導(dǎo)等內(nèi)容辉懒。

【充電了么公司介紹】

充電了么App是專注上班族職業(yè)培訓(xùn)充電學(xué)習(xí)的在線教育平臺(tái)阳惹。

專注工作職業(yè)技能提升和學(xué)習(xí),提高工作效率眶俩,帶來(lái)經(jīng)濟(jì)效益莹汤!今天你充電了么?

充電了么官網(wǎng):

【充電了么app官網(wǎng)】充電了么 - 上班族充電學(xué)習(xí)的在線教育平臺(tái)颠印,今天你充電了么纲岭?

充電了么App官網(wǎng)下載地址:

充電了么

功能特色如下:

【全行業(yè)職位】 - 專注職場(chǎng)上班族職業(yè)技能提升

覆蓋所有行業(yè)和職位,不管你是上班族线罕,高管止潮,還是創(chuàng)業(yè)都有你要學(xué)習(xí)的視頻和文章。其中大數(shù)據(jù)智能AI钞楼、區(qū)塊鏈喇闸、深度學(xué)習(xí)是互聯(lián)網(wǎng)一線工業(yè)級(jí)的實(shí)戰(zhàn)經(jīng)驗(yàn)。

除了專業(yè)技能學(xué)習(xí),還有通用職場(chǎng)技能燃乍,比如企業(yè)管理唆樊、股權(quán)激勵(lì)和設(shè)計(jì)、職業(yè)生涯規(guī)劃橘沥、社交禮儀窗轩、溝通技巧、演講技巧座咆、開會(huì)技巧痢艺、發(fā)郵件技巧、工作壓力如何放松介陶、人脈關(guān)系等等堤舒,全方位提高你的專業(yè)水平和整體素質(zhì)。

【牛人課堂】 - 學(xué)習(xí)牛人的工作經(jīng)驗(yàn)

1.智能個(gè)性化引擎:

海量視頻課程哺呜,覆蓋所有行業(yè)舌缤、所有職位,通過(guò)不同行業(yè)職位的技能詞偏好挖掘分析某残,智能匹配你目前職位最感興趣的技能學(xué)習(xí)課程国撵。

2.聽課全網(wǎng)搜索

輸入關(guān)鍵詞搜索海量視頻課程,應(yīng)有盡有玻墅,總有適合你的課程介牙。

3.聽課播放詳情

視頻播放詳情,除了播放當(dāng)前視頻澳厢,更有相關(guān)視頻課程和文章閱讀环础,對(duì)某個(gè)技能知識(shí)點(diǎn)強(qiáng)化,讓你輕松成為某個(gè)領(lǐng)域的資深專家剩拢。

【精品閱讀】 - 技能文章興趣閱讀

1.個(gè)性化閱讀引擎:

千萬(wàn)級(jí)文章閱讀线得,覆蓋所有行業(yè)、所有職位徐伐,通過(guò)不同行業(yè)職位的技能詞偏好挖掘分析贯钩,智能匹配你目前職位最感興趣的技能學(xué)習(xí)文章。

2.閱讀全網(wǎng)搜索

輸入關(guān)鍵詞搜索海量文章閱讀办素,應(yīng)有盡有魏保,總有你感興趣的技能學(xué)習(xí)文章。

【機(jī)器人老師】 - 個(gè)人提升趣味學(xué)習(xí)

基于搜索引擎和智能深度學(xué)習(xí)訓(xùn)練摸屠,為您打造更懂你的機(jī)器人老師,用自然語(yǔ)言和機(jī)器人老師聊天學(xué)習(xí)粱哼,寓教于樂(lè)季二,高效學(xué)習(xí),快樂(lè)人生。

【精短課程】 - 高效學(xué)習(xí)知識(shí)

海量精短牛人課程胯舷,滿足你的時(shí)間碎片化學(xué)習(xí)刻蚯,快速提高某個(gè)技能知識(shí)點(diǎn)。

上一篇:自然語(yǔ)言處理系列一》TF-IDF算法原理

下一篇:自然語(yǔ)言處理系列三》Java代碼實(shí)現(xiàn)TF-IDF

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末桑嘶,一起剝皮案震驚了整個(gè)濱河市炊汹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌逃顶,老刑警劉巖讨便,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異以政,居然都是意外死亡霸褒,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門盈蛮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)废菱,“玉大人,你說(shuō)我怎么就攤上這事抖誉∈庵幔” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵袒炉,是天一觀的道長(zhǎng)旁理。 經(jīng)常有香客問(wèn)我,道長(zhǎng)梳杏,這世上最難降的妖魔是什么韧拒? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮十性,結(jié)果婚禮上叛溢,老公的妹妹穿的比我還像新娘。我一直安慰自己劲适,他們只是感情好楷掉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著霞势,像睡著了一般烹植。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上愕贡,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天草雕,我揣著相機(jī)與錄音,去河邊找鬼固以。 笑死墩虹,一個(gè)胖子當(dāng)著我的面吹牛嘱巾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播诫钓,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼旬昭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了菌湃?” 一聲冷哼從身側(cè)響起问拘,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎惧所,沒(méi)想到半個(gè)月后骤坐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纯路,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年或油,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片驰唬。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡顶岸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出叫编,到底是詐尸還是另有隱情辖佣,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布搓逾,位于F島的核電站卷谈,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏霞篡。R本人自食惡果不足惜世蔗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望朗兵。 院中可真熱鬧污淋,春花似錦、人聲如沸余掖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)盐欺。三九已至赁豆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間冗美,已是汗流浹背魔种。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留粉洼,地道東北人务嫡。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓甲抖,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親心铃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容