說說如何使用 IKAnalyzer 實現詞頻統計並排序

IKAnalyzer 是一個開源的,基於 java 語言開發的輕量級的中文分詞工具包 。
IKAnalyzer 採用了特有的 “ 正向迭代最細粒度切分演算法 “ ,支援細粒度和智慧分詞兩種切分模式; 在系統環境: Core2 i7 3.4G 雙核, 4G 記憶體, window 7 64 位, Sun JDK 1.6_29 64 位 普通 pc 環境測試, IK2012 具有 160 萬字 / 秒( 3000KB/S )的高速處理能力 。
現在需要統計一批資料中的熱詞,即需要對這批資料進行分詞分析,並統計出現頻次,然後再按照從高到低排序。
1、在專案中引入 IKAnalyzer jar。
2、在 resources 中 新建 IKAnalyzer.cfg.xml 配置檔案,內容如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <comment>IKAnalyzer</comment> <!-- 擴充套件詞典--> <entry key="ext_dict">ext.dic;</entry> <!-- 擴充套件停止詞詞典--> <entry key="ext_stopwords">stopword.dic;</entry> </properties>
3、接著,就可以編寫詞頻統計工具咯:
package net.deniro.solr; import org.apache.commons.lang3.StringUtils; import org.wltea.analyzer.core.IKSegmenter; import org.wltea.analyzer.core.Lexeme; import java.io.IOException; import java.io.StringReader; import java.util.*; /** * 分詞後,根據常用詞進行統計 * * @author Deniro Li ([email protected]) */ public class WordFrequency { /** * 詞頻統計 * * @param frequencies 詞頻;key:詞語;value:出現次數 * @param content內容 * @return * @throws IOException */ public static Map<String, Integer> count(Map<String, Integer> frequencies, String content) throws IOException { if (frequencies == null) { frequencies = new HashMap<>(); } if (StringUtils.isBlank(content)) { return frequencies; } IKSegmenter ikSegmenter = new IKSegmenter(new StringReader(content), true); Lexeme lexeme; while ((lexeme = ikSegmenter.next()) != null) { final String text = lexeme.getLexemeText(); if (text.length() > 1) { //遞增 if (frequencies.containsKey(text)) { frequencies.put(text, frequencies.get(text) + 1); } else {//首次出現 frequencies.put(text, 1); } } } return frequencies; } /** * 按出現次數,從高到低排序 * * @param data * @return */ public static List<Map.Entry<String, Integer>> order(Map<String, Integer> data) { List<Map.Entry<String, Integer>> result = new ArrayList<>(data.entrySet()); Collections.sort(result, new Comparator<Map.Entry<String, Integer>>() { @Override public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { return o2.getValue() - o1.getValue(); } }); return result; } public static void main(String[] args) throws IOException { String content = "三星 Galaxy Note4 N9100 4G手機(幻影白)雙卡雙待 公開版+施華洛世奇水晶後殼(瑰金落日)套裝"; List<Map.Entry<String, Integer>> result = WordFrequency.order (WordFrequency.count(new HashMap<String, Integer>(), content)); System.out.println(result); } }
main 方法的執行結果為:
[note4=1, 4g=1, 手機=1, 套裝=1, 落日=1, galaxy=1, 幻影=1, n9100=1, 公開=1, 三星=1, 水晶=1]
4、實際使用:
... Map<String, Integer> data = new HashMap<>(); Map<String, Integer> frequencies = new HashMap<>(); for (SolrDocument doc : documents) { final String item_sell_point = (String) doc.get ("item_sell_point"); data.putAll(WordFrequency.count(frequencies, item_sell_point)); } //【賣點】分詞統計 List<Map.Entry<String, Integer>> result = WordFrequency.order(data); System.out.println(result);
執行結果:
