1. 程式人生 > >Java正則表示式過濾、替換,將一段文字中的英語單詞分別提取出,並統計詞頻,按詞頻排序。

Java正則表示式過濾、替換,將一段文字中的英語單詞分別提取出,並統計詞頻,按詞頻排序。

最近在學習自然語言處理,在建立基礎標籤庫時,遇到一個需要提取語料中的英文單詞的工作,做好了現在來和大家分享下。

實現效果:讀取檔案內容,把其中的英文單詞提取出,並統計詞頻。提取時,原本不是連在一起的單詞可以分開獨立提取,例如:我的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();

    }
}