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格式
這里用的就是這個方法。
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è)計。