通過Java實現(xiàn)中文分詞與文本關(guān)鍵詞提取
我當前在做的項目需求:在xx單子中提取出我想要的關(guān)鍵詞,涉及中文分詞的內(nèi)容,可以借助IK分詞器實現(xiàn)此功能。
1、引入依賴
ik用于分詞,commons-io用來讀取文件內(nèi)容(我懶)
<dependency> <groupId>com.janeluo</groupId> <artifactId>ikanalyzer</artifactId> <version>2012_u6</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.8.0</version> </dependency>
注意:如果項目使用了ElasticSearch,可能會出現(xiàn)沖突,需根據(jù)你的情況手動排除,如下
<dependency> <groupId>com.janeluo</groupId> <artifactId>ikanalyzer</artifactId> <version>2012_u6</version> <exclusions> <exclusion> <groupId>org.apache.lucene</groupId> <artifactId>lucene-core</artifactId> </exclusion> <exclusion> <groupId>org.apache.lucene</groupId> <artifactId>lucene-analyzers-common</artifactId> </exclusion> <exclusion> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </exclusion> </exclusions> </dependency>
2、創(chuàng)建自己的詞典
創(chuàng)建文件,在里面輸入自己想要擴充的詞語,放到resources中,命名如“keywords.dic”
3、創(chuàng)建分詞工具類
package com.iherb.user.util; import org.apache.commons.io.IOUtils; import org.wltea.analyzer.cfg.Configuration; import org.wltea.analyzer.cfg.DefaultConfig; import org.wltea.analyzer.core.IKSegmenter; import org.wltea.analyzer.core.Lexeme; import org.wltea.analyzer.dic.Dictionary; import java.io.StringReader; import java.nio.charset.StandardCharsets; import java.util.*; public class KeywordUtil { Configuration cfg; List<String> expandWords = new ArrayList<>(); /** * 每個詞的最小長度 */ private static final int MIN_LEN = 2; KeywordUtil() { cfg = DefaultConfig.getInstance(); cfg.setUseSmart(true); //設(shè)置useSmart標志位 true-智能切分 false-細粒度切分 boolean flag = loadDictionaries("keywords.dic"); if (!flag) { throw new RuntimeException("讀取失敗"); } Dictionary.initial(cfg); Dictionary.getSingleton().addWords(expandWords); //詞典中加入自定義單詞 } /** * 加載自定義詞典,若無想要添加的詞則無需調(diào)用,使用默認的詞典 * @param filenames * @return */ private boolean loadDictionaries(String... filenames) { try { for (String filename : filenames) { expandWords.addAll( IOUtils.readLines( KeywordUtil.class.getClassLoader().getResourceAsStream(filename), StandardCharsets.UTF_8 ) ); } return true; } catch (Exception e) { e.printStackTrace(); } return false; } /** * 提取詞語,結(jié)果將按頻率排序 * @param text 待提取的文本 * @return 提取出的詞 */ public List<String> extract(String text) { StringReader reader = new StringReader(text); IKSegmenter ikSegmenter = new IKSegmenter(reader, cfg); Lexeme lex; Map<String, Integer> countMap = new HashMap<>(); try { while ((lex = ikSegmenter.next()) != null) { String word = lex.getLexemeText(); if (word.length() >= MIN_LEN) { //取出的詞至少#{MIN_LEN}個字 countMap.put(word, countMap.getOrDefault(word, 0) + 1); } } List<String> result = new ArrayList<>(countMap.keySet()); //根據(jù)詞出現(xiàn)頻率從大到小排序 result.sort((w1, w2) -> countMap.get(w2) - countMap.get(w1)); return result; } catch (Exception e) { e.printStackTrace(); } return Collections.emptyList(); } /** * 提取存在于我擴充詞典的詞 * @param num 需要提取的詞個數(shù) * @return */ public List<String> getKeywords(String text, Integer num) { List<String> words = extract(text); List<String> result = new ArrayList<>(); int count = 0; for (String word : words) { if (expandWords.contains(word)) { result.add(word); if (++count == num) { break; } } } return result; } public static void main(String[] args) { String text = "哈哈無花果翠云草酢漿草是什么,。我是帥哥666無花果真好吃還有北沙參穿心蓮翠云草,草豆蔻和蟬蛻酢漿草也不錯的"; KeywordUtil keywordUtil = new KeywordUtil(); List<String> keywords = keywordUtil.getKeywords(text, 5); keywords.forEach(System.out::println); } }
4、測試
以上就是通過Java實現(xiàn)中文分詞與文本關(guān)鍵詞提取的詳細內(nèi)容,更多關(guān)于Java分詞的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
JDK動態(tài)代理之WeakCache緩存的實現(xiàn)機制
這篇文章主要介紹了JDK動態(tài)代理之WeakCache緩存的實現(xiàn)機制2018-02-02Spring Boot集成LangChain來實現(xiàn)Rag應用的問題小結(jié)
檢索增強生成(RAG)是一種優(yōu)化大型語言模型(LLM)輸出的技術(shù),通過引用權(quán)威知識庫以增強模型的準確性和相關(guān)性,RAG允許LLM在不重新訓練的情況下訪問特定領(lǐng)域的知識,提高了其在各種應用中的實用性和信任度,感興趣的朋友跟隨小編一起看看吧2024-09-09Java中通過三級緩存解決Spring循環(huán)依賴詳解
這篇文章主要介紹了Java中通過三級緩存解決Spring循環(huán)依賴詳解,當出現(xiàn)兩個或多個 Bean 在初始化時相互依賴的情況時,Spring Boot 會將其中一個 Bean 提前暴露出來,以便其他 Bean 能夠在初始化時正確地引用它,這一策略能有效避免循環(huán)依賴導致的問題,需要的朋友可以參考下2023-09-09Java RocketMQ 路由注冊與刪除的實現(xiàn)
這篇文章主要介紹了Java RocketMQ 路由注冊與刪除的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-11-11如何利用Java實現(xiàn)MySQL的數(shù)據(jù)變化監(jiān)聽
在高并發(fā)和大數(shù)據(jù)環(huán)境下,實時獲取?MySQL?數(shù)據(jù)庫的增量變化對數(shù)據(jù)同步、數(shù)據(jù)分析、緩存更新等場景至關(guān)重要,下面我們就來看看如何通過Java實現(xiàn)MySQL的數(shù)據(jù)變化監(jiān)聽吧2025-02-02java如何把逗號分隔的String字符串轉(zhuǎn)int集合
這篇文章主要介紹了java實現(xiàn)把逗號分隔的String字符串轉(zhuǎn)int集合,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-06-06IntelliJ IDEA引入第三方j(luò)ar包或查看Java源碼的時候報decompiled.class file byt
今天小編就為大家分享一篇關(guān)于IntelliJ IDEA引入第三方j(luò)ar包或查看Java源碼的時候報decompiled.class file bytecode version:52.0(java 8)錯誤的解決辦法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-10-10Spring Boot實現(xiàn)郵件服務(wù)(附:常見郵箱的配置)
這篇文章主要給大家介紹了關(guān)于Spring Boot實現(xiàn)郵件服務(wù)的相關(guān)資料,文中還附上了常見郵箱的配置,通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2018-12-12