`
billgmh
  • 浏览: 65491 次
  • 性别: Icon_minigender_1
  • 来自: 广东广州
社区版块
存档分类
最新评论

原创中文分词代码分享(1.1)——词典接口

阅读更多
目前为止,已实现了1、一维线性表 2、首字Hash 3、双Hash 三种词典的存储结构与表现形式。

首先来看一下词典结构的接口Interface:
java 代码
  1. /* 
  2.  * @作者:Hades , 创建日期:2006-11-17 
  3.  * 
  4.  * 汕头大学03计算机本科 
  5.  *  
  6.  */  
  7. package edu.stu.cn.segment.matching.dictionary;  
  8.   
  9. import java.io.PrintStream;  
  10.   
  11. /** 
  12.  * @author Hades Guan 词典操作接口 
  13.  */  
  14. public interface DictionaryImpl  
  15. {  
  16.   
  17.     /** 
  18.      * 删除词典中的词word 
  19.      *  
  20.      * @param word 
  21.      *            待删除的词汇 
  22.      */  
  23.     public void deleteWord(String word);  
  24.   
  25.     /** 
  26.      * 将词汇word插入到词典文件中 
  27.      *  
  28.      * @param word 
  29.      *            待插入的词汇 
  30.      */  
  31.     public void insertWord(String word);  
  32.   
  33.     /** 
  34.      * 载入以文本格式存储的词典 
  35.      *  
  36.      * @param fileName 
  37.      *            词典的文件名 
  38.      */  
  39.     @SuppressWarnings("unchecked")  
  40.     public void loadDictionary(String fileName);  
  41.   
  42.     /** 
  43.      * 判断输入的字符串是否在词典中 
  44.      *  
  45.      * @param word 
  46.      *            待判断字符串 
  47.      * @return 判断结果 
  48.      */  
  49.     public boolean match(String word);  
  50.   
  51.     /** 
  52.      * 输出已载入内存中所有词汇 
  53.      *  
  54.      * @param out 
  55.      *            输出流 
  56.      */  
  57.     public void print(PrintStream out);  
  58.   
  59. }  
接口中定义了插入词汇、删除词汇、词汇查询、从txt文本文件中载入词典、将已载入的词典输出 五个操作。

接下来看一下一维线性表结构的词典接口实现类SimpleDictionary:
java 代码
  1. /* 
  2.  * @作者:Hades , 创建日期:2006-11-18 
  3.  * 
  4.  * 汕头大学03计算机本科 
  5.  *  
  6.  */  
  7. package edu.stu.cn.segment.matching.dictionary;  
  8.   
  9. import java.io.BufferedReader;  
  10. import java.io.FileReader;  
  11. import java.io.IOException;  
  12. import java.io.PrintStream;  
  13. import java.io.Serializable;  
  14. import java.util.ArrayList;  
  15. import java.util.Collections;  
  16.   
  17. /** 
  18.  * @author Hades Guan 简单顺序词典接口 
  19.  */  
  20. public class SimpleDictionary implements Serializable, DictionaryImpl  
  21. {  
  22.     /** 
  23.      * serialVersionUID 的注释 
  24.      */  
  25.     private static final long serialVersionUID = -6631832710612755332L;  
  26.   
  27.     /** 
  28.      * 词典容器 
  29.      */  
  30.     private ArrayList<string> dic = </string>new ArrayList<string>();  </string>
  31.   
  32.     /** 
  33.      * 删除词典中的词word 
  34.      *  
  35.      * @param word 
  36.      *            待删除的词汇 
  37.      */  
  38.     public void deleteWord(String word)  
  39.     {  
  40.         if (word == null)  
  41.             return;  
  42.         int pos;  
  43.         // 判断原词典中是否已有该词汇  
  44.         if ((pos = Collections.binarySearch(dic, word)) < 0)  
  45.             return;  
  46.         else  
  47.             dic.remove(pos);  
  48.     }  
  49.   
  50.     /** 
  51.      * 将词汇word插入到词典文件中 
  52.      *  
  53.      * @param word 
  54.      *            待插入的词汇 
  55.      */  
  56.     public void insertWord(String word)  
  57.     {  
  58.         if (word == null)  
  59.             return;  
  60.         // 判断原词典中是否已有该词汇  
  61.         if (Collections.binarySearch(dic, word) < 0)  
  62.             dic.add(word);  
  63.         // 插入后重新排序  
  64.         Collections.sort(dic);  
  65.     }  
  66.   
  67.     /** 
  68.      * 载入以文本格式存储的词典 
  69.      *  
  70.      * @param fileName 
  71.      *            词典的文件名 
  72.      */  
  73.     public void loadDictionary(String fileName)  
  74.     {  
  75.         try  
  76.         {  
  77.             // 初始化输入流  
  78.             BufferedReader in = new BufferedReader(new FileReader(fileName));  
  79.             String word = null;  
  80.   
  81.             // 读取词典  
  82.             while ((word = in.readLine()) != null)  
  83.             {  
  84.                 dic.add(word);  
  85.             }  
  86.             // 词典排序  
  87.             Collections.sort(dic);  
  88.             // 关闭输入  
  89.             in.close();  
  90.         }  
  91.         catch (IOException e)  
  92.         {  
  93.             // TODO 自动生成 catch 块  
  94.             e.printStackTrace();  
  95.         }  
  96.     }  
  97.   
  98.     /** 
  99.      * 判断输入的字符串是否在词典中 
  100.      *  
  101.      * @param word 
  102.      *            待判断字符串 
  103.      * @return 判断结果 
  104.      */  
  105.     public boolean match(String word)  
  106.     {  
  107.         int pos = Collections.binarySearch(dic, word);  
  108.         if (pos >= 0)  
  109.             return true;  
  110.         else  
  111.             return false;  
  112.     }  
  113.   
  114.     /** 
  115.      * 输出已载入内存中所有词汇 
  116.      *  
  117.      * @param out 
  118.      *            输出流 
  119.      */  
  120.     public void print(PrintStream out)  
  121.     {  
  122.         for (int i = 0; i < this.dic.size(); i++)  
  123.         {  
  124.             out.println(dic.get(i));  
  125.         }  
  126.         out.flush();  
  127.     }  
  128.   
  129. }  
SimpleDictionary类实现了自定义的DictionaryImpl接口外还实现了序列化,这样做的目的是希望能把从原始文本资料中载入的词汇排序整理后以序列化的形式写成文件,以后需要使用时直接从文件中载入就可以使用了,省去了不少初始化的麻烦。后面提到的词典实现类也都实现了序列化。

接着是首字Hash结构词典实现类HashDictionary:
java 代码
  1. /* 
  2.  * @作者:Hades , 创建日期:2006-11-19 
  3.  * 
  4.  * 汕头大学03计算机本科 
  5.  *  
  6.  */  
  7. package edu.stu.cn.segment.matching.dictionary;  
  8.   
  9. import java.io.BufferedReader;  
  10. import java.io.FileReader;  
  11. import java.io.IOException;  
  12. import java.io.PrintStream;  
  13. import java.io.Serializable;  
  14. import java.util.ArrayList;  
  15. import java.util.Collections;  
  16. import java.util.Hashtable;  
  17.   
  18. /** 
  19.  * @author Hades Guan 单层哈希字典操作类 
  20.  */  
  21. public class HashDictionary implements DictionaryImpl, Serializable  
  22. {  
  23.     /** 
  24.      * serialVersionUID 的注释 
  25.      */  
  26.     private static final long serialVersionUID = -436844886894530829L;  
  27.   
  28.     /** 
  29.      * 词典 
  30.      */  
  31.     private Hashtablenew Hashtable
  32.   
  33.     /** 
  34.      * 删除词典中的词word 
  35.      *  
  36.      * @param word 
  37.      *            待删除的词汇 
  38.      */  
  39.     public void deleteWord(String word)  
  40.     {  
  41.         if (word == null)  
  42.             return;  
  43.         // 截取首字  
  44.         String fch = word.substring(01);  
  45.         if (dic.containsKey(fch))  
  46.         {  
  47.             // 获取词汇表  
  48.             ArrayList<string> wal = dic.get(fch);  </string>
  49.             // 截取词汇剩余部分  
  50.             String leftWord = word.substring(1);  
  51.             // 查找该词汇是否存在于词汇表中  
  52.             int pos = Collections.binarySearch(wal, leftWord);  
  53.             // 存在时删除  
  54.             if (pos >= 0)  
  55.             {  
  56.                 wal.remove(pos);  
  57.                 dic.put(fch, wal);  
  58.             }  
  59.         }  
  60.     }  
  61.   
  62.     /** 
  63.      * 将词汇word插入到词典文件中 
  64.      *  
  65.      * @param word 
  66.      *            待插入的词汇 
  67.      */  
  68.     public void insertWord(String word)  
  69.     {  
  70.         if (word == null)  
  71.             return;  
  72.         // 截取首字  
  73.         String fch = word.substring(01);  
  74.         // 词汇表  
  75.         ArrayList<string> wal = null;  </string>
  76.         if (dic.containsKey(fch))  
  77.             wal = dic.get(fch);  
  78.         else  
  79.             wal = new ArrayList<string>();  </string>
  80.         // 截取词汇剩余部分  
  81.         String leftWord = word.substring(1);  
  82.         // 判断词汇表中是否已有该词汇  
  83.         if (Collections.binarySearch(wal, leftWord) < 0)  
  84.         {  
  85.             wal.add(leftWord);  
  86.             Collections.sort(wal);  
  87.             dic.put(fch, wal);  
  88.         }  
  89.     }  
  90.   
  91.     /** 
  92.      * 载入以文本格式存储的词典 
  93.      *  
  94.      * @param fileName 
  95.      *            词典的文件名 
  96.      */  
  97.     public void loadDictionary(String fileName)  
  98.     {  
  99.         try  
  100.         {  
  101.             // 初始化输入流  
  102.             BufferedReader in = new BufferedReader(new FileReader(fileName));  
  103.             String word = null;  
  104.   
  105.             // 读取词典  
  106.             while ((word = in.readLine()) != null)  
  107.             {  
  108.                 // 插入词汇  
  109.                 this.insertWord(word.trim());  
  110.             }  
  111.         }  
  112.         catch (IOException e)  
  113.         {  
  114.             // TODO 自动生成 catch 块  
  115.             e.printStackTrace();  
  116.         }  
  117.     }  
  118.   
  119.     /** 
  120.      * 判断输入的字符串是否在词典中 
  121.      *  
  122.      * @param word 
  123.      *            待判断字符串 
  124.      * @return 判断结果 
  125.      */  
  126.     public boolean match(String word)  
  127.     {  
  128.         if (word == null)  
  129.             return false;  
  130.         // 截取首字  
  131.         String fch = word.substring(01);  
  132.         // 判断词汇表是否有此首字  
  133.         if (!dic.containsKey(fch))  
  134.             return false;  
  135.         // 获取词汇表  
  136.         ArrayList<string> wal = dic.get(fch);  </string>
  137.         // 截取词汇剩余部分  
  138.         String leftWord = word.substring(1);  
  139.   
  140.         // 折半查找  
  141.         int pos = Collections.binarySearch(wal, leftWord);  
  142.   
  143.         return (pos >= 0);  
  144.     }  
  145.   
  146.     /** 
  147.      * 输出已载入内存中所有词汇 
  148.      *  
  149.      * @param out 
  150.      *            输出流 
  151.      */  
  152.     public void print(PrintStream out)  
  153.     {  
  154.         // 获取首字集合  
  155.         for (String fch : dic.keySet())  
  156.         {  
  157.             out.println("首字:" + fch);  
  158.             for (String w : dic.get(fch))  
  159.                 out.println("\t" + w);  
  160.         }  
  161.         out.flush();  
  162.     }  
  163.   
  164. }  
首字Hash结构中是使用Hashtable类作为基础,其中key为词汇的首字,如:“关心”中的“关”字,而value则是ArrayList类型的一维线性表,存储的是相同首字的词汇列表。
基于这种结构,查询时先把字符串的首个字符作为key,若Hashtable中不包含这个key则返回false,否则取出改线性表value后使用折半查找的方法查询。
分享到:
评论

相关推荐

    Delphi实现的简单中文分词v1.1

    首先,我们来看标题中的核心——"简单中文分词v1.1"。这表明该系统是一个针对中文文本的分词工具,版本号为1.1,意味着它已经过至少一次的升级和优化。分词,即把连续的汉字序列切分成具有独立语义的词语,是理解和...

    Lucene中文分词组件 JE-Analysis 1.5.1

    1.1 —— 2006-06-06 增加扩展词典的静态读取方法 1.0.1 —— 2006-06-02 修正无法识别生僻字的问题 1.0 —— 2006-05-29 支持英文、数字、中文(简体)混合分词 常用的数量和人名的匹配 超过22万...

    IKAnalyzer中文分词器V3.1.1使用手册

    最初作为开源项目Lucene的一部分,它主要服务于该搜索引擎框架,通过结合词典分词与语法分析算法实现了中文文本的高效分词。 ##### 1.1 结构设计 - **正向迭代最细粒度切分算法**:这是IKAnalyzer的核心算法之一,...

    Lucene中文分词组件 JE-Analysis 1.4.0

    1.1 —— 2006-06-06 增加扩展词典的静态读取方法 1.0.1 —— 2006-06-02 修正无法识别生僻字的问题 1.0 —— 2006-05-29 支持英文、数字、中文(简体)混合分词 常用的数量和人名的匹配 超过22万...

    elasticsearch-analysis-ik-7.4.0.zip

    标题中的"elasticsearch-analysis-ik-7.4.0.zip"指的是Elasticsearch的一个插件——IK分词器的7.4.0版本。这个插件是为了解决Elasticsearch在处理中文文本时的分词问题,因为Elasticsearch默认的分析器主要针对英文...

    垂直搜索-您不知道的秘密 -solr中国-风雨V1.1

    - **分词(Term)**:索引中的最小单位,如中文句子中的“马上”可以被分词为“马”、“上”两个词。 - **词典**:包含了大量词汇或短语的集合,用于提高搜索准确性。 - **相关度**:衡量搜索结果与用户查询关键词...

    解密搜索引擎技术实战:Lucene&Java精华版

    **第4章**“中文分词原理与实现”详细探讨了中文分词的相关理论和技术实现。这一章节覆盖了中文分词的基本原理、算法实现、分词流程、未登录词识别等多个方面: - **4.1 Lucene中的中文分词**: - **4.1.1 Lucene...

    关键词密度分布法在偏重摘要中的应用研究

    随着互联网的迅猛发展,海量信息的出现使得用户面临一个严峻的问题——如何从这些庞杂的信息中快速准确地提取出自己所需的内容。传统的搜索引擎虽然能够帮助用户定位到相关文档,但往往需要用户自行阅读全文以筛选出...

    Text-Mining-2020

    例如,使用NLTK(Natural Language Toolkit)库进行英文文本的预处理,使用jieba进行中文文本的分词。 1.2 信息抽取:通过模式匹配、关键词匹配或基于规则的方法,从文本中提取结构化的信息,如人名、地名、事件等...

Global site tag (gtag.js) - Google Analytics