分析英文語料庫,計算單詞數(shù)量,格式化為json

1. 得到語料庫

這里使用的是英文小說作為語料庫分析。

2. 一次性讀取txt文件

public static byte[] getText() throws IOException {
    File file = new File("H:\\test2.txt");
    Long fileLength = file.length();
    byte[] fileContent = new byte[fileLength.intValue()];
    try {
        FileInputStream is = new FileInputStream(file);
        is.read(fileContent);
        is.close();
    } catch (Exception e) {
    }
    return fileContent;
}

這里返回的是一個byte[]數(shù)組,可以直接使用new String(byte[]數(shù)組)進行讀取。具體方法見標(biāo)題4。

3. 統(tǒng)計單詞方法

public static void CountWords(String str) throws IOException {

    //存放單詞的統(tǒng)計結(jié)果
        List<String> countForWord = new ArrayList<String>() ;
    
        Map<String, Integer> map=new HashMap<String, Integer>();        
        Pattern p=Pattern.compile("\\b[a-zA-Z-]+\\b");//正則表達式
        Matcher m=p.matcher(str);
        while(m.find()){
            String mstr=m.group();
            if(map.containsKey(mstr)){
                //相同的key,后者就會覆蓋,次數(shù)+1
                map.put(mstr,map.get(mstr)+1);
            }else{
                map.put(mstr, 1);
            }
        }
        
//      Set<Entry<String, Integer>> entrySet = map.entrySet();
//      Iterator<Entry<String,Integer>> it=entrySet.iterator();
//      while(it.hasNext()){
//          Entry<String, Integer> next = it.next();
//          System.out.println(next.getKey()+" 個數(shù):"+next.getValue());
//      }
        
        //map.entrySet()方法:返回一個Set集合,這個集合的類型為:Map.Entry
        //it是定義一個迭代器,用于遍歷set集合。
        Set entrySet = map.entrySet();
        Iterator it = entrySet.iterator();
        
        //進行迭代遍歷
        while(it.hasNext()) {
            Map.Entry entry = (Map.Entry)it.next();
            String tmp = entry.getKey() + " " + entry.getValue() ; 
            //統(tǒng)計結(jié)果按行存入countForWord中。
            countForWord.add(tmp);
        }
        
        //寫入txt文件中。
        FileWriter fw = new FileWriter(new File("H:\\test3.txt"));
        BufferedWriter bw = new BufferedWriter(fw);
        for (String str1 : countForWord) {
            //換行 \r\n
            bw.write(str1+"\r\n");
        }
        bw.close();
        fw.close();
    }

4. 入口方法,執(zhí)行程序

public static void main(String[] args) throws IOException {
        //將byte[]數(shù)組轉(zhuǎn)換成String
        String str = new String(getText());
        //全部轉(zhuǎn)換成小寫
        str = str.toLowerCase();
        //調(diào)用方法
        CountWords(str);
    }

注意修改文件路徑

結(jié)果:


統(tǒng)計結(jié)果

5. 轉(zhuǎn)換為json格式

上一篇固定txt格式轉(zhuǎn)json鏈接

這里用的就是這個方法。

package zidongjiucuo;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.fastjson.JSON;
import zidongjiucuo.ClassA;

public class Test {

    public static void main(String[] args) throws IOException {
        InputStreamReader ins = new InputStreamReader(new FileInputStream("H:\\test3.txt"));
        BufferedReader br = new BufferedReader(ins);
        List<String> list = new ArrayList<String>();
        //存放java對象
        List<ClassA> tlist = new ArrayList<ClassA>();
        String line = null;
        while((line = br.readLine()) != null) {
            list.add(line);
        }
        br.close();
        System.out.println(list.size());
        for (String str : list) {
            String[] arrStr = str.split("\\s+");
            ClassA classA = new ClassA();
            classA.setWord(arrStr[0]);
            classA.setTimes(Integer.parseInt(arrStr[1]));
            tlist.add(classA);
        }
        String json = JSON.toJSONString(tlist);
        System.out.println(json);
        
        File txtToJson = new File("H:\\json1.json");
        txtToJson.createNewFile();
        BufferedWriter out = new BufferedWriter(new FileWriter(txtToJson));  
        out.write(json); 
        out.flush(); // 把緩存區(qū)內(nèi)容壓入文件  
        out.close(); // 最后記得關(guān)閉文件  
    }
}

同樣需要注意修改路徑。
上方使用fastTojson,需要定義一個bean類。在上方main方法中就是ClassA

classA bean類
package zidongjiucuo;  
 
public class ClassA {
    public String word;
    public int times;
    public String getWord() {
        return word;
    }
    public void setWord(String word) {
        this.word = word;
    }
    public int getTimes() {
        return times;
    }
    public void setTimes(int times) {
        this.times = times;
    }
}

6. 運行該方法,查看結(jié)果

json結(jié)果

7. 總結(jié)

原理主要涉及到Map數(shù)據(jù)類型、entrySet、文件的讀寫等。
可以將以上方法改進、整理,使其可讀性更強。
接下來就要將json串存入數(shù)據(jù)庫,計算每個單詞的出現(xiàn)概率等,用于下一步的畢業(yè)設(shè)計。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容