Java正則表示式過濾、替換,將一段文字中的英語單詞分別提取出,並統計詞頻,按詞頻排序。
阿新 • • 發佈:2018-11-05
最近在學習自然語言處理,在建立基礎標籤庫時,遇到一個需要提取語料中的英文單詞的工作,做好了現在來和大家分享下。
實現效果:讀取檔案內容,把其中的英文單詞提取出,並統計詞頻。提取時,原本不是連在一起的單詞可以分開獨立提取,例如:我的PPT和WORD,可以提取出PPT,WORD兩個單詞。
基本思想:如果直接用正則表示式把其他非字母字元都過濾掉,那麼剩下的英文單詞就會連在一起了,所以,在處理時,應該保留下分隔英文單詞的字元。首先文字可能會存在亂七八雜的符號,先把這些符號過濾掉(包括數字也可以過濾掉,看自己需要),然後剩下的就是英文和中文啦,這時候再把英文按中文分開提取就好啦。
舉個栗子:我要處理的文字內容是:我的#……¥@PPT和#@WORD
第一步:過濾亂七八糟符號後(用正則表示式就好啦),變為:我的PPT和WORD
第二步:把中文換為*號(同樣用正則表示式就好啦),變為:**PPT*WORD
最後:按*號分開提取(用StringTokenizer),變為:PPT WORD
也就是這樣的邏輯:
--------------------------------------------------------圖片用來看,程式碼用來粘---------------------------------------------------------------------------
String s = StringFilter(t);//過濾掉特殊字元 String regex = "[\\u4e00-\\u9fa5]"; s = s.replaceAll(regex, "*");//將中文用*替換 StringTokenizer st = new StringTokenizer(s, "*");//將字串按*號分開 while (st.hasMoreElements()) { String k = (String) st.nextElement(); if (!k.equals("") && k.length() > 2 && !removeDigital(k).equals("")) { pw.println(k); }
}
主要使用的就是正則表示式,如下:
public static String removeDigital(String value) { Pattern p = Pattern.compile("[\\d]"); Matcher matcher = p.matcher(value); String result = matcher.replaceAll(""); return result; //System.out.println(result); }
public static String StringFilter(String str) { // 清除掉以下特殊字元 String regEx = "[^(a-zA-Z0-9\\u4e00-\\u9fa5)()() ())($]"; return str.replaceAll(regEx, " "); }
下面附上常見的統計詞頻和排序的方法啦:
/** * 統計出現的詞的個數 */ public static void FileCharacter(String fileName) throws IOException { BufferedReader br = new BufferedReader(new FileReader(new File(fileName))); Map<String, Integer> map = new HashMap<String, Integer>();//用於統計各個單詞的個數,排序 String line; while (null != (line = br.readLine())) { //將字串用空格分隔 String[] ss = line.split("\\s+"); for (String s : ss) { if (map.containsKey(s)) { map.put(s, map.get(s) + 1); } else { map.put(s, 1); } } } Set<String> keys = map.keySet(); sort(map,""); } public static void sort(Map<String, Integer> map, String sql) throws IOException { List<Map.Entry<String, Integer>> infoIds = new ArrayList<Map.Entry<String, Integer>>(map.entrySet()); Collections.sort(infoIds, new Comparator<Map.Entry<String, Integer>>() { public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { return (o2.getValue() - o1.getValue()); } }); //排序 PrintWriter p = new PrintWriter(new OutputStreamWriter( new FileOutputStream("該自己寫路徑了"), "utf-8"), true); for (int i = 0; i < infoIds.size(); i++) { //輸出 Map.Entry<String, Integer> id = infoIds.get(i); String k = id.getKey(); if (!k.equals("") && k.length() > 2 && !removeDigital(k).equals("")) { p.print(id.getKey() + ":" + id.getValue()); p.print("\n"); } } p.close(); } }