java hanlp分词_Hanlp分词实例:Java实现TFIDF算法
算法介紹
最近要做領域概念的提取,TFIDF作為一個很經典的算法可以作為其中的一步處理。
關于TFIDF算法的介紹可以參考這篇博客http://www.ruanyifeng.com/blog/2013/03/tf-idf.html。
計算公式比較簡單,如下:
預處理
由于需要處理的候選詞大約后3w+,并且語料文檔數有1w+,直接挨個文本遍歷的話很耗時,每個詞處理時間都要一分鐘以上。
為了縮短時間,首先進行分詞,一個詞輸出為一行方便統計,分詞工具選擇的是HanLp。
然后,將一個領域的文檔合并到一個文件中,并用“$$$”標識符分割,方便記錄文檔數。
下面是選擇的領域語料(PATH目錄下):
代碼實現
package edu.heu.lawsoutput;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/**
* @ClassName: TfIdf
* @Description: TODO
* @author LJH
* @date 2017年11月12日 下午3:55:15
*/
public class TfIdf {
static final String PATH = "E:\\corpus"; // 語料庫路徑
public static void main(String[] args) throws Exception {
String test = "離退休人員"; // 要計算的候選詞
computeTFIDF(PATH, test);
}
/**
* @param @param path 語料路經
* @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();
// 每個領域出現候選詞的文檔數
Map containsKeyMap = new HashMap<>();
// 每個領域的總文檔數
Map totalDocMap = new HashMap<>();
// TF = 候選詞出現次數/總詞數
Map tfMap = new HashMap<>();
// scan files
for (File f : files) {
// 候選詞詞頻
double termFrequency = 0;
// 文本總詞數
double totalTerm = 0;
// 包含候選詞的文檔數
int containsKeyDoc = 0;
// 詞頻文檔計數
int totalCount = 0;
int fileCount = 0;
// 標記文件中是否出現候選詞
boolean flag = false;
FileReader fr = new FileReader(f);
BufferedReader br = new BufferedReader(fr);
String s = "";
// 計算詞頻和總詞數
while ((s = br.readLine()) != null) {
if (s.equals(word)) {
termFrequency++;
flag = true;
}
// 文件標識符
if (s.equals("$$$")) {
if (flag) {
containsKeyDoc++;
}
fileCount++;
flag = false;
}
totalCount++;
}
// 減去文件標識符的數量得到總詞數
totalTerm += totalCount - fileCount;
br.close();
// key都為領域的名字
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("該領域文檔數:" + fileCount);
System.out.println("候選詞出現詞數:" + termFrequency);
System.out.println("總詞數:" + totalTerm);
System.out.println("出現候選詞文檔總數:" + containsKeyDoc);
System.out.println();
}
//計算TF*IDF
for (File f : files) {
// 其他領域包含候選詞文檔數
int otherContainsKeyDoc = 0;
// 其他領域文檔總數
int otherTotalDoc = 0;
double idf = 0;
double tfidf = 0;
System.out.println("~~~~~" + f.getName() + "~~~~~");
Set> containsKeyset = containsKeyMap.entrySet();
Set> totalDocset = totalDocMap.entrySet();
Set> tfSet = tfMap.entrySet();
// 計算其他領域包含候選詞文檔數
for (Map.Entry entry : containsKeyset) {
if (!entry.getKey().equals(f.getName())) {
otherContainsKeyDoc += entry.getValue();
}
}
// 計算其他領域文檔總數
for (Map.Entry entry : totalDocset) {
if (!entry.getKey().equals(f.getName())) {
otherTotalDoc += entry.getValue();
}
}
// 計算idf
idf = log((float) otherTotalDoc / (otherContainsKeyDoc + 1), 2);
// 計算tf*idf并輸出
for (Map.Entry 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));
}
}
運行結果
測試詞為“離退休人員”,中間結果如下:
最終結果:
結論
可以看到“離退休人員”在養老保險和社保領域,tfidf值比較高,可以作為判斷是否為領域概念的一個依據。當然TF-IDF算法雖然很經典,但還是有許多不足,不能單獨依賴其結果做出判斷。很多論文提出了改進方法,本文只是實現了最基本的算法。如果有其他思路和想法歡迎討論。
文章轉載自http://www.cnblogs.com/justcooooode ?沒課割綠地 的博客
Java實現TFIDF算法
算法介紹 最近要做領域概念的提取,TFIDF作為一個很經典的算法可以作為其中的一步處理. 關于TFIDF算法的介紹可以參考這篇博客http://www.ruanyifeng.com/blog/2013 ...
NLP自然語言處理中的hanlp分詞實例
本篇分享的依然是關于hanlp的分詞使用,文章內容分享自 gladosAI 的博客,本篇文章中提出了一個問題,hanlp分詞影響了實驗判斷結果.為何會如此,不妨一起學習一下 gladosAI 的這篇文 ...
Java-Runoob-高級教程-實例-方法:03. Java 實例 – 漢諾塔算法-un
ylbtech-Java-Runoob-高級教程-實例-方法:03. Java 實例 – 漢諾塔算法 1.返回頂部 1. Java 實例 - 漢諾塔算法 ?Java 實例 漢諾塔(又稱河內塔)問題是源 ...
基于結構化平均感知機的分詞器Java實現
基于結構化平均感知機的分詞器Java實現 作者:hankcs 最近高產似母豬,寫了個基于AP的中文分詞器,在Bakeoff-05的MSR語料上F值有96.11%.最重要的是,只訓練了5個迭代:包含語料 ...
吳裕雄--天生自然HADOOP操作實驗學習筆記:tf-idf算法
實驗目的 通過實驗了解tf-idf算法原理 通過實驗了解mapreduce的更多組件 學會自定義分區,讀寫緩存文件 了解mapreduce程序的設計方法 實驗原理 1.TF-IDF簡介 TF-IDF( ...
HanLP分詞命名實體提取詳解
HanLP分詞命名實體提取詳解 ? 分享一篇大神的關于hanlp分詞命名實體提取的經驗文章,文章中分享的內容略有一段時間(使用的hanlp版本比較老),最新一版的hanlp已經出來了,也可以去看看新版 ...
HanLP分詞研究
這篇文章主要是記錄HanLP標準分詞算法整個實現流程. HanLP的核心詞典訓練自人民日報2014語料,語料不是完美的,總會存在一些錯誤.這些錯誤可能會導致分詞出現奇怪的結果,這時請打開調試模式排查問 ...
hanlp分詞工具應用案例:商品圖自動推薦功能的應用
本篇分享一個hanlp分詞工具應用的案例,簡單來說就是做一圖庫,讓商家輕松方便的配置商品的圖片,最好是可以一鍵完成配置的. 先看一下效果圖吧: 商品單個推薦效果:匹配度高的放在最前面 這個想法很好,那 ...
Java常用排序算法+程序員必須掌握的8大排序算法+二分法查找法
Java?常用排序算法/程序員必須掌握的?8大排序算法 本文由網絡資料整理轉載而來,如有問題,歡迎指正! 分類: 1)插入排序(直接插入排序.希爾排序) 2)交換排序(冒泡排序.快速排序) 3)選擇排 ...
隨機推薦
python常用模塊
os模塊 os.getcwd() 獲取當前工作目錄,即當前python腳本工作的目錄路徑 os.chdir("dirname") 改變當前腳本工作目錄:相當于shell下cd os ...
js 數組,字符串,json互相轉換
數組轉字符串 var arr = [1,2,3,4,'巴德','merge']; var str = arr.join(','); console.log(str); // 1,2,3,4,巴德,me ...
iOS - 發送郵件
IOS系統框架提供的兩種發送Email的方法:openURL 和 MFMailComposeViewController.借助這兩個方法,我們可以輕松的在應用里加入如用戶反饋這類需要發送郵件的功能. ...
OGRE插件設計-Texture與GLTexture
背景: 學習OGRE,在OGRE中 Core是最小的精簡邏輯集合,而真正的功能則需要插件來實現,但是作為插件應該與Core保持最小的連接,同時Core不會調用插件的接口,而動態鏈接庫又不能直接把類連接 ...
paip.tree 生成目錄樹到txt后的折疊查看
paip.tree 生成目錄樹到txt后的折疊查看 作者Attilax , ?EMAIL:1466519819@qq.com? 來源:attilax的專欄 地址:http://blog.csdn.ne ...
Jmeter 新手
轉載:http://www.cnblogs.com/TankXiao/p/4059378.html 什么是壓力測試 顧名思義:壓力測試,就是 ?被測試的系統,在一定的訪問壓力下,看程序運行是否穩定/服 ...
PN結加正向偏置電壓 其空間電荷區為何變窄
理論基礎:導體是內部具有較多可以自由移動的電荷的物體. 絕緣體是內部沒有或者有很少可以自由移動的電荷的物體. +代表空穴帶正電 -代表電子帶負電 兩豎線之間表示無自由移動電子或空穴部分,相當于絕緣體 ...
CSS中默認被繼承的屬性
在CSS中,所有屬性都可以被繼承,只需要顯式的設置屬性值為inherit即可.如果不設置該屬性,CSS大部分屬性默認不會從父元素繼承而是設置初始值(initial value),但是有一部分屬性,默認 ...
Your branch is ahead of &#39;origin/master&#39; by 2 commits.
遇到這種問題,表示在你之前已經有2個commit而沒有push到遠程分支上,所以需要先git push origin **將本地分支提到遠程倉庫.也可以直接git reset --hard HEAD~ ...
[SDOI2015] 尋寶游戲
傳送門:>Here< 題意:給出一棵樹(有邊權),剛開始鍵值全部為0.每次對其中一個鍵值進行異或,問每一次修改之后:選擇任意一個點出發走到所有為1的點再走回來的最短路 解題思路 由于N,M ...
總結
以上是生活随笔為你收集整理的java hanlp分词_Hanlp分词实例:Java实现TFIDF算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 利用Spring Cloud实现微服务-
- 下一篇: java 代码scope注解_Sprin