最后说一下双Hash结构的实现类DoubleHashDictionary类:
java 代码
-
-
-
-
-
-
- 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;
- import java.util.LinkedList;
-
-
-
-
- public class DoubleHashDictionary implements Serializable, DictionaryImpl
- {
-
-
-
- private static final long serialVersionUID = -6085097706592874294L;
-
-
-
-
- private Hashtablenull;
-
-
-
-
- private int maxWordLen = 0;
-
-
-
-
- private int wordCount = 0;
-
-
-
-
-
-
-
- public void deleteWord(String word)
- {
- if (word == null)
- return;
-
-
- word = word.trim();
-
- int len = word.length();
-
- if (this.indexTable[len - 1] == null)
- return;
-
- String fch = word.substring(0, 1);
-
- ArrayList<string> wal = null; </string>
- if (this.indexTable[len - 1].containsKey(fch))
- wal = this.indexTable[len - 1].get(fch);
- else
- return;
-
-
- String str = word.substring(1, len);
- if (Collections.binarySearch(wal, str) >= 0)
- {
- wal.remove(str);
- this.indexTable[len - 1].put(fch, wal);
- }
- else
- return;
- }
-
-
-
-
- public int getMaxWordLen()
- {
- return maxWordLen;
- }
-
-
-
-
- public int getWordCount()
- {
- return wordCount;
- }
-
-
-
-
-
-
-
- public void insertWord(String word)
- {
- if (word == null)
- return;
-
-
- word = word.trim();
-
- int len = word.length();
-
- if (this.indexTable[len - 1] == null)
- this.indexTable[len - 1] = new Hashtable
-
- String fch = word.substring(0, 1);
-
- ArrayList<string> wal = null; </string>
- if (this.indexTable[len - 1].containsKey(fch))
- wal = this.indexTable[len - 1].get(fch);
- else
- wal = new ArrayList<string>(); </string>
-
-
- String str = word.substring(1, len);
-
- if (Collections.binarySearch(wal, str) < 0)
- wal.add(str);
-
- Collections.sort(wal);
- this.indexTable[len - 1].put(fch, wal);
- }
-
-
-
-
-
-
-
- @SuppressWarnings("unchecked")
- public void loadDictionary(String fileName)
- {
- try
- {
-
- BufferedReader in = new BufferedReader(new FileReader(fileName));
- String word = null;
-
- LinkedList<string> wordLink = new LinkedList<string>(); </string></string>
-
- this.maxWordLen = 0;
-
-
- while ((word = in.readLine()) != null)
- {
- if (word.length() > this.maxWordLen)
- this.maxWordLen = word.length();
- wordLink.add(word);
- this.wordCount++;
- }
-
-
- this.indexTable = new Hashtable[this.maxWordLen];
-
- for (String w : wordLink)
- {
-
- this.insertWord(w);
- }
-
- wordLink.clear();
- }
- catch (IOException e)
- {
-
- e.printStackTrace();
- }
- }
-
-
-
-
-
-
-
-
- public boolean match(String word)
- {
- if (word == null)
- return false;
-
-
- int len = word.length();
-
-
- if (len > this.maxWordLen)
- return false;
-
-
- if (this.indexTable[len - 1] == null)
- return false;
-
-
- String fch = word.substring(0, 1);
- if (this.indexTable[len - 1].containsKey(fch))
- {
- if (len == 1)
- return true;
- else
- {
-
- ArrayList<string> wal = this.indexTable[len - 1].get(fch); </string>
-
- if (Collections.binarySearch(wal, word.substring(1, len)) < 0)
- return false;
- else
- return true;
- }
- }
- else
- return false;
- }
-
-
-
-
-
-
-
- public void print(PrintStream out)
- {
- for (int i = 0; i < this.indexTable.length; i++)
- {
- out.println("词长:" + (i + 1));
-
- if (this.indexTable[i] != null)
- {
- for (String fch : this.indexTable[i].keySet())
- {
- out.println("首字:" + fch);
- for (String w : this.indexTable[i].get(fch))
- out.println("\t" + w);
- }
- }
- }
- out.flush();
- }
- }
为什么说是双Hash结构呢?因为在查询词汇时,先使用词汇的长度length作为第一次Hash的key取出Hashtable结构的value,接下来也就跟首字Hash查询的操作一样了:取首字作为key取出一维线性表的value后采用折半查找。当词典中词汇数目很大时,一维线性表过长,进行折半查找无疑会提高比较的次数从而降低了效率。而使用双Hash正是希望通过增加多一次Hash求值从而将长的词汇表剪短成为多段较短的一维线性表减低折半查找时的比较次数。
既然说道了序列化,当然少不了序列化操作类DictionaryUtil:
java 代码
-
-
-
-
-
-
- package edu.stu.cn.segment.matching.util;
-
- import java.io.BufferedInputStream;
- import java.io.BufferedOutputStream;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.ObjectInputStream;
- import java.io.ObjectOutputStream;
-
- import edu.stu.cn.segment.matching.dictionary.DictionaryImpl;
-
-
-
-
-
- public class DictionaryUtilextends DictionaryImpl>
- {
-
-
-
-
-
-
-
- @SuppressWarnings("unchecked")
- public T readDictionary(String fileName)
- {
- try
- {
- ObjectInputStream in = new ObjectInputStream(
- new BufferedInputStream(new FileInputStream(fileName)));
- T dic = (T) in.readObject();
- in.close();
- return dic;
- }
- catch (Exception e)
- {
- System.err.println(e.getMessage());
- return null;
- }
- }
-
-
-
-
-
-
-
-
-
-
- public boolean writeDictionary(T dic, String fileName)
- {
- try
- {
- ObjectOutputStream out = new ObjectOutputStream(
- new BufferedOutputStream(new FileOutputStream(fileName)));
- out.writeObject(dic);
- out.flush();
- out.close();
- return true;
- }
- catch (IOException e)
- {
- System.err.println(e.getMessage());
- return false;
- }
-
- }
- }
通过这个操作类可以把实现DictionaryImpl接口的词典实现类写入文件或者从文件中读出。
分享到:
- 2006-12-26 19:07
- 浏览 2208
- 评论(0)
- 论坛回复 / 浏览 (0 / 3567)
- 查看更多
相关推荐
1.2 —— 2006-06-08 增加中文数字的匹配(如:二零零六) 数量词采用“n”作为数字通配符 优化词典结构以便修改调整 1.1 —— 2006-06-06 增加扩展词典的静态读取方法 1.0.1 —— 2006-06-02 ...
最初作为开源项目Lucene的一部分,它主要服务于该搜索引擎框架,通过结合词典分词与语法分析算法实现了中文文本的高效分词。 ##### 1.1 结构设计 - **正向迭代最细粒度切分算法**:这是IKAnalyzer的核心算法之一,...
1.2 —— 2006-06-08 增加中文数字的匹配(如:二零零六) 数量词采用“n”作为数字通配符 优化词典结构以便修改调整 1.1 —— 2006-06-06 增加扩展词典的静态读取方法 1.0.1 —— 2006-06-02 ...
而在中文处理中,分词器的作用尤为重要,它能将复杂的中文文本拆解为可索引的基本单位——词语。本文将深入探讨Elasticsearch的IK分词器,即elasticsearch-analysis-ik-7.16.2,以及与其相关的依赖库。 **一、...
标题中的"elasticsearch-analysis-ik-7.4.0.zip"指的是Elasticsearch的一个插件——IK分词器的7.4.0版本。这个插件是为了解决Elasticsearch在处理中文文本时的分词问题,因为Elasticsearch默认的分析器主要针对英文...
它的主要功能包括对中文文本进行精确模式和全模式的分词,同时支持自定义扩展词典,能够根据业务需求定制分词规则。版本号 "5.2.0" 表示这是适用于 Elasticsearch 5.2.0 版本的 IK 分词器插件。 在大数据场景下,...
《Elasticsearch中文分词器IK插件详解》 Elasticsearch(ES)作为一个强大的全文搜索引擎,其在处理中文文档时,对中文分词的准确性和效率有着至关重要的作用。"elasticsearch-analysis-ik"是ES中最受欢迎的中文...
IK分词器不仅支持常见的中文词汇,还能通过自定义扩展词典进行个性化分词,适应各种应用场景。 在IK分词库的实现中,包含了以下核心组件: 1. **httpclient-4.5.2.jar**:Apache HttpClient库,用于网络通信,分词...
在处理中文分词方面,Elasticsearch有一个非常重要的插件——IK分词器(Analysis IK)。本文将详细讲解"elasticsearch-analysis-ik-5.2.2"这一版本的IK分词器及其相关组件。 首先,"elasticsearch-analysis-ik-...
4. **commons-logging-1.2.jar**:Apache Commons Logging,一个轻量级的日志接口,允许在不修改代码的情况下切换日志实现。 5. **elasticsearch-analysis-ik-6.7.0.jar**:IK分词器的核心jar包,负责处理中文分词...
标题“elasticsearch-analysis-ik-7.3.0.zip”所指的是一款针对Elasticsearch的中文分词插件——IK Analyzer的7.3.0版本。IK Analyzer是一款广泛应用于Elasticsearch和Kibana的中文分词工具,旨在提供高效、灵活的...
它由开源社区开发并维护,旨在提供更优秀的中文分词效果,支持复杂的分词策略和自定义扩展。该插件的最新版本为6.8.23,与Elasticsearch 6.8.x系列兼容。 分词器在全文搜索中扮演的角色是将文本拆分成一系列可索引...
4. commons-logging-1.2.jar:通用的日志记录接口,为各种日志框架提供统一的接口。 5. elasticsearch-analysis-ik-7.13.3.jar:核心插件文件,包含了IK分词器的实现。 6. plugin-security.policy:插件的安全策略...
**第4章**“中文分词原理与实现”详细探讨了中文分词的相关理论和技术实现。这一章节覆盖了中文分词的基本原理、算法实现、分词流程、未登录词识别等多个方面: - **4.1 Lucene中的中文分词**: - **4.1.1 Lucene...
例如,使用NLTK(Natural Language Toolkit)库进行英文文本的预处理,使用jieba进行中文文本的分词。 1.2 信息抽取:通过模式匹配、关键词匹配或基于规则的方法,从文本中提取结构化的信息,如人名、地名、事件等...
随着互联网的迅猛发展,海量信息的出现使得用户面临一个严峻的问题——如何从这些庞杂的信息中快速准确地提取出自己所需的内容。传统的搜索引擎虽然能够帮助用户定位到相关文档,但往往需要用户自行阅读全文以筛选出...