论坛首页 Java企业应用论坛

原创中文分词代码分享(2.1)——基于词典的分词接口

浏览 3015 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-12-28  
现在来看一下基于词典的分词接口(最大匹配法)。先来看一下分词处理的接口SegmentProcessorImpl:
java 代码
  1. /* 
  2.  * @作者:Hades , 创建日期:2006-11-17 
  3.  * 
  4.  * 汕头大学03计算机本科 
  5.  *  
  6.  */  
  7. package edu.stu.cn.segment.matching.processor;  
  8.   
  9. import java.util.LinkedList;  
  10.   
  11. import edu.stu.cn.segment.matching.dictionary.DictionaryImpl;  
  12.   
  13. /** 
  14.  *  
  15.  * @author Hades Guan 中文分词接口 
  16.  */  
  17. public interface SegmentProcessorImpl  
  18. {  
  19.   
  20.     /** 
  21.      * 对srcFile文件进行分词,把结果保存为到tagFile文件中 
  22.      *  
  23.      * @param srcFile 
  24.      *            待分词的文本文件 
  25.      * @param tagFile 
  26.      *            分词结果保存目的文件 
  27.      */  
  28.     public void fileProcessor(String srcFile, String tagFile);  
  29.   
  30.     /** 
  31.      * @return 返回 dic。 
  32.      */  
  33.     public DictionaryImpl getDic();  
  34.   
  35.     /** 
  36.      * @param dic 
  37.      *            要设置的 dic。 
  38.      */  
  39.     public void setDic(DictionaryImpl dic);  
  40.   
  41.     /** 
  42.      * 对text文本进行分词,把结果保存为字符串链表 
  43.      *  
  44.      * @param text 
  45.      *            待分词的文本 
  46.      * @return 分词结果 
  47.      */  
  48.     public LinkedList<string> textProcess(String text);  </string>
  49.   
  50. }  
接口中定义了4个方法:设置词典setDic,获取词典getDic,对源文件分词后写入目标文件fileProcessor,对text字符串进行分词后返回结果链表textProcess。

接着是实现了SegmentProcessorImpl接口的抽象类MaxSegmentProcessor:
java 代码
  1. /* 
  2.  * @作者:Hades , 创建日期:2006-11-17 
  3.  * 
  4.  * 汕头大学03计算机本科 
  5.  *  
  6.  */  
  7. package edu.stu.cn.segment.matching.processor;  
  8.   
  9. import java.io.BufferedReader;  
  10. import java.io.BufferedWriter;  
  11. import java.io.FileNotFoundException;  
  12. import java.io.FileReader;  
  13. import java.io.FileWriter;  
  14. import java.io.IOException;  
  15. import java.io.PrintWriter;  
  16. import java.util.LinkedList;  
  17.   
  18. import edu.stu.cn.segment.matching.dictionary.DictionaryImpl;  
  19.   
  20. /** 
  21.  * @author Hades Guan 基于词典匹配的中文分词抽象类 
  22.  */  
  23. public abstract class MatchSegmentProcessor implements SegmentProcessorImpl  
  24. {  
  25.     /** 
  26.      * 词典操作类 
  27.      */  
  28.     protected DictionaryImpl dic = null;  
  29.   
  30.     /** 
  31.      * 分隔符字符串 
  32.      */  
  33.     protected String seperator = null;  
  34.   
  35.     /** 
  36.      * 英文数字字符集 
  37.      */  
  38.     protected final String CHAR_AND_NUM = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";  
  39.   
  40.     /** 
  41.      * 初始化分隔符的方法 
  42.      */  
  43.     protected void initSeperator()  
  44.     {  
  45.         // 初始化分隔符  
  46.         StringBuffer buffer = new StringBuffer();  
  47.         for (char c = '\u0000'; c <= '\u007F'; c++)  
  48.         {  
  49.             // 不过滤英文、数字字符  
  50.             if (this.CHAR_AND_NUM.indexOf(c) < 0)  
  51.                 buffer.append(c);  
  52.         }  
  53.         for (char c = '\uFF00'; c <= '\uFFEF'; c++)  
  54.             buffer.append(c);  
  55.         buffer.append("《》?,。、:“;‘’”『』【】-―—─=÷+§·~!◎#¥%…※×() ");  
  56.         this.seperator = buffer.toString();  
  57.     }  
  58.   
  59.     /** 
  60.      * 对srcFile文件进行分词,把结果保存为到tagFile文件中 
  61.      *  
  62.      * @param srcFile 
  63.      *            待分词的文本文件 
  64.      * @param tagFile 
  65.      *            分词结果保存目的文件 
  66.      */  
  67.     public void fileProcessor(String srcFile, String tagFile)  
  68.     {  
  69.         try  
  70.         {  
  71.             // 初始化输入输出  
  72.             BufferedReader in = new BufferedReader(new FileReader(srcFile));  
  73.             PrintWriter out = new PrintWriter(new BufferedWriter(  
  74.                     new FileWriter(tagFile)));  
  75.   
  76.             // 读入文件  
  77.             String line = null;  
  78.             StringBuffer buffer = new StringBuffer();  
  79.             while ((line = in.readLine()) != null)  
  80.             {  
  81.                 buffer.append(line);  
  82.             }  
  83.             // 关闭输入  
  84.             in.close();  
  85.   
  86.             // 分词处理  
  87.             LinkedList<string> result = this.textProcess(buffer.toString()  </string>
  88.                     .trim());  
  89.   
  90.             // 将结果写入文件  
  91.             for (String w : result)  
  92.                 out.println(w);  
  93.             // 关闭输出  
  94.             out.flush();  
  95.             out.close();  
  96.         }  
  97.         catch (FileNotFoundException e)  
  98.         {  
  99.             // TODO 自动生成 catch 块  
  100.             e.printStackTrace();  
  101.         }  
  102.         catch (IOException e)  
  103.         {  
  104.             // TODO 自动生成 catch 块  
  105.             e.printStackTrace();  
  106.         }  
  107.     }  
  108.   
  109.     /** 
  110.      * @return 返回 dic。 
  111.      */  
  112.     public DictionaryImpl getDic()  
  113.     {  
  114.         return dic;  
  115.     }  
  116.   
  117.     /** 
  118.      * @param dic 
  119.      *            要设置的 dic。 
  120.      */  
  121.     public void setDic(DictionaryImpl dic)  
  122.     {  
  123.         this.dic = dic;  
  124.     }  
  125.   
  126.     /** 
  127.      * 对text文本进行分词,把结果保存为字符串链表 
  128.      *  
  129.      * @param text 
  130.      *            待分词的文本 
  131.      * @return 分词结果 
  132.      */  
  133.     abstract public LinkedList<string> textProcess(String text);  </string>
  134. }  
抽象类中实现了具体实现类中相同的操作:设置词典setDic,获取词典getDic,初始化分隔字符(如:逗号,句号等)initSeperator,文件操作fileProcessor(先从源文件中读入内容构建成为字符串后,调用textProcess操作进行分词,最后将结果输出到目标文件中)。
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics