Java大數據環境下的快速精準關鍵詞匹配
本文探討如何在Java大數據環境下,高效地從包含20萬到50萬條記錄的詞庫中,快速精準地匹配句子中的關鍵詞。詞庫存儲介質可以是列表、字典、redis或數據庫。
高效算法:基于前綴樹的匹配
為了實現高效匹配,我們采用基于前綴樹(Trie樹)的算法。該算法將每個關鍵詞分解成單個字符,并構建一個哈希表形式的前綴樹。 (此處省略字典樹結構圖示,因為無法直接生成圖片)
立即學習“Java免費學習筆記(深入)”;
詞庫構建與初始化
所有關鍵詞都將按照前綴樹結構加載到內存中。
句子匹配過程
對于輸入句子,算法逐個字符進行遍歷。如果當前字符存在于前綴樹中,則繼續向下遍歷;否則,回溯到根節點,開始新的匹配。 當遍歷到前綴樹的葉子節點(或當前字符不再存在于樹中),且該節點標記為關鍵詞結尾(例如,標記為”_end”),則表示匹配成功。
代碼示例 (改進版)
以下代碼提供了一個改進的實現,使用了更清晰的類結構和更健壯的錯誤處理:
import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; class TrieNode { Map<Character, TrieNode> children; boolean isEndOfWord; TrieNode() { children = new HashMap<>(); isEndOfWord = false; } } public class KeywordMatcher { private TrieNode root; public KeywordMatcher(String[] keywords) { root = new TrieNode(); for (String keyword : keywords) { insert(keyword); } } private void insert(String word) { TrieNode current = root; for (char c : word.toCharArray()) { current = current.children.computeIfAbsent(c, k -> new TrieNode()); } current.isEndOfWord = true; } public Set<String> match(String sentence) { Set<String> matchedKeywords = new HashSet<>(); TrieNode current = root; for (int i = 0; i < sentence.length(); i++) { char c = sentence.charAt(i); if (current.children.containsKey(c)) { current = current.children.get(c); if (current.isEndOfWord) { matchedKeywords.add(extractMatchedKeyword(sentence, i)); } } else { current = root; // Reset to root if character not found } } return matchedKeywords; } //Helper function to extract matched keyword from sentence private String extractMatchedKeyword(String sentence, int endIndex){ TrieNode current = root; StringBuilder keyword = new StringBuilder(); int i = endIndex; while(i >= 0 && current.children.containsKey(sentence.charAt(i))){ keyword.insert(0, sentence.charAt(i)); current = current.children.get(sentence.charAt(i)); i--; } return keyword.toString(); } public static void main(String[] args) { String[] keywords = {"紀念碑", "紀念冊", "天安門", "天氣"}; KeywordMatcher matcher = new KeywordMatcher(keywords); String sentence = "我愛北京天安門,天安門前有人民英雄紀念碑,我希望去哪里看一看"; Set<String> matched = matcher.match(sentence); System.out.println("Matched keywords: " + matched); } }
性能分析
該算法的平均時間復雜度為O(m*n),其中m為句子長度,n為關鍵詞的平均長度。在實際應用中,由于關鍵詞通常較短,性能表現非常高效,即使對于百萬級別的詞庫,也能在毫秒級內完成匹配。 該改進版代碼更易于理解和維護,并避免了一些潛在的錯誤。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END