分詞器代碼
1 package www.ygh.fenciqiUtils;
2
3 import java.io.FileReader;
4 import java.util.ArrayList;
5 import java.util.IdentityHashMap;
6 import java.util.List;
7 import java.util.Map;
8 import java.util.Set;
9
10 /**
11 * 最終返回的結果:
12 * 1:表示關鍵字
13 * 2:普通的非關鍵字符串
14 * 3:整數(暫不支持小數)
15 * 4:運算符
16 * 5:分隔符
17 * @author Administrator
18 *
19 */
20 public class CFenCiQi {
21 // 初始化集合list1,用於存在關鍵字
22 private List<String> list1 = new ArrayList<String>();
23
24 // 定義集合list4,用於存放運算符號
25 private List<String> list4 = new ArrayList<String>();
26
27 // 定義集合list5,用於存放分用於存放分隔符號
28 private List<String> list5 = new ArrayList<String>();
29
30 // 定義集合list3
31 private List<String> list3 = new ArrayList<String>();
32
33 //"C:\\Users\\Administrator\\Desktop\\test_c.c"
34 private String filePath;
35
36 private List<Map<String, String>> mapList = new ArrayList<Map<String, String>>();
37
38 private int temp = 0;
39
40 private int match_1 = 0;
41
42 private int match_4 = 0;
43
44 private int match_3 = 0;
45
46 private int ch = 0;
47 private String str1 = "";
48
49 public CFenCiQi(String filePath) {
50 this.filePath = filePath;
51 }
52
53
54
55 public CFenCiQi() {
56
57 }
58
59
60 /**
61 * 初始化關鍵字,運算符,分隔符等list集合
62 */
63 public void init() {
64
65 // 初始化集合list1,用於存在關鍵字
66 list1.add("if");
67 list1.add("int");
68 list1.add("for");
69 list1.add("while");
70 list1.add("do");
71 list1.add("return");
72 list1.add("break");
73 list1.add("continue");
74
75 // 初始化集合list4,用於存放運算符號
76 list4.add("+");
77 list4.add("-");
78 list4.add("*");
79 list4.add("/");
80 list4.add("=");
81 list4.add(" ");
82 list4.add("<");
83 list4.add(" =");
84 list4.add("<=");
85 list4.add("!=");
86
87 // 初始化集合list5,用於存放分隔符號
88 list5.add(",");
89 list5.add(";");
90 list5.add("{");
91 list5.add("}");
92 list5.add("(");
93 list5.add(")");
94
95 // 初始化集合list3,用於存放數組字符
96 list3.add("0");
97 list3.add("1");
98 list3.add("2");
99 list3.add("3");
100 list3.add("4");
101 list3.add("5");
102 list3.add("6");
103 list3.add("7");
104 list3.add("8");
105 list3.add("9");
106
107 }
108
109 /**
110 * 判斷字符是否和運算符匹配
111 * @param c
112 * @return
113 */
114 public boolean match_2(String c) {
115 for (String str : list4) {
116 if (c.equals(str)) {
117 return true;
118 }
119 }
120 return false;
121 }
122
123 /**
124 * 判斷字符是否和分隔符匹配
125 * @param c
126 * @return
127 */
128 public boolean match_4(String c) {
129 for (String str : list5) {
130 if (c.equals(str)) {
131 return true;
132 }
133 }
134 return false;
135 }
136
137 /**
138 * 判斷讀取的字符是否和數字匹配
139 * @param c
140 * @return
141 */
142 public boolean match_3(String c) {
143 for (String str : list3) {
144 if (c.equals(str)) {
145 return true;
146 }
147 }
148 return false;
149 }
150
151 /**
152 * 進行分詞
153 * @throws Exception
154 */
155 public void getFenCi() throws Exception {
156
157
158 //讀取文件的路徑
159 FileReader fileReader = new FileReader(filePath);
160 //挨個讀取字符
161 while ((ch = fileReader.read()) != -1) {
162
163 char c = (char) ch;
164 if (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z') {
165
166 if (match_4 == 1) {
167 matchEqual_4();
168 }
169
170 if (match_3 == 1) {
171 matchEqual_3();
172 }
173
174 str1 = str1 + c;
175 match_1 = 1;
176
177 } else if (match_4(c + "")) {
178 if(match_1==1){
179 matchEqual_1();
180 }
181
182 if (match_4 == 1) {
183 matchEqual_4();
184
185 }
186
187 if (match_3 == 1) {
188 matchEqual_3();
189 }
190
191 str1 = "";
192 str1 = str1 + c;
193 setValue("5", str1);
194 str1 = "";
195
196 } else if (match_2(c + "")) {
197 if(match_1==1){
198 matchEqual_1();
199 }
200
201 if (match_3 == 1) {
202 matchEqual_3();
203 }
204
205 str1 = str1 + c;
206 match_4 = 1;
207
208 } else if (match_3(c + "")) {
209 if(match_1==1){
210 matchEqual_1();
211 }
212
213 if (match_4 == 1) {
214 matchEqual_4();
215 }
216
217 str1 = str1 + c;
218 match_3 = 1;
219 }
220 }
221 fileReader.close();
222 }
223
224 /**
225 * 設置集合裡面的值
226 * @param id
227 * @param value
228 */
229 public void setValue(String id, String value) {
230 Map<String, String> fenci = new IdentityHashMap<String, String>();
231 fenci.put(id, value);
232 mapList.add(fenci);
233 }
234
235 public void matchEqual_1() {
236 temp = 0;
237 for (String str : list1) {
238 if (str.equals(str1)) {
239 setValue("1", str1);
240 temp = 1;
241 break;
242 }
243 }
244
245 if (temp == 0) {
246 setValue("2", str1);
247 }
248
249 match_1 = 0;
250 str1 = "";
251 }
252
253 /**
254 * 字符串為數字的處理方法
255 */
256 public void matchEqual_3() {
257 setValue("3", str1);
258 match_3 = 0;
259 str1 = "";
260 }
261
262 /**
263 * 字符串為運算符的處理方法
264 */
265 public void matchEqual_4() {
266 setValue("4", str1);
267 match_4 = 0;
268 str1 = "";
269 }
270
271
272 /**
273 * 使用默認的分詞器,默認支持c語言
274 * @return
275 * @throws Exception
276 */
277 public List<Map<String, String>> getResult() throws Exception {
278 //如果沒有實現自定義分詞,那麼就使用默認分詞,如果有,實現自定義分詞
279 if(this.list1==null || this.list4==null || this.list5 ==null){
280 init();
281 }
282 getFenCi();
283 return this.mapList;
284 }
285
286
287 /**
288 * 對封裝的分詞結果進行專業的toSting
289 * @param mapList1
290 */
291 public static void getString(List<Map<String, String>> mapList1){
292 for(Map<String, String> map:mapList1){
293 Set<String> keySet = map.keySet();
294 for(String key:keySet){
295 System.out.print("{"+key+"-->"+map.get(key)+"}");
296 }
297 System.out.print(",");
298 }
299 System.out.println();
300 }
301
302 /**
303 * 設置需要分詞源文件的路徑
304 * @param filePath
305 */
306 public void setFilePath(String filePath) {
307 this.filePath = filePath;
308 }
309
310 /**
311 * 指定分詞的關鍵字,運算符和分隔符,幫你分詞
312 * @param keyList 指定關鍵字的集合
313 * @param calculateList 指定運算符集合
314 * @param sperateList 指定分隔符集合
315 */
316 public void setDefaultParam(List<String> keyList,List<String> calculateList,List<String> separateList){
317 this.list1 = keyList;
318 this.list4 = calculateList;
319 this.list5 = separateList;
320 }
321
322
323
324 }
分詞器測試代碼
package www.ygh.test;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.junit.Test;
import www.ygh.fenciqiUtils.CFenCiQi;
public class Test_FenCiQi {
// 初始化集合list1,用於存在關鍵字
private List<String> list1 = new ArrayList<String>();
// 定義集合list4,用於存放運算符號
private List<String> list4 = new ArrayList<String>();
// 定義集合list5,用於存放分用於存放分隔符號
private List<String> list5 = new ArrayList<String>();
// c語言源代碼路徑
public String filePath = "C:\\Users\\Administrator\\Desktop\\test_c.c";
// java語言源代碼路徑
public String filePath2 = "C:\\Users\\Administrator\\Desktop\\fenci.java";
/**
* 使用系統默認的分詞,只支持c語言
*
* @throws Exception
*/
@Test
public void test_1() throws Exception {
// 創建分詞器對象
CFenCiQi cFenCiQi = new CFenCiQi();
// 設置源代碼路徑
cFenCiQi.setFilePath(filePath);
// 進行分詞,並且獲取結果
List<Map<String, String>> mapList = cFenCiQi.getResult();
System.out.println(mapList.size());
CFenCiQi.getString(mapList);
}
/**
* 測試自定義的c語言分詞
*
* @throws Exception
*/
@Test
public void test_2() throws Exception {
//初始化c語言的分詞條件
fun1();
// 創建分詞器對象
CFenCiQi cFenCiQi = new CFenCiQi();
//把自定義的分詞條件傳入
cFenCiQi.setDefaultParam(list1, list4, list5);
//傳入源代碼路徑
cFenCiQi.setFilePath(filePath);
List<Map<String, String>> mapList = cFenCiQi.getResult();
CFenCiQi.getString(mapList);
}
/**
* 測試自定義的java的分詞
*
* @throws Exception
*/
@Test
public void test_3() throws Exception {
fun2();
CFenCiQi cFenCiQi = new CFenCiQi();
cFenCiQi.setDefaultParam(list1, list4, list5);
cFenCiQi.setFilePath(filePath2);
List<Map<String, String>> mapList = cFenCiQi.getResult();
CFenCiQi.getString(mapList);
}
/**
* 初始化c語言分詞條件
*/
public void fun1() {
// 初始化集合list1,用於存c語言在關鍵字
list1.add("if");
list1.add("int");
list1.add("for");
list1.add("while");
list1.add("do");
list1.add("return");
list1.add("break");
list1.add("continue");
// 初始化集合list4,用於c語言存放運算符號
list4.add("+");
list4.add("-");
list4.add("*");
list4.add("/");
list4.add("=");
list4.add(" ");
list4.add("<");
list4.add(" =");
list4.add("<=");
list4.add("!=");
// 初始化集合list5,用於存放c語言分隔符號
list5.add(",");
list5.add(";");
list5.add("{");
list5.add("}");
list5.add("(");
list5.add(")");
}
/**
* 初始化java的分詞條件
*/
public void fun2() {
// 初始化集合list1,用於存在java關鍵字
list1.add("if");
list1.add("int");
list1.add("for");
list1.add("while");
list1.add("do");
list1.add("return");
list1.add("break");
list1.add("public");
list1.add("class");
list1.add("void");
list1.add("list");
list1.add("out");
list1.add("static");
list1.add("new");
list1.add("char");
list1.add("private");
list1.add("this");
list1.add("import");
list1.add("package");
// 初始化集合list4,用於java存放運算符號
list4.add("+");
list4.add("-");
list4.add("*");
list4.add("/");
list4.add("=");
list4.add(" ");
list4.add("<");
list4.add(" =");
list4.add("<=");
list4.add("!=");
// 初始化集合list5,用於存放java分隔符號
list5.add(",");
list5.add(";");
list5.add("{");
list5.add("}");
list5.add("(");
list5.add(")");
}
}
只是一個簡單的實現,還有很多不足的地方,希望大家幫忙提提意見,修改修改