Võ Văn Hải's blog

Chỉ có một điều tuyệt đối đó là mọi thứ đều tương đối…

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,

4 Responses to “Thống kê các từ trong một văn bản”

  1. đứ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 ạ

  2. 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ứ!

  3. đứ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 ạ

  4. 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 ạ.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Connecting to %s

 
Follow

Get every new post delivered to your Inbox.

Join 230 other followers