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,

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

  5. vietha said

    thầy cho em hỏi giờ em muốn đổi vị trí của các từ trong file txt đó thì phải làm sao ạ.

  6. tạ said

    em chào các bác, em là người ngoại đạo không biết tí gì về lập trình trên notepad, em search “phần mềm thống kê từ” thì vào đến đây, tuy nhiên lại không biết làm thế nào để sử dụng file trên của bác ạ. Bác nào làm ơn chỉ giúp em chi tiết chút cách cài đặt file trên để chạy được chương trình được không ạ? vd có phải có bước là mình “ctrl A” để copy toàn bộ nội dung “package abc;
    02

    03
    import java.io.FileInputStream;
    …..
    e.printStackTrace();
    76
    }
    77
    }
    78
    }
    rồi về dán vào một trang mới (new) trên notepad không ạ? sau đó làm thế nào tiếp với file txt…em nhờ các bác chỉ giúp ạ. Em cám ơn các bác rất nhiều! em đang rất cần dùng chương trình này mà chua làm thế nào dùng được.

  7. Võ Đức Hùng said

    Thầy Võ Văn Hải ơi em copy nguyên cái code này vào sao không được vậy nhị. thực sự em rất cần cái code như thế này, code này thiếu cái gì thầy giúp em bổ xung với

  8. ngoz said

    dem xem trong mot file van ban co bao nhiu cau.. biet ket thuc cau la 1 dau cham

  9. ngoz said

    thay giup dum e!!! đếm xem trong 1 file văn bản có bao nhiu câu.kết thúc câu bằng dấu chấm

  10. Navy said

    Thầy ơi. Em có một file tudien.txt để lưu từ điển tiếng việt, dạng như sau:
    Em

    Học
    Sinh
    Học sinh
    Tự động hóa

    Bài toán của em là: Nhập vào một xâu tiếng việt bất kì. vd như xâu : “Em là học sinh”.
    Đầu tiên em muốn :
    Kiểm tra từ “Em” có trong file hay không?
    (nếu có) { Kiểm tra từ ” Em là” có trong file hay không? }
    (nếu ko) { Kiểm tra từ ” là” có trong file hay không? }
    ———–
    Kiểm tra từ “Em là” có trong file hay không?
    (nếu có) { Kiểm tra từ ” Em là học” có trong file hay không? }
    (nếu ko) { Hiển thị từ “Em” ra một JList }
    ———–
    Kiểm tra từ “là” có trong file hay không?
    (nếu có) { Kiểm tra từ ” là học” có trong file hay không? }
    (nếu ko) { Kiểm tra từ “học” có trong file hay ko? }
    ———–
    Tiếp tục như thế cho đến khi hết xâu đã nhập.
    Như vậy ở đây yêu cầu của bài toán là làm sao từ xâu đầu vào ta tách được các từ có số tiếng nhiều nhất có thể, mà các từ đó có trong từ điển đã cho.
    Kết quả hiển thị ra một JList.
    VD ở xâu trên thì kết quả JList sẽ là:
    Em

    học sinh
    ———————–
    Em mong thầy chỉ giúp em. Em cảm ơn thầy. Chúc thầy nhiều sức khỏe ạ!

Leave a comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.