Thống kê các từ trong một văn bản
Đôi lúc chúng ta cần phải thống kê các từ cùng vị trí xuất hiện của nó trong một văn bản nào đó phục vụ cho việc lập chỉ mục chẳng hạn. CHương trình sau đây sẽ đảm nhận công việc này.
Input: File Text cần thống kê
Output: File text chỉ các từ có xuất iện trong văn bản cùng các vị trí mà tại đó nó xuất hiện.
package abc;
import java.io.FileInputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;
import java.util.StringTokenizer;
/**
* Thống kê các từ trong một văn bản
* @author VoVanHai
* http://vovanahai.wordpress.com
*/
public class CreateIdxFile {
HashMap<String, ArrayList<Integer>> ds;
public CreateIdxFile() {
ds=new HashMap<String, ArrayList<Integer>>();
}
public void CreateIndex(String sourceFile,String indexFile) {
try {
Scanner sc=new Scanner(new FileInputStream(sourceFile),"UTF-8");
String line="";
int lineNo=0;
while(sc.hasNextLine()) {
line=sc.nextLine();
lineNo++;
StringTokenizer tk=new StringTokenizer(line," ");
while(tk.hasMoreTokens()) {
String w=tk.nextToken();
xuly(w,lineNo);
}
}
//Đưa ra file index
Put2File(indexFile);
} catch (Exception e) {
e.printStackTrace();
}
}
private void xuly(String key,int lineNo) {
//chưa có từ thì tạo 1 mục mới
if(!ds.containsKey(key)) {
ArrayList<Integer> lst=new ArrayList<Integer>();
lst.add(new Integer(lineNo));
ds.put(key, lst);
}
else //đã có từ trong danh sách
{
ArrayList<Integer>lst= ds.get(key);
lst.add(new Integer(lineNo));
}
}
public void Put2File(String indexFile) {
try {
PrintWriter out=new PrintWriter(indexFile,"UTF-8");
Set<String> setKey=ds.keySet();
Iterator<String>it=setKey.iterator();
while(it.hasNext()) {
String key=it.next();
ArrayList<Integer>arr=ds.get(key);
String idx="";
for(Integer i:arr)
idx+=i.toString()+",";
out.println(key+" "+idx);
}
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Ví dụ: File cần đọc là source.txt có nội dung:
Từng hạt sương khuya hoen đôi mắt biếc Sau khi chia tay hôn anh một lần vội vã Làm chiều không đi chân mây tím ngắt Anh ơi, đêm nay em nghe trống vắng buồn tênh Từng ngày trôi qua tim em héo úa Ðêm đêm theo mây len lén vào hồn tìm nhau Tìm làn môi ngoan nồng nàn thắm thiết Cho đêm không mơ, cơn mơ lẻ loi Ðêm em xa anh em chưa kịp nói Ðôi môi run run lệ tuôn khóe mắt Nên em cô đơn những đêm về sáng Nên khi xuân sang lòng như trái đắng Nào ngờ đêm nay tim nghe ấm áp Ngỡ đã xa nhau nên khóc một lần từ giã Giờ thì đôi tay đan tay quấn quít Xin cho đêm đêm tình đầy mộng say... Từng hạt sương khuya hoen đôi mắt biếc Sau khi chia tay hôn anh một lần vội vã Làm chiều không đi chân mây tím ngắt Anh ơi, đêm nay em nghe trống vắng buồn tênh Từng ngày trôi qua tim em héo úa Ðêm đêm theo mây len lén vào hồn tìm nhau Tìm làn môi ngoan nồng nàn thắm thiết Cho đêm không mơ, cơn mơ lẻ loi Ðêm em xa anh em chưa kịp nói Ðôi môi run run lệ tuôn khóe mắt Nên em cô đơn những đêm về sáng Nên khi xuân sang lòng như trái đắng Nào ngờ đêm nay tim nghe ấm áp Ngỡ đã xa nhau nên khóc một lần từ giã Giờ thì đôi tay đan tay quấn quít Xin cho đêm đêm tình đầy mộng say...
kết quả: file index.txt
Cho 9,29, lòng 14,34, Giờ 18,38, nói 11,31, trống 4,24, đắng 14,34, tim 6,16,26,36, Ðôi 12,32, khóe 12,32, khóc 17,37, quấn 18,38, hoen 1,21, xa 11,17,31,37, lần 2,17,22,37, chiều 3,23, Nên 13,14,33,34, sáng 13,33, tím 3,23, áp 16,36, mây 3,7,23,27, môi 8,12,28,32, mơ 9,29, lẻ 9,29, cô 13,33, những 13,33, không 3,9,23,29, mắt 1,12,21,32, đi 3,23, loi 9,29, đêm 4,7,9,13,16,19,19,24,27,29,33,36,39,39, tay 2,18,18,22,38,38, lệ 12,32, theo 7,27, Làm 3,23, nên 17,37, tuôn 12,32, run 12,12,32,32, một 2,17,22,37, ngờ 16,36, lén 7,27, ngoan 8,28, đôi 1,18,21,38, chân 3,23, ấm 16,36, vào 7,27, nghe 4,16,24,36, vội 2,22, sang 14,34, héo 6,26, khi 2,14,22,34, từ 17,37, quít 18,38, Ðêm 7,11,27,31, Sau 2,22, len 7,27, thì 18,38, đan 18,38, úa 6,26, nhau 7,17,27,37, Tìm 8,28, hôn 2,22, xuân 14,34, em 4,6,11,11,13,24,26,31,31,33, giã 17,37, khuya 1,21, Từng 1,6,21,26, biếc 1,21, về 13,33, mộng 19,39, vắng 4,24, làn 8,28, hồn 7,27, nàn 8,28, tênh 4,24, chia 2,22, ngắt 3,23, tình 19,39, Ngỡ 17,37, qua 6,26, buồn 4,24, anh 2,11,22,31, đơn 13,33, đã 17,37, cơn 9,29, Xin 19,39, hạt 1,21, Anh 4,24, kịp 11,31, sương 1,21, cho 19,39, nồng 8,28, vã 2,22, như 14,34, Nào 16,36, tìm 7,27, ơi, 4,24, ngày 6,26, trái 14,34, thắm 8,28, say... 19,39, chưa 11,31, đầy 19,39, trôi 6,26, mơ, 9,29, nay 4,16,24,36, thiết 8,28,
đức said
Thầy cho em hỏi chút về phần này với ạ:Sau khi đếm được số lần xuất hiện các từ trong một filetext em muốn đưa ra các từ xuất hiện từ 2 lần trở lên và đếm số các từ xuất hiện từ 2 lần trở lên này thì phải làm thế nào ạ
Võ Văn Hải said
cái hashmap trong bài chứa từ và các vị trí xuất hiện rồi, bạn gọi phương thức count/size của cái arraylist là bạn có số lần xuất hiện. Bạn phải tư duy chút chứ!
đức said
Vâng,em cảm ơn thầy,đoạn này em thấy có vấn đề
while(sc.hasNextLine()) { line=sc.nextLine();
em sửa hasNextLine thành hasNext và nextLine thành next thì mới cho ra được kết quả như ý muốn thầy xem lại hộ em với ạ
31251992 said
thưa thầy em muốn đọc 1 file txt trong file txt đó có danh sách sinh viên được ghi theo các dòng.Giờ em muốn xây dựng một giao diện sinh viên như đưa ra danh sách,thêm,sửa,xóa…thì làm kiểu như thế nào.Thầy giúp em với ạ.