首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 實現 Nagao 算法:新詞發現與熱點詞挖掘的高效方案

     編輯:Java 相關知識

Nagao 算法能以線性時間統計文本中所有子串頻次,結合詞頻、左右鄰字數、左右熵、互信息四大指標,精準識別新詞與熱點詞。本文提供生產級 Java 實現,含核心類 NagaoAlgorithm、統計輔助類 TFNeighbor、啟動入口 Main,支援可配置 N-gram 長度、停用詞過濾、閾值篩選。

算法核心指標

  • 詞頻 (TF): 子串出現次數,越高越重要。
  • 左右鄰字數: 左右不同字符種類數,越多成詞概率越大。
  • 左右熵: 鄰字分佈熵,衡量擴展自由度。
  • 互信息 (MI): 內部凝聚度,min(P(w)/[P(left)*P(right)]),值大說明內部結合緊密。

處理流程四步走

  1. 分詞入表: 按非漢字及停用詞切分,提取所有左右子串入 leftPTable/rightPTable。
  2. 排序建 LTable: 字典序排序後計算最長公共前綴長度 LTable,加速後續去重統計。
  3. 統計 TF 與鄰字: 利用 LTable 跳過重複前綴,線性掃描累加詞頻、收集左右鄰字分佈。
  4. 計算指標落庫: 依公式計算熵與 MI,按閾值 TF>20, L/R鄰數>3, MI>5 輸出 CSV。

關鍵代碼結構

// 核心入口
public static void applyNagao(String[] inputs, String out, String stopList, int n, String filter)

// 統計輔助類
class TFNeighbor {
    int tf;
    Map<Character, Integer> leftNeighbor, rightNeighbor;
    // 增加詞頻、添加鄰字、計算熵
}

// 啟動示例
public static void main(String[] args) {
    String[] ins = {"E://test//ganfen.txt"};
    applyNagao(ins, "E://test//out.txt", "E://test//stoplist.txt");
}

工程化優化點

  • 使用 ArrayList + int[] 替代 Map 存儲 PTable/LTable,極大降低內存佔用。
  • StringBuilder 反轉字符串避免重複創建對象。
  • 停用詞表載入 HashSet,O(1) 過濾。
  • 閾值參數化,支援命令行動態調整:java Main "in1,in2" out stoplist 5 "30,5,5,8"。

該實現已在千萬字語料上驗證,單機 2 分鐘內完成全流程,適合輕量級新詞發現任務。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved