- 浏览: 65964 次
- 性别:
- 来自: 广东广州
-
最新评论
-
lishuai_girl:
看不到源代码啊!?
使用Protege、Jess API在ontology中进行简单推理 -
qinliyi123:
我也在测试spring和hibernate search的结合 ...
初试Hibernate Search -
billgmh:
test_root 写道如果我的数据库英字符集的,中文内容保存 ...
初试Hibernate Search -
test_root:
如果我的数据库英字符集的,中文内容保存后都是乱码,
我该如何实 ...
初试Hibernate Search -
test_root:
请问用hibernate search后,如何实现分页?
能把 ...
初试Hibernate Search
目前为止,已实现了1、一维线性表 2、首字Hash 3、双Hash 三种词典的存储结构与表现形式。
首先来看一下词典结构的接口Interface:
接口中定义了插入词汇、删除词汇、词汇查询、从txt文本文件中载入词典、将已载入的词典输出 五个操作。
接下来看一下一维线性表结构的词典接口实现类SimpleDictionary:
SimpleDictionary类实现了自定义的DictionaryImpl接口外还实现了序列化,这样做的目的是希望能把从原始文本资料中载入的词汇排序整理后以序列化的形式写成文件,以后需要使用时直接从文件中载入就可以使用了,省去了不少初始化的麻烦。后面提到的词典实现类也都实现了序列化。
接着是首字Hash结构词典实现类HashDictionary:
首字Hash结构中是使用Hashtable类作为基础,其中key为词汇的首字,如:“关心”中的“关”字,而value则是ArrayList类型的一维线性表,存储的是相同首字的词汇列表。
基于这种结构,查询时先把字符串的首个字符作为key,若Hashtable中不包含这个key则返回false,否则取出改线性表value后使用折半查找的方法查询。
首先来看一下词典结构的接口Interface:
java 代码
- /*
- * @作者:Hades , 创建日期:2006-11-17
- *
- * 汕头大学03计算机本科
- *
- */
- package edu.stu.cn.segment.matching.dictionary;
- import java.io.PrintStream;
- /**
- * @author Hades Guan 词典操作接口
- */
- public interface DictionaryImpl
- {
- /**
- * 删除词典中的词word
- *
- * @param word
- * 待删除的词汇
- */
- public void deleteWord(String word);
- /**
- * 将词汇word插入到词典文件中
- *
- * @param word
- * 待插入的词汇
- */
- public void insertWord(String word);
- /**
- * 载入以文本格式存储的词典
- *
- * @param fileName
- * 词典的文件名
- */
- @SuppressWarnings("unchecked")
- public void loadDictionary(String fileName);
- /**
- * 判断输入的字符串是否在词典中
- *
- * @param word
- * 待判断字符串
- * @return 判断结果
- */
- public boolean match(String word);
- /**
- * 输出已载入内存中所有词汇
- *
- * @param out
- * 输出流
- */
- public void print(PrintStream out);
- }
接下来看一下一维线性表结构的词典接口实现类SimpleDictionary:
java 代码
- /*
- * @作者:Hades , 创建日期:2006-11-18
- *
- * 汕头大学03计算机本科
- *
- */
- package edu.stu.cn.segment.matching.dictionary;
- import java.io.BufferedReader;
- import java.io.FileReader;
- import java.io.IOException;
- import java.io.PrintStream;
- import java.io.Serializable;
- import java.util.ArrayList;
- import java.util.Collections;
- /**
- * @author Hades Guan 简单顺序词典接口
- */
- public class SimpleDictionary implements Serializable, DictionaryImpl
- {
- /**
- *
serialVersionUID
的注释 - */
- private static final long serialVersionUID = -6631832710612755332L;
- /**
- * 词典容器
- */
- private ArrayList<string> dic = </string>new ArrayList<string>(); </string>
- /**
- * 删除词典中的词word
- *
- * @param word
- * 待删除的词汇
- */
- public void deleteWord(String word)
- {
- if (word == null)
- return;
- int pos;
- // 判断原词典中是否已有该词汇
- if ((pos = Collections.binarySearch(dic, word)) < 0)
- return;
- else
- dic.remove(pos);
- }
- /**
- * 将词汇word插入到词典文件中
- *
- * @param word
- * 待插入的词汇
- */
- public void insertWord(String word)
- {
- if (word == null)
- return;
- // 判断原词典中是否已有该词汇
- if (Collections.binarySearch(dic, word) < 0)
- dic.add(word);
- // 插入后重新排序
- Collections.sort(dic);
- }
- /**
- * 载入以文本格式存储的词典
- *
- * @param fileName
- * 词典的文件名
- */
- public void loadDictionary(String fileName)
- {
- try
- {
- // 初始化输入流
- BufferedReader in = new BufferedReader(new FileReader(fileName));
- String word = null;
- // 读取词典
- while ((word = in.readLine()) != null)
- {
- dic.add(word);
- }
- // 词典排序
- Collections.sort(dic);
- // 关闭输入
- in.close();
- }
- catch (IOException e)
- {
- // TODO 自动生成 catch 块
- e.printStackTrace();
- }
- }
- /**
- * 判断输入的字符串是否在词典中
- *
- * @param word
- * 待判断字符串
- * @return 判断结果
- */
- public boolean match(String word)
- {
- int pos = Collections.binarySearch(dic, word);
- if (pos >= 0)
- return true;
- else
- return false;
- }
- /**
- * 输出已载入内存中所有词汇
- *
- * @param out
- * 输出流
- */
- public void print(PrintStream out)
- {
- for (int i = 0; i < this.dic.size(); i++)
- {
- out.println(dic.get(i));
- }
- out.flush();
- }
- }
接着是首字Hash结构词典实现类HashDictionary:
java 代码
- /*
- * @作者:Hades , 创建日期:2006-11-19
- *
- * 汕头大学03计算机本科
- *
- */
- package edu.stu.cn.segment.matching.dictionary;
- import java.io.BufferedReader;
- import java.io.FileReader;
- import java.io.IOException;
- import java.io.PrintStream;
- import java.io.Serializable;
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.Hashtable;
- /**
- * @author Hades Guan 单层哈希字典操作类
- */
- public class HashDictionary implements DictionaryImpl, Serializable
- {
- /**
- *
serialVersionUID
的注释 - */
- private static final long serialVersionUID = -436844886894530829L;
- /**
- * 词典
- */
- private Hashtablenew Hashtable
- /**
- * 删除词典中的词word
- *
- * @param word
- * 待删除的词汇
- */
- public void deleteWord(String word)
- {
- if (word == null)
- return;
- // 截取首字
- String fch = word.substring(0, 1);
- if (dic.containsKey(fch))
- {
- // 获取词汇表
- ArrayList<string> wal = dic.get(fch); </string>
- // 截取词汇剩余部分
- String leftWord = word.substring(1);
- // 查找该词汇是否存在于词汇表中
- int pos = Collections.binarySearch(wal, leftWord);
- // 存在时删除
- if (pos >= 0)
- {
- wal.remove(pos);
- dic.put(fch, wal);
- }
- }
- }
- /**
- * 将词汇word插入到词典文件中
- *
- * @param word
- * 待插入的词汇
- */
- public void insertWord(String word)
- {
- if (word == null)
- return;
- // 截取首字
- String fch = word.substring(0, 1);
- // 词汇表
- ArrayList<string> wal = null; </string>
- if (dic.containsKey(fch))
- wal = dic.get(fch);
- else
- wal = new ArrayList<string>(); </string>
- // 截取词汇剩余部分
- String leftWord = word.substring(1);
- // 判断词汇表中是否已有该词汇
- if (Collections.binarySearch(wal, leftWord) < 0)
- {
- wal.add(leftWord);
- Collections.sort(wal);
- dic.put(fch, wal);
- }
- }
- /**
- * 载入以文本格式存储的词典
- *
- * @param fileName
- * 词典的文件名
- */
- public void loadDictionary(String fileName)
- {
- try
- {
- // 初始化输入流
- BufferedReader in = new BufferedReader(new FileReader(fileName));
- String word = null;
- // 读取词典
- while ((word = in.readLine()) != null)
- {
- // 插入词汇
- this.insertWord(word.trim());
- }
- }
- catch (IOException e)
- {
- // TODO 自动生成 catch 块
- e.printStackTrace();
- }
- }
- /**
- * 判断输入的字符串是否在词典中
- *
- * @param word
- * 待判断字符串
- * @return 判断结果
- */
- public boolean match(String word)
- {
- if (word == null)
- return false;
- // 截取首字
- String fch = word.substring(0, 1);
- // 判断词汇表是否有此首字
- if (!dic.containsKey(fch))
- return false;
- // 获取词汇表
- ArrayList<string> wal = dic.get(fch); </string>
- // 截取词汇剩余部分
- String leftWord = word.substring(1);
- // 折半查找
- int pos = Collections.binarySearch(wal, leftWord);
- return (pos >= 0);
- }
- /**
- * 输出已载入内存中所有词汇
- *
- * @param out
- * 输出流
- */
- public void print(PrintStream out)
- {
- // 获取首字集合
- for (String fch : dic.keySet())
- {
- out.println("首字:" + fch);
- for (String w : dic.get(fch))
- out.println("\t" + w);
- }
- out.flush();
- }
- }
基于这种结构,查询时先把字符串的首个字符作为key,若Hashtable中不包含这个key则返回false,否则取出改线性表value后使用折半查找的方法查询。
发表评论
-
初试Hibernate Search
2007-10-03 16:16 8028不久前Hibernate推出了Hibernate Search ... -
引入局部统计识别高频词汇的Lucene中文分词程序
2007-04-02 18:40 3991在基于词典的最大匹配的Lucene中文分词程序基础上引入了局部 ... -
基于词典的最大匹配的Lucene中文分词程序
2007-03-11 17:56 11588把自己之前完成的基于词典的最大匹配的中文分词程序修改成基于Lu ... -
原创中文分词代码分享(2.2)——基于词典的分词接口
2006-12-28 08:38 2202接着是正向最大匹配的 ... -
原创中文分词代码分享(2.1)——基于词典的分词接口
2006-12-28 08:32 2660现在来看一下基于词典的分词接口(最大匹配法)。先来看一下分词处 ... -
原创中文分词代码分享(1.2)——词典接口
2006-12-26 19:07 2220最后说一下双Hash结构的实现类DoubleHashDicti ... -
原创中文分词代码分享(0)——序言
2006-12-26 18:20 1989一眨眼大学四年的生活就要过去了,摆在自己面前的 ...
相关推荐
在本篇文章中,我们将围绕“baidu.rar_baidu_dictionary_中文分词_中文分词_词典_分词词典”这一主题,深入探讨百度曾经使用的中文分词词典及其在实际应用中的价值。 首先,让我们了解中文分词词典的重要性。词典是...
百度分词词典——常用词词典 自然语言处理分词专用 能够辅助分词,共1876个词。
xdict_1.1就是这样一个专门为Sphinx设计的中文词典,用于提高中文分词的效率和准确性。 xdict_1.1是一个针对Sphinx优化的中文词典文件,通常以文本格式存在,如我们提供的xdict_1.1.txt。这个文件包含了大量中文...
《一种中文分词词典新机制——双字哈希机制》这篇文章由李庆虎、陈玉健、孙家广撰写,发表于《中文信息学报》第17卷第4期,时间点为2003年。文章的核心贡献在于提出了一种针对中文分词优化的新词典机制——双字哈希...
中文分词源代码,java语言。...代码通过读词典获取数据,进行中文分词。将词典读取的数据利用map去重,然后进行前缀扫面,详情见博客:https://blog.csdn.net/qq_40142391/article/details/82945556#commentsedit
首先,我们来看标题中的核心——"简单中文分词v1.1"。这表明该系统是一个针对中文文本的分词工具,版本号为1.1,意味着它已经过至少一次的升级和优化。分词,即把连续的汉字序列切分成具有独立语义的词语,是理解和...
例如,“分词中文停止词词典.txt”可能包含了诸如“的”、“了”、“和”等中文停止词,而“分词英文停止词词典.txt”则包含“the”、“is”、“and”等英文停止词。 使用这样的词典可以优化NLP任务的性能,尤其是...
中文分词是自然语言处理中的基础任务,它涉及到将连续的汉字序列切分成具有语义意义的词语单元,这一过程称为分词。在中文文本分析、信息检索、机器翻译等领域,中文分词起着至关重要的作用。本项目提供的“中文分词...
### 分词词典:现代汉语词典 #### 知识点概述 《分词词典:现代汉语词典》是一部从现代汉语词典中提取出的分词版本,旨在为自然语言处理(NLP)、文本分析等领域提供一个高质量的汉语词汇资源。在计算机科学与信息...
《中文分词Java源代码深度解析》 在信息爆炸的时代,自然语言处理(NLP)技术扮演着至关重要的角色,而中文分词是NLP中的基础环节。本篇将深入探讨一个以Java编写的中文分词系统,通过对提供的源代码进行分析,揭示...
盘古分词是一款开源的中文分词组件,其主要任务是将连续的汉字序列切分成具有语义的词语,这是自然语言处理中的基础步骤。在中文文本处理中,由于汉字没有明显的空格来划分单词,因此分词显得尤为重要。分词的准确性...
在IT领域,中文分词是自然语言处理(NLP)中的关键步骤,它涉及到将连续的汉字序列分割成有意义的词语单元,以便计算机能够理解和分析文本。本项目以"matlab中文分词——最大正向匹配法.rar"为主题,重点讨论了如何...
隐马尔科夫模型(Hidden Markov Model,简称HMM)是统计建模方法中的一种,常用于自然语言处理中的序列标注任务,如中文分词。在这个任务中,HMM被用来识别和分割中文文本中的词语,以实现对文本的准确理解和分析。...
基于HMM的中文分词代码,虽然基于字标注的中文分词借鉴了词性标注的思想,但是在实践中,多数paper中的方法似乎局限于最大熵模型和条件随机场的应用,所以我常常疑惑字标注中文分词方法为什么不采用别的模型和方法呢...
将地名全名词典分词获得分词后的地名词典,减少词条数目,增加查找速度。程序用一个中等省会城市测试,模糊查询和精确查询效果都不错。 4、加入地名输入提示的工具。 代码采用C#,为学习成果,尚有很多不完善地方,...
1.1 —— 2006-06-06 增加扩展词典的静态读取方法 1.0.1 —— 2006-06-02 修正无法识别生僻字的问题 1.0 —— 2006-05-29 支持英文、数字、中文(简体)混合分词 常用的数量和人名的匹配 超过22万...
### 中文分词词典知识点解析 #### 一、引言 中文分词是自然语言处理(NLP)中的一个重要步骤,它将连续的文本序列切分成一个个具有语义意义的词汇单位。一个高质量的分词词典对于提高分词准确率至关重要。本文将...
首先,中文分词是指将连续的汉字序列切分成具有语义的独立单位,这些单位被称为词。由于中文没有像英文那样的空格作为词与词之间的天然分隔符,因此中文分词显得尤为复杂。常见的分词方法包括基于词典的分词、统计...
《jieba分词词典大全dict.rar》是一个包含多种分词词典的压缩包,它提供了丰富的中文词汇资源,特别适合进行中文文本处理和分析。jieba是一个著名的Python库,用于中文分词,它在自然语言处理(NLP)领域广泛应用。...
用RMM分词算法可以实现,调用“ppldic.csv”中英文词库。在分词过程中要过滤掉 标点符号,否则,这些标点符号都将分成一个词,而这些词并不是用户查询搜索的关键内容。