日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

java hanlp分词_Hanlp分词实例:Java实现TFIDF算法

發(fā)布時(shí)間:2023/12/15 java 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java hanlp分词_Hanlp分词实例:Java实现TFIDF算法 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

算法介紹

最近要做領(lǐng)域概念的提取,TFIDF作為一個(gè)很經(jīng)典的算法可以作為其中的一步處理。

關(guān)于TFIDF算法的介紹可以參考這篇博客http://www.ruanyifeng.com/blog/2013/03/tf-idf.html。

計(jì)算公式比較簡單,如下:

預(yù)處理

由于需要處理的候選詞大約后3w+,并且語料文檔數(shù)有1w+,直接挨個(gè)文本遍歷的話很耗時(shí),每個(gè)詞處理時(shí)間都要一分鐘以上。

為了縮短時(shí)間,首先進(jìn)行分詞,一個(gè)詞輸出為一行方便統(tǒng)計(jì),分詞工具選擇的是HanLp。

然后,將一個(gè)領(lǐng)域的文檔合并到一個(gè)文件中,并用“$$$”標(biāo)識符分割,方便記錄文檔數(shù)。

下面是選擇的領(lǐng)域語料(PATH目錄下):

代碼實(shí)現(xiàn)

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 = "離退休人員"; // 要計(jì)算的候選詞

computeTFIDF(PATH, test);

}

/**

* @param @param path 語料路經(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 containsKeyMap = new HashMap<>();

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

Map totalDocMap = new HashMap<>();

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

Map tfMap = new HashMap<>();

// scan files

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)識符

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

if (flag) {

containsKeyDoc++;

}

fileCount++;

flag = false;

}

totalCount++;

}

// 減去文件標(biāo)識符的數(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> containsKeyset = containsKeyMap.entrySet();

Set> totalDocset = totalDocMap.entrySet();

Set> tfSet = tfMap.entrySet();

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

for (Map.Entry entry : containsKeyset) {

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

otherContainsKeyDoc += entry.getValue();

}

}

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

for (Map.Entry 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 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));

}

}

運(yùn)行結(jié)果

測試詞為“離退休人員”,中間結(jié)果如下:

最終結(jié)果:

結(jié)論

可以看到“離退休人員”在養(yǎng)老保險(xiǎn)和社保領(lǐng)域,tfidf值比較高,可以作為判斷是否為領(lǐng)域概念的一個(gè)依據(jù)。當(dāng)然TF-IDF算法雖然很經(jīng)典,但還是有許多不足,不能單獨(dú)依賴其結(jié)果做出判斷。很多論文提出了改進(jìn)方法,本文只是實(shí)現(xiàn)了最基本的算法。如果有其他思路和想法歡迎討論。

文章轉(zhuǎn)載自http://www.cnblogs.com/justcooooode ?沒課割綠地 的博客

Java實(shí)現(xiàn)TFIDF算法

算法介紹 最近要做領(lǐng)域概念的提取,TFIDF作為一個(gè)很經(jīng)典的算法可以作為其中的一步處理. 關(guān)于TFIDF算法的介紹可以參考這篇博客http://www.ruanyifeng.com/blog/2013 ...

NLP自然語言處理中的hanlp分詞實(shí)例

本篇分享的依然是關(guān)于hanlp的分詞使用,文章內(nèi)容分享自 gladosAI 的博客,本篇文章中提出了一個(gè)問題,hanlp分詞影響了實(shí)驗(yàn)判斷結(jié)果.為何會(huì)如此,不妨一起學(xué)習(xí)一下 gladosAI 的這篇文 ...

Java-Runoob-高級教程-實(shí)例-方法:03&period; Java 實(shí)例 – 漢諾塔算法-un

ylbtech-Java-Runoob-高級教程-實(shí)例-方法:03. Java 實(shí)例 – 漢諾塔算法 1.返回頂部 1. Java 實(shí)例 - 漢諾塔算法 ?Java 實(shí)例 漢諾塔(又稱河內(nèi)塔)問題是源 ...

基于結(jié)構(gòu)化平均感知機(jī)的分詞器Java實(shí)現(xiàn)

基于結(jié)構(gòu)化平均感知機(jī)的分詞器Java實(shí)現(xiàn) 作者:hankcs 最近高產(chǎn)似母豬,寫了個(gè)基于AP的中文分詞器,在Bakeoff-05的MSR語料上F值有96.11%.最重要的是,只訓(xùn)練了5個(gè)迭代:包含語料 ...

吳裕雄--天生自然HADOOP操作實(shí)驗(yàn)學(xué)習(xí)筆記:tf-idf算法

實(shí)驗(yàn)?zāi)康?通過實(shí)驗(yàn)了解tf-idf算法原理 通過實(shí)驗(yàn)了解mapreduce的更多組件 學(xué)會(huì)自定義分區(qū),讀寫緩存文件 了解mapreduce程序的設(shè)計(jì)方法 實(shí)驗(yàn)原理 1.TF-IDF簡介 TF-IDF( ...

HanLP分詞命名實(shí)體提取詳解

HanLP分詞命名實(shí)體提取詳解 ? 分享一篇大神的關(guān)于hanlp分詞命名實(shí)體提取的經(jīng)驗(yàn)文章,文章中分享的內(nèi)容略有一段時(shí)間(使用的hanlp版本比較老),最新一版的hanlp已經(jīng)出來了,也可以去看看新版 ...

HanLP分詞研究

這篇文章主要是記錄HanLP標(biāo)準(zhǔn)分詞算法整個(gè)實(shí)現(xiàn)流程. HanLP的核心詞典訓(xùn)練自人民日報(bào)2014語料,語料不是完美的,總會(huì)存在一些錯(cuò)誤.這些錯(cuò)誤可能會(huì)導(dǎo)致分詞出現(xiàn)奇怪的結(jié)果,這時(shí)請打開調(diào)試模式排查問 ...

hanlp分詞工具應(yīng)用案例:商品圖自動(dòng)推薦功能的應(yīng)用

本篇分享一個(gè)hanlp分詞工具應(yīng)用的案例,簡單來說就是做一圖庫,讓商家輕松方便的配置商品的圖片,最好是可以一鍵完成配置的. 先看一下效果圖吧: 商品單個(gè)推薦效果:匹配度高的放在最前面 這個(gè)想法很好,那 ...

Java常用排序算法&plus;程序員必須掌握的8大排序算法&plus;二分法查找法

Java?常用排序算法/程序員必須掌握的?8大排序算法 本文由網(wǎng)絡(luò)資料整理轉(zhuǎn)載而來,如有問題,歡迎指正! 分類: 1)插入排序(直接插入排序.希爾排序) 2)交換排序(冒泡排序.快速排序) 3)選擇排 ...

隨機(jī)推薦

python常用模塊

os模塊 os.getcwd() 獲取當(dāng)前工作目錄,即當(dāng)前python腳本工作的目錄路徑 os.chdir("dirname") 改變當(dāng)前腳本工作目錄:相當(dāng)于shell下cd os ...

js 數(shù)組&comma;字符串&comma;json互相轉(zhuǎn)換

數(shù)組轉(zhuǎn)字符串 var arr = [1,2,3,4,'巴德','merge']; var str = arr.join(','); console.log(str); // 1,2,3,4,巴德,me ...

iOS - 發(fā)送郵件

IOS系統(tǒng)框架提供的兩種發(fā)送Email的方法:openURL 和 MFMailComposeViewController.借助這兩個(gè)方法,我們可以輕松的在應(yīng)用里加入如用戶反饋這類需要發(fā)送郵件的功能. ...

OGRE插件設(shè)計(jì)-Texture與GLTexture

背景: 學(xué)習(xí)OGRE,在OGRE中 Core是最小的精簡邏輯集合,而真正的功能則需要插件來實(shí)現(xiàn),但是作為插件應(yīng)該與Core保持最小的連接,同時(shí)Core不會(huì)調(diào)用插件的接口,而動(dòng)態(tài)鏈接庫又不能直接把類連接 ...

paip&period;tree 生成目錄樹到txt后的折疊查看

paip.tree 生成目錄樹到txt后的折疊查看 作者Attilax , ?EMAIL:1466519819@qq.com? 來源:attilax的專欄 地址:http://blog.csdn.ne ...

Jmeter 新手

轉(zhuǎn)載:http://www.cnblogs.com/TankXiao/p/4059378.html 什么是壓力測試 顧名思義:壓力測試,就是 ?被測試的系統(tǒng),在一定的訪問壓力下,看程序運(yùn)行是否穩(wěn)定/服 ...

PN結(jié)加正向偏置電壓 其空間電荷區(qū)為何變窄

理論基礎(chǔ):導(dǎo)體是內(nèi)部具有較多可以自由移動(dòng)的電荷的物體. 絕緣體是內(nèi)部沒有或者有很少可以自由移動(dòng)的電荷的物體. +代表空穴帶正電 -代表電子帶負(fù)電 兩豎線之間表示無自由移動(dòng)電子或空穴部分,相當(dāng)于絕緣體 ...

CSS中默認(rèn)被繼承的屬性

在CSS中,所有屬性都可以被繼承,只需要顯式的設(shè)置屬性值為inherit即可.如果不設(shè)置該屬性,CSS大部分屬性默認(rèn)不會(huì)從父元素繼承而是設(shè)置初始值(initial value),但是有一部分屬性,默認(rèn) ...

Your branch is ahead of &&num;39&semi;origin&sol;master&&num;39&semi; by 2 commits&period;

遇到這種問題,表示在你之前已經(jīng)有2個(gè)commit而沒有push到遠(yuǎn)程分支上,所以需要先git push origin **將本地分支提到遠(yuǎn)程倉庫.也可以直接git reset --hard HEAD~ ...

&lbrack;SDOI2015&rsqb; 尋寶游戲

傳送門:>Here< 題意:給出一棵樹(有邊權(quán)),剛開始鍵值全部為0.每次對其中一個(gè)鍵值進(jìn)行異或,問每一次修改之后:選擇任意一個(gè)點(diǎn)出發(fā)走到所有為1的點(diǎn)再走回來的最短路 解題思路 由于N,M ...

總結(jié)

以上是生活随笔為你收集整理的java hanlp分词_Hanlp分词实例:Java实现TFIDF算法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。