自然語言處理系列之TF-IDF演算法
TF-IDF演算法
TF-IDF(詞頻-逆文件頻率)演算法是一種統計方法,用以評估一字詞對於一個檔案集或一個語料庫中的其中一份檔案的重要程度。字詞的重要性隨著它在檔案中出現的次數成正比增加,但同時會隨著它在語料庫中出現的頻率成反比下降。該演算法在資料探勘、文字處理和資訊檢索等領域得到了廣泛的應用,如從一篇文章中找到它的關鍵詞。
TFIDF的主要思想是:如果某個詞或短語在一篇文章中出現的頻率TF高,並且在其他文章中很少出現,則認為此詞或者短語具有很好的類別區分能力,適合用來分類。TF-IDF實際上就是 TF*IDF,其中 TF(Term Frequency),表示詞條在文章Document 中出現的頻率;IDF(Inverse Document Frequency),其主要思想就是,如果包含某個詞 Word的文件越少,則這個詞的區分度就越大,也就是 IDF 越大。對於如何獲取一篇文章的關鍵詞,我們可以計算這邊文章出現的所有名詞的 TF-IDF,TF-IDF越大,則說明這個名詞對這篇文章的區分度就越高,取 TF-IDF 值較大的幾個詞,就可以當做這篇文章的關鍵詞。
計算步驟
計算詞頻(TF)
詞頻=某個詞在文章中的出現次數文章總次數 計算逆文件頻率(IDF)
逆文檔頻率=log語料庫的文檔總數包含該詞的文檔數+1 計算詞頻-逆文件頻率(TF-IDF)
詞頻−逆文檔頻率=詞頻∗逆文檔頻率
程式碼示例
為了建立自己的語料庫,我從網上爬了100個 url 存放在本地的 txt 檔案中,
存放格式如下:
這就相當於存放了100篇文章,即語料庫的的文件總數是100。
- TF-IDF 演算法程式碼
package com.myapp.ml.nlp;
import org.ansj.domain.Term;
import org.ansj.splitWord.analysis.ToAnalysis;
import org.ansj.util.FilterModifWord;
import org.apache.commons.lang3.StringUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* Created by lionel on 16/12/15.
*/
public class TFIDFAlgorithm {
/**
* 根據檔案路徑,檔案中存放的100個網址的 url,獲取 url 路徑列表
*
* @param path 本地檔案路徑
* @return 路徑列表
*/
public List<String> readUrlFromText(String path) {
if (StringUtils.isBlank(path)) {
return null;
}
List<String> urls = new ArrayList<String>();
try {
BufferedReader reader = new BufferedReader(new FileReader(path));
String line;
while ((line = reader.readLine()) != null) {
urls.add(line.trim());
}
} catch (IOException e) {
e.printStackTrace();
}
return urls;
}
/**
* 利用 Jsoup 工具,根據網址獲取網頁文字
*
* @param url 網址
* @return 網頁文字
*/
public String getTextFromUrl(String url) {
if (StringUtils.isBlank(url)) {
return null;
}
String text = "";
try {
Document document = Jsoup.connect(url).get();
text = document.text();
} catch (IOException e) {
e.printStackTrace();
}
return text.replace(" ", "");
}
/**
* 運用 ansj 給文字分詞
*
* @param text 文字內容
* @return 分詞結果
*/
public List<Term> parse(String text) {
if (StringUtils.isBlank(text)) {
return null;
}
List<Term> terms = FilterModifWord.modifResult(ToAnalysis.parse(text));
if (terms == null || terms.size() == 0) {
return null;
}
return terms;
}
/**
* 計算一篇文章分詞後除去標點符號後詞的總數
*
* @param terms 分詞後的集合
* @return 一篇文章分詞後除去標點符號後詞的總數
*/
private Integer countWord(List<Term> terms) {
if (terms == null || terms.size() == 0) {
return null;
}
for (int i = 0; i < terms.size(); i++) {
if ("null".equals(terms.get(i).getNatureStr()) || terms.get(i).getNatureStr().startsWith("w")) {
terms.remove(i);
}
}
return terms.size();
}
/**
* 計算詞頻 IF
*
* @param word 詞
* @param terms 分詞結果集合
* @return IF
*/
public double computeTF(String word, List<Term> terms) {
if (StringUtils.isBlank(word)) {
return 0.0;
}
int count = 0;
for (Term term : terms) {
if (term.getName().equals(word)) {
count += 1;
}
}
return (double) count / countWord(terms);
}
/**
* 統計詞語的逆文件頻率 IDF
*
* @param path 存放 url 的檔案路徑
* @param word IDF
*/
public double computeIDF(String path, String word) {
if (StringUtils.isBlank(path) || StringUtils.isBlank(word)) {
return 0.0;
}
List<String> urls = readUrlFromText(path);
int count = 1;
for (String url : urls) {
String text = getTextFromUrl(url);
if (text.contains(word)) {
count += 1;
}
}
return Math.log10((double) urls.size() / count);
}
/**
* 計算詞頻-逆文件頻率 TF—IDF
*
* @param filePath 存放url的檔案路徑
* @param terms 分詞結果集合
* @param word 詞
* @return TF—IDF
*/
public Double computeTFIDF(String filePath, List<Term> terms, String word) {
return computeTF(word, terms) * computeIDF(filePath, word);
}
}
- 測試程式碼
package com.myapp.ml.nlp;
import org.ansj.domain.Term;
import org.junit.Test;
import java.util.List;
/**
*測試詞語“語言”的 TF-IDF
* Created by lionel on 16/12/15.
*/
public class TFIDFAlgorithmTest {
@Test
public void test() {
TFIDFAlgorithm tfidfAlgorithm = new TFIDFAlgorithm();
String filePath = "/Users/lionel/PycharmProjects/python-app/com/pythonapp/spider/output.txt";
String url = "http://baike.baidu.com/item/Java/85979";
String word = "語言";
List<Term> terms = tfidfAlgorithm.parse(tfidfAlgorithm.getTextFromUrl(url));
System.out.println("[【" + word + "】詞頻 ] " + tfidfAlgorithm.computeTF(word, terms));
System.out.println("[【" + word + "】逆文件頻率 ] " + tfidfAlgorithm.computeIDF(filePath, word));
System.out.println("[【" + word + "】詞頻-逆文件頻率 ] "+tfidfAlgorithm.computeTFIDF(filePath,terms,word));
}
}
- 測試結果
本篇部落格描述的是我對 TF-IDF 演算法的理解,程式碼是對演算法過程簡單的實現,若有失偏頗,還請指出。
相關推薦
自然語言處理系列之TF-IDF演算法
TF-IDF演算法 TF-IDF(詞頻-逆文件頻率)演算法是一種統計方法,用以評估一字詞對於一個檔案集或一個語料庫中的其中一份檔案的重要程度。字詞的重要性隨著它在檔案中出現的次數成正比增加,但同時會隨著它在語料庫中出現的頻率成反比下降。該演算法在資料探勘、文字
第六章(1.3)自然語言處理實戰——使用tf-idf演算法實現簡單的文字聚類
一、原理 使用jieba切詞 用td-idf計算文字的詞頻和逆文件詞頻 排序選出最重要的2個或3個詞作為這段文字的id 具有相同id的文字被歸為一類 二、使用python實現簡單的文字聚類,其中使用了tf-idf演算法,jieba分詞,把相似的文字聚合在
自然語言處理之TF-IDF演算法
假定現在有一篇長文《中國的蜜蜂養殖》,我們準備用計算機提取它的關鍵詞。 一個容易想到的思路,就是找到出現次數最多的詞。如果某個詞很重要,它應該在這篇文章中多次出現。於是,我們進行"詞頻"(Term Frequency,縮寫為TF)統計。 結果你肯定猜到了,出現次數最多的詞是----"的"、"是"、"在"--
自然語言處理技術之HanLP介紹
自然語言處理技術 dkhadoop自然語言處理技術 這段時間一直在接觸學習hadoop方面的知識,所以說對自然語言處理技術也是做了一些了解。網絡上關於自然語言處理技術的分享文章很多,今天就給大家分享一下HanLP方面的內容。自然語言處理技術其實是所有與自然語言的計算機處理相關聯的技術的統稱,自然語言處
自然語言處理系列-1-基本應用
本文介紹自然語言處理的常見任務,使讀者在遇到實際問題時能夠找到用怎樣的工具去解決。 眾所周知,自然語言處理的目標是讓計算機理解人類文字,使計算機具備理解和推理的能力。現實任務中,用到自然語言處理技術的有如下幾個場景: 當我們新推出了一款產品,如何衡量它在市場
關鍵詞提取/關鍵字提取之TF-IDF演算法
TF-IDF(term frequency–inverse document frequency)是一種用於資訊檢索與資訊探勘的常用加權技術。TF的意思是詞頻(Term - frequency), IDF的意思是逆向檔案頻率(inverse Document frequency)。TF-IDF是一
自然語言處理系列-2-文字分類-傳統機器學習方法
文件分類是指給定文件p(可能含有標題t),將文件分類為n個類別中的一個或多個,本文以人機寫作為例子,針對有監督學習簡單介紹傳統機器學習方法。 文件分類的常見應用: 新聞分類: 也就是給新聞打標籤,一般標籤有幾千個,然後要選取k個標籤,多分類問題,可見2017知乎
自然語言處理系列-2-文字分類-深度學習-2
3. 正文與標題 文件分為正文和標題兩部分,一般兩部分分開處理,可以共享Embedding層也可以不共享,人機寫作分類問題中我們沒有共享Embedding。 3.1 正文多層CNN,未使用標題 CNN需要設定不同大小的卷積核,並且多層卷積才能較好的捕獲文字的特徵
我與語言處理 - [Today is TF-IDF] - [詞頻-逆檔案頻率]
下看一個簡單的解釋。最通俗易懂: TF-IDF 要解決的問題,如何衡量一個關鍵字在文章中的重要性 總起 TF-IDF,理解起來相當簡單,他實際上就是TF*IDF,兩個計算值的乘積,用來衡量一個詞庫中的詞對每一篇文件的重要程度。下面我們分開來講這兩個值,TF和IDF。
自然語言處理 HMM 維特比演算法(Viterbi Algorithm) 例項轉載
給大家推薦一個講解HMM比較詳細入門的內容: wiki上一個比較好的HMM例子 這是另外一個例子,結合分詞舉例的HMM: 這是詳細講解維位元演算法的系列文章,維特比演算法(Viterbi Algorithm) HMM學習最佳範例六:維特比演算法 來自52nlp
自然語言處理技術之準確率(Precision)、召回率(Recall)、F值(F-Measure)簡介
下面簡單列舉幾種常用的推薦系統評測指標: 1、準確率與召回率(Precision & Recall) 準確率和召回率是廣泛用於資訊檢索和統計學分類領域的兩個度量值,用來評價結果的質量。其中精度是檢索出相關文件數與檢索出的文件總數的比率,衡量的是檢索系統的查準
自然語言處理NLP之終極指南(Pytho…
理解和使用自然語言處理之終極指南(Python編碼)(經典收藏版12k字,附資料簡化籌員2月17日Fri新聞) 秦隴紀10譯編 12k字:理解和使用自然語言處理之終極指南(Python編碼)7k字;附資料簡化DataSimp籌收技術簡歷414字、2月17日Fri新聞四則4k字。歡迎加入共建“資
乾貨 | 自然語言處理(1)之聊一聊分詞原理
微信公眾號 關鍵字全網搜尋最新排名 【機器學習演算法】:排名第一 【機器學習】:排名第一 【Python】:排名第三 【演算法】:排名第四 前言 在做文字挖掘時,首先要做的預處理就是分詞。英文單詞天然有空格隔開容易按照空格分詞,但有時也需要把多個單詞做為一個分詞,比如一些名詞如“New York”,需要做
Hanlp自然語言處理工具之詞法分析器
本章是接前兩篇《分詞工具Hanlp基於感知機的中文分詞框架》和《基於結構化感知機的詞性標註與命名實體識別框架》的。
自然語言處理之Bag-of-words,TF-IDF模型
轉自:https://blog.csdn.net/m0_37744293/article/details/78881231 Bag-of-words,TF-IDF模型 Bag-of-words model (BoW model)忽略文字的語法和語序,用一組無序的單詞(words)來表達一段文
【自然語言處理】TF-IDF演算法提取關鍵詞
自然語言處理——TF-IDF演算法提取關鍵詞 這個標題看上去好像很複雜,其實我要談的是一個很簡單的問題。 有一篇很長的文章,我要用計算機提取它的關鍵詞(Automatic Keyphrase extraction),完全不加以人工干預,請問怎樣才能正確做到? 這個問
自然語言處理——TF-IDF演算法提取關鍵詞
這個標題看上去好像很複雜,其實我要談的是一個很簡單的問題。有一篇很長的文章,我要用計算機提取它的關鍵詞(Automatic Keyphrase extraction),完全不加以人工干預,請問怎樣才能正確做到?這個問題涉及到資料探勘、文字處理、資訊檢索等很多計算機前沿領域,但是出乎意料的是,有一個非常簡單的經
機器學習基礎——詳解自然語言處理之tf-idf
本文始發於個人公眾號:TechFlow,原創不易,求個關注 今天的文章和大家聊聊文字分析當中的一個簡單但又大名鼎鼎的演算法——TF-idf。說起來這個演算法是自然語言處理領域的重要演算法,但是因為它太有名了,以至於雖然我不是從事NLP領域的,但在面試的時候仍然被問過好幾次,可見這個演算法的重要性。 好在演算
自然語言處理--TF-IDF(關鍵詞提取)
png -m word req bsp xmlns idt 區分 適合 TF-IDF算法 TF-IDF(詞頻-逆文檔頻率)算法是一種統計方法,用以評估一字詞對於一個文件集或一個語料庫中的其中一份文件的重要程度。字詞的重要性隨著它在文件中出現的次數成正比增加,但同時會隨著它在
自然語言處理之維特比(Viterbi)演算法
維特比演算法 (Viterbi algorithm) 是機器學習中應用非常廣泛的動態規劃演算法,在求解隱馬爾科夫、條件隨機場的預測以及seq2seq模型概率計算等問題中均用到了該演算法。實際上,維特比演算法不僅是很多自然語言處理的解碼演算法,也是現代數字通訊中使用最頻繁的演