- 浏览: 65491 次
- 性别:
- 来自: 广东广州
最新评论
-
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 8010不久前Hibernate推出了Hibernate Search ... -
引入局部统计识别高频词汇的Lucene中文分词程序
2007-04-02 18:40 3979在基于词典的最大匹配的Lucene中文分词程序基础上引入了局部 ... -
基于词典的最大匹配的Lucene中文分词程序
2007-03-11 17:56 11551把自己之前完成的基于词典的最大匹配的中文分词程序修改成基于Lu ... -
原创中文分词代码分享(2.2)——基于词典的分词接口
2006-12-28 08:38 2188接着是正向最大匹配的 ... -
原创中文分词代码分享(2.1)——基于词典的分词接口
2006-12-28 08:32 2640现在来看一下基于词典的分词接口(最大匹配法)。先来看一下分词处 ... -
原创中文分词代码分享(1.2)——词典接口
2006-12-26 19:07 2208最后说一下双Hash结构的实现类DoubleHashDicti ... -
原创中文分词代码分享(0)——序言
2006-12-26 18:20 1980一眨眼大学四年的生活就要过去了,摆在自己面前的 ...
相关推荐
首先,我们来看标题中的核心——"简单中文分词v1.1"。这表明该系统是一个针对中文文本的分词工具,版本号为1.1,意味着它已经过至少一次的升级和优化。分词,即把连续的汉字序列切分成具有独立语义的词语,是理解和...
1.1 —— 2006-06-06 增加扩展词典的静态读取方法 1.0.1 —— 2006-06-02 修正无法识别生僻字的问题 1.0 —— 2006-05-29 支持英文、数字、中文(简体)混合分词 常用的数量和人名的匹配 超过22万...
最初作为开源项目Lucene的一部分,它主要服务于该搜索引擎框架,通过结合词典分词与语法分析算法实现了中文文本的高效分词。 ##### 1.1 结构设计 - **正向迭代最细粒度切分算法**:这是IKAnalyzer的核心算法之一,...
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的一个插件——IK分词器的7.4.0版本。这个插件是为了解决Elasticsearch在处理中文文本时的分词问题,因为Elasticsearch默认的分析器主要针对英文...
- **分词(Term)**:索引中的最小单位,如中文句子中的“马上”可以被分词为“马”、“上”两个词。 - **词典**:包含了大量词汇或短语的集合,用于提高搜索准确性。 - **相关度**:衡量搜索结果与用户查询关键词...
**第4章**“中文分词原理与实现”详细探讨了中文分词的相关理论和技术实现。这一章节覆盖了中文分词的基本原理、算法实现、分词流程、未登录词识别等多个方面: - **4.1 Lucene中的中文分词**: - **4.1.1 Lucene...
随着互联网的迅猛发展,海量信息的出现使得用户面临一个严峻的问题——如何从这些庞杂的信息中快速准确地提取出自己所需的内容。传统的搜索引擎虽然能够帮助用户定位到相关文档,但往往需要用户自行阅读全文以筛选出...
例如,使用NLTK(Natural Language Toolkit)库进行英文文本的预处理,使用jieba进行中文文本的分词。 1.2 信息抽取:通过模式匹配、关键词匹配或基于规则的方法,从文本中提取结构化的信息,如人名、地名、事件等...