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

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

阅读更多
接着是正向最大匹配的实现类MaxMatchSegmentProcessor:
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. import java.util.StringTokenizer;  
  11.   
  12. import edu.stu.cn.segment.matching.dictionary.DictionaryImpl;  
  13.   
  14. /** 
  15.  * @author Hades Guan 正向最大匹配分词法操作类 
  16.  */  
  17. public class MaxMatchSegmentProcessor extends MatchSegmentProcessor  
  18. {  
  19.     /** 
  20.      * 字符串分隔器 
  21.      */  
  22.     private StringTokenizer tokenizer = null;  
  23.   
  24.     /** 
  25.      * 默认构造函数 
  26.      */  
  27.     public MaxMatchSegmentProcessor()  
  28.     {  
  29.         this.initSeperator();  
  30.     }  
  31.   
  32.     /** 
  33.      * 以一个词典操作类实例为参数的构造函数 
  34.      *  
  35.      * @param dic 
  36.      *            词典操作类实例 
  37.      */  
  38.     public MaxMatchSegmentProcessor(DictionaryImpl dic)  
  39.     {  
  40.         this.dic = dic;  
  41.         this.initSeperator();  
  42.     }  
  43.   
  44.     /** 
  45.      * 对text文本进行分词,把结果保存为字符串链表 
  46.      *  
  47.      * @param text 
  48.      *            待分词的文本 
  49.      * @return 分词结果 
  50.      */  
  51.     public LinkedList<string> textProcess(String text)  </string>
  52.     {  
  53.         if (text == null)  
  54.             return null;  
  55.   
  56.         // 初始化结果链表  
  57.         LinkedList<string> result = new LinkedList<string>();  </string></string>
  58.         // 对待分词文本进行分隔  
  59.         this.tokenizer = new StringTokenizer(text, this.seperator);  
  60.         while (tokenizer.hasMoreTokens())  
  61.         {  
  62.             String token = tokenizer.nextToken();  
  63.   
  64.             // 判断分隔文本是否为null  
  65.             if (token == null)  
  66.                 continue;  
  67.   
  68.             // 初始化位置标签  
  69.             int pos = 0;  
  70.             // 当前分隔文本长度  
  71.             int len = token.length();  
  72.             // 结尾位置  
  73.             int end = len;  
  74.             // 循环匹配  
  75.             while (pos < len)  
  76.             {  
  77.                 while (end > pos)  
  78.                 {  
  79.                     // 判断end处字符是否为数字或英文字母  
  80.                     if (end > 0  
  81.                             && CHAR_AND_NUM.indexOf(token.charAt(end - 1)) >= 0)  
  82.                     {  
  83.                         // 记录英语字母开始位置、英语字母结束位置  
  84.                         int englishEnd = end, englishStart = end;  
  85.                         while (englishStart > 0  
  86.                                 && CHAR_AND_NUM.indexOf(token  
  87.                                         .charAt(englishStart - 1)) >= 0)  
  88.                             englishStart--;  
  89.                         // 判断当位置标签指向当前英文串首地址时将结果插入分词结果集  
  90.                         if (pos == englishStart)  
  91.                         {  
  92.                             result.add(token  
  93.                                     .substring(englishStart, englishEnd));  
  94.                             pos = end;  
  95.                             end = len;  
  96.                         }  
  97.                     }  
  98.                     // end of 判断end处字符是否为数字或英文字母  
  99.   
  100.                     // 判断分段是否已分析完毕  
  101.                     if (end > pos)  
  102.                     {  
  103.                         // 汉字处理  
  104.                         String word = token.substring(pos, end);  
  105.                         if (dic.match(word))  
  106.                         {  
  107.                             result.add(word);  
  108.                             pos = end;  
  109.                             end = len;  
  110.                         }  
  111.                         else  
  112.                         {  
  113.                             // 当判断到剩余单字时,将词加入到词库中  
  114.                             if (word.length() == 1)  
  115.                             {  
  116.                                 result.add(word);  
  117.                                 pos = end;  
  118.                                 end = len;  
  119.                             }  
  120.                             else  
  121.                                 end--;  
  122.                         }  
  123.                         // end of match  
  124.                     }  
  125.                     // end of if(end>pos)  
  126.                 }  
  127.                 // end of while (end > pos)  
  128.             }  
  129.             // end of while (pos < len)  
  130.         }  
  131.         // end of while (tokenizer.hasMoreTokens())  
  132.         return result;  
  133.     }  
  134. }  

最后是反向最大匹配的实现类ReverseMaxMatchSegmentProcessor:
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. import java.util.StringTokenizer;  
  11.   
  12. import edu.stu.cn.segment.matching.dictionary.DictionaryImpl;  
  13.   
  14. /** 
  15.  * @author Hades Guan 反向最大匹配分词法操作类 
  16.  */  
  17. public class ReverseMaxMatchSegmentProcessor extends MatchSegmentProcessor  
  18. {  
  19.     /** 
  20.      * 字符串分隔器 
  21.      */  
  22.     private StringTokenizer tokenizer = null;  
  23.   
  24.     /** 
  25.      * 默认构造函数 
  26.      */  
  27.     public ReverseMaxMatchSegmentProcessor()  
  28.     {  
  29.         this.initSeperator();  
  30.     }  
  31.   
  32.     /** 
  33.      * 以一个词典操作类实例为参数的构造函数 
  34.      *  
  35.      * @param dic 
  36.      *            词典操作类实例 
  37.      */  
  38.     public ReverseMaxMatchSegmentProcessor(DictionaryImpl dic)  
  39.     {  
  40.         this.dic = dic;  
  41.         this.initSeperator();  
  42.     }  
  43.   
  44.     /** 
  45.      * 对text文本进行分词,把结果保存为字符串链表 
  46.      *  
  47.      * @param text 
  48.      *            待分词的文本 
  49.      * @return 分词结果 
  50.      */  
  51.     public LinkedList<string> textProcess(String text)  </string>
  52.     {  
  53.         if (text == null)  
  54.             return null;  
  55.   
  56.         // 初始化分词结果集  
  57.         LinkedList<string> result = new LinkedList<string>();  </string></string>
  58.         // 初始化分隔器  
  59.         this.tokenizer = new StringTokenizer(text, this.seperator);  
  60.         // 分隔文本  
  61.         while (tokenizer.hasMoreTokens())  
  62.         {  
  63.             // 获取分隔文本  
  64.             String token = tokenizer.nextToken();  
  65.   
  66.             // 如果分隔文本为空则开始下一个循环  
  67.             if (token == null)  
  68.                 continue;  
  69.   
  70.             // 初始化变量  
  71.             int len = token.length(), start = 0, pos = len;  
  72.             int wordCount = 0;  
  73.             // 循环匹配  
  74.             while (pos > 0)  
  75.             {  
  76.                 while (start < pos)  
  77.                 {  
  78.                     // 判断start处字符是否为数字或英文字母  
  79.                     if (start < len  
  80.                             && CHAR_AND_NUM.indexOf(token.charAt(start)) >= 0)  
  81.                     {  
  82.                         // 记录英语字母开始位置、英语字母结束位置  
  83.                         int englishEnd = start, englishStart = start;  
  84.                         while (englishEnd < len  
  85.                                 && CHAR_AND_NUM.indexOf(token  
  86.                                         .charAt(englishEnd)) >= 0)  
  87.                             englishEnd++;  
  88.                         // 判断当位置标签指向当前英文串首地址时将结果插入分词结果集  
  89.                         if (englishEnd == pos)  
  90.                         {  
  91.                             result.add(result.size() - wordCount, token  
  92.                                     .substring(englishStart, englishEnd));  
  93.                             wordCount++;  
  94.                             pos = start;  
  95.                             start = 0;  
  96.                         }  
  97.                     }  
  98.                     // end of if(CHAR_AND_NUM.indexOf(token.charAt(start))>=0)  
  99.   
  100.                     // 判断分段是否已分析完毕  
  101.                     if (start < pos)  
  102.                     {  
  103.                         String word = token.substring(start, pos);  
  104.                         if (dic.match(word))  
  105.                         {  
  106.                             result.add(result.size() - wordCount, word);  
  107.                             wordCount++;  
  108.                             pos = start;  
  109.                             start = 0;  
  110.                         }  
  111.                         else  
  112.                         {  
  113.                             // 当判断到剩余单字时,将词加入到词库中  
  114.                             if (word.length() == 1)  
  115.                             {  
  116.                                 result.add(result.size() - wordCount, word);  
  117.                                 wordCount++;  
  118.                                 pos = start;  
  119.                                 start = 0;  
  120.                             }  
  121.                             else  
  122.                                 start++;  
  123.                         }  
  124.                         // end of match  
  125.                     }  
  126.                     // end of if(start  
  127.                 }  
  128.                 // end of while (start < pos)  
  129.             }  
  130.             // end of while (pos > 0)  
  131.         }  
  132.         // end of while (tokenizer.hasMoreTokens())  
  133.         return result;  
  134.     }  
  135.   
  136. }  
分享到:
评论

相关推荐

    baidu.rar_ baidu_dictionary_中文分词_中文分词 词典_分词词典

    中文分词的方法主要有基于词典的分词、基于统计的分词和基于深度学习的分词。基于词典的分词方法主要依赖词典,通过查找最长匹配、最少切分等策略进行分词;基于统计的分词则利用大量语料库,通过概率模型来预测最佳...

    百度分词词典——常用词词典 自然语言处理分词专用

    百度分词词典——常用词词典 自然语言处理分词专用 能够辅助分词,共1876个词。

    一种中文分词词典新机制——双字哈希机制.pdf

    《一种中文分词词典新机制——双字哈希机制》这篇文章由李庆虎、陈玉健、孙家广撰写,发表于《中文信息学报》第17卷第4期,时间点为2003年。文章的核心贡献在于提出了一种针对中文分词优化的新词典机制——双字哈希...

    中文分词代码及词典(同博客代码)

    中文分词源代码,java语言。...代码通过读词典获取数据,进行中文分词。将词典读取的数据利用map去重,然后进行前缀扫面,详情见博客:https://blog.csdn.net/qq_40142391/article/details/82945556#commentsedit

    基于Python实现的词典分词方法或统计分词方法.zip

    实现基于词典的分词方法和统计分词方法:两类方法中各实现一种即可; 对分词结果进行词性标注,也可以在分词的同时进行词性标注; 对分词及词性标注结果进行评价,包括4个指标:正确率、召回率、F1值和效率。 ...

    HMM中文分词

    基于HMM的中文分词代码,虽然基于字标注的中文分词借鉴了词性标注的思想,但是在实践中,多数paper中的方法似乎局限于最大熵模型和条件随机场的应用,所以我常常疑惑字标注中文分词方法为什么不采用别的模型和方法呢...

    隐马尔科夫分词源代码

    隐马尔科夫模型(Hidden Markov Model,简称HMM)是统计建模方法中的一种,常用于自然语言处理中的序列标注任务,如中文分词。在这个任务中,HMM被用来识别和分割中文文本中的词语,以实现对文本的准确理解和分析。...

    中文分词代码

    中文分词是自然语言处理中的基础任务,它涉及到将连续的汉字序列切分成具有语义意义的词语单元,这一过程称为分词。在中文文本分析、信息检索、机器翻译等领域,中文分词起着至关重要的作用。本项目提供的“中文分词...

    Android 中文分词 2.2以上真机测试成功!

    中文分词是自然语言处理的基础步骤,因为中文没有像英文那样的空格来划分单词,所以需要通过特定算法将连续的汉字序列切分成有意义的词语。例如,“我爱你”会被分词为“我”,“爱”,“你”。在Android系统中,...

    matlab中文分词——最大正向匹配法.rar

    在IT领域,中文分词是自然语言处理(NLP)中的关键步骤,它涉及到将连续的汉字序列分割成有意义的词语单元,以便计算机能够理解和分析文本。本项目以"matlab中文分词——最大正向匹配法.rar"为主题,重点讨论了如何...

    中文分词java源代码

    《中文分词Java源代码深度解析》 在信息爆炸的时代,自然语言处理(NLP)技术扮演着至关重要的角色,而中文分词是NLP中的基础环节。本篇将深入探讨一个以Java编写的中文分词系统,通过对提供的源代码进行分析,揭示...

    C语言中文分词源代码

    在IT领域,中文分词是自然语言处理(NLP)中的关键步骤,它涉及到将连续的汉字序列分割成有意义的词汇单元,这对于信息检索、文本分析、机器翻译等多个应用至关重要。"C语言中文分词源代码"是一个专门用于实现这一...

    分词中文停止词词典

    例如,“分词中文停止词词典.txt”可能包含了诸如“的”、“了”、“和”等中文停止词,而“分词英文停止词词典.txt”则包含“the”、“is”、“and”等英文停止词。 使用这样的词典可以优化NLP任务的性能,尤其是...

    自然语言处理大作业Python实现基于词典的分词方法源代码+实验报告(高分项目)

    自然语言处理大作业Python实现基于词典的分词方法源代码+实验报告(高分项目)自然语言处理大作业Python实现基于词典的分词方法源代码+实验报告(高分项目)自然语言处理大作业Python实现基于词典的分词方法源代码+...

    盘古分词-开源中文分词组件词典-词典

    盘古分词是一款开源的中文分词组件,其主要任务是将连续的汉字序列切分成具有语义的词语,这是自然语言处理中的基础步骤。在中文文本处理中,由于汉字没有明显的空格来划分单词,因此分词显得尤为重要。分词的准确性...

    [易语言]基于词典的中文句子分词断句,带例程及词典

    总结来说,这个项目提供了一个基于易语言的中文分词断句解决方案,结合词典文件进行词汇划分,并通过源代码实现了基本的断句功能。通过扩展连接词处理和词性标注,可以提高系统在处理中文文本时的智能性和准确性,这...

    中文分词工具word-1.0,Java实现的中文分词组件多种基于词典的分词算法

    word分词是一个Java实现的中文分词组件,提供了多种基于词典的分词算法,并利用ngram模型来消除歧义。 能准确识别英文、数字,以及日期、时间等数量词,能识别人名、地名、组织机构名等未登录词。 同时提供了Lucene...

    论文研究-基于LSTM网络的序列标注中文分词法.pdf

    当前主流的中文分词方法是基于字标注的传统机器学习方法,但传统机器学习方法需要人为地从中文文本中配置并提取特征,存在词库维度高且利用CPU训练模型时间长的缺点。针对以上问题进行了研究,提出基于LSTM(long ...

    中文分词处理技术源代码

    常见的分词方法包括基于词典的分词、统计分词、深度学习分词等。本项目可能采用了其中的一种或多种方法,结合词典和统计模型,以提高分词的准确性和效率。 `segmenter.class` 和 `segmenter.java` 文件很可能是分词...

Global site tag (gtag.js) - Google Analytics