[Java] 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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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
 */
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:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
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,

Đăng nhận xét

Mới hơn Cũ hơn

Bài viết mới nhất

CẦN THIẾT