*注:此文章內(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ǔ)言處理系列一——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ǔ)言處理系列三》Java代碼實(shí)現(xiàn)TF-IDF