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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

NLP 开源形近字算法之相似字列表(番外篇)

發布時間:2024/5/15 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 NLP 开源形近字算法之相似字列表(番外篇) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

創作目的

國內對于文本的相似度計算,開源的工具是比較豐富的。

但是對于兩個漢字之間的相似度計算,國內基本一片空白。國內的參考的資料少的可憐,國外相關文檔也是如此。

本項目旨在拋磚引玉,實現一個基本的相似度計算工具,為漢字 NLP 貢獻一點綿薄之力。

推薦閱讀:

NLP 中文形近字相似度計算思路

中文形近字相似度算法實現,為漢字 NLP 盡一點綿薄之力

當代中國最貴的漢字是什么?

NLP 開源形近字算法補完計劃(完結篇)

NLP 開源形近字算法之形近字列表(番外篇)

開源項目在線化 中文繁簡體轉換/敏感詞/拼音/分詞/漢字相似度/markdown 目錄

需求

有時候我們并不是需要返回兩個字的相似,而是需要返回一個漢字的相似列表。

實現思路

我們可以分別計算所有的漢字之間的相似度,然后保留最大的前100個,放在字典中。

然后實時查詢這個字典即可。

實現方式

bihuashu_2w.txt 中我們主要需要的是對應的 2W 常見漢字。

hanzi_similar_list.txt 用來存放漢字和相似字的映射關系。

數據初始化

public static void main(String[] args) {final String path = "D:\\code\\coin\\nlp-hanzi-similar\\src\\main\\resources\\hanzi_similar_list.txt";// 讀取列表List<String> lines = FileUtil.readAllLines("D:\\code\\coin\\nlp-hanzi-similar\\src\\main\\resources\\nlp\\bihuashu_2w.txt");// 所有的單詞Set<String> allWordSet = new HashSet<>();for(String line : lines) {String word = line.split(" ")[0];allWordSet.add(word);}// 循環對比for(String word : allWordSet) {List<String> list = getSimilarListData(word, allWordSet);String line = word +" " + StringUtil.join(list, "");FileUtil.append(path, line);} }
  • 優先級隊列取前 100 個

我們通過優先級隊列存儲:

private static List<String> getSimilarListData(String word, Set<String> wordSet) {PriorityQueue<SimilarListDataItem> items = new PriorityQueue<>(new Comparator<SimilarListDataItem>() {@Overridepublic int compare(SimilarListDataItem o1, SimilarListDataItem o2) {// 相似度大的放在前面return -o1.getRate().compareTo(o2.getRate());}});for(String other : wordSet) {if(word.equals(other)) {continue;}// 對比double rate = HanziSimilarHelper.similar(word.charAt(0), other.charAt(0));SimilarListDataItem item = new SimilarListDataItem(other, rate);items.add(item);}final int limit = 100;List<String> wordList = new ArrayList<>();for(SimilarListDataItem item : items) {wordList.add(item.getWord());if(wordList.size() >= limit) {break;}}return wordList; }

相似字的獲取

初始化好數據之后,一切就變得非常簡單:

  • 接口定義
/*** 數據接口-相似列表* @author binbin.hou* @since 1.3.0*/ public interface IHanziSimilarListData {/*** 返回數據信息* @param word 單詞* @return 結果* @since 1.3.0*/List<String> similarList(String word);}
  • 數據獲取
public class HanziSimilarListData implements IHanziSimilarListData {private static volatile Map<String, List<String>> map = Guavas.newHashMap();@Overridepublic List<String> similarList(String word) {if(MapUtil.isEmpty(map)) {initDataMap();}return map.get(word);}private void initDataMap() {if(MapUtil.isNotEmpty(map)) {return;}//DLCsynchronized (map) {if(MapUtil.isEmpty(map)) {List<String> lines = StreamUtil.readAllLines("/hanzi_similar_list.txt");for(String line : lines) {String[] words = line.split(" ");// 后面的100個相近詞List<String> list = StringUtil.toCharStringList(words[1]);map.put(words[0], list);}}}}}

便利性

為了用戶使用方便,我們在 HanziSimilarHelper 中添加 2 個工具類方法:

/*** 相似的列表* @param hanziOne 漢字一* @param limit 大小* @return 結果* @since 1.3.0*/ public static List<String> similarList(char hanziOne, int limit) {return HanziSimilarBs.newInstance().similarList(hanziOne, limit); } /*** 相似的列表* @param hanziOne 漢字一* @return 結果* @since 1.3.0*/ public static List<String> similarList(char hanziOne) {return similarList(hanziOne, 10); }

測試效果

我們使用看一下效果:

我們來看一下【愛】的形近字。

List<String> list = HanziSimilarHelper.similarList('愛'); Assert.assertEquals("[爰, 爯, 受, 爭, 妥, 憂, 李, 爳, 叐, 雙]", list.toString());

開源地址

為了便于大家使用學習,項目已開源。

https://github.com/houbb/nlp-hanzi-similar

小結

一個字的形近字可以做很多有趣的事情,這個要看大家的想象力。

實現方式也不難,最核心的還是相似度的計算。

我是老馬,期待與你的下次重逢。

總結

以上是生活随笔為你收集整理的NLP 开源形近字算法之相似字列表(番外篇)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。