程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> 寫一個簡單的分詞器,簡單分詞器

寫一個簡單的分詞器,簡單分詞器

編輯:JAVA綜合教程

寫一個簡單的分詞器,簡單分詞器


分詞器代碼

  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(")");

    }
}

只是一個簡單的實現,還有很多不足的地方,希望大家幫忙提提意見,修改修改

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved