`

庖丁分词的源码分析 (3)字典文件的生成和使用

阅读更多



可以看到庖丁分词里有两种字典,一种读取的是编译处理之前的,一种是处理之后的。
基本上看他们的getVocabularyDictionary方法就可以了,这个是获取字典文件的主要方法。

在这里两个字典对象的基本相同,只是处理前的要过滤一些词,而处理过的直接就可以了。

处理后的字典对象的getVocabularyDictionary方法:

/**
	 * 词汇表字典
	 * 
	 * @return
	 */
	public synchronized Dictionary getVocabularyDictionary() {
		if (vocabularyDictionary == null) {
			// 大概有5639个字有词语,故取0x2fff=x^13>8000>8000*0.75=6000>5639
			vocabularyDictionary = new HashBinaryDictionary(
					getVocabularyWords(), 0x2fff, 0.75f);
		}
		return vocabularyDictionary;
	}


其中的关键其实就是这个HashBinaryDictionary了。其实这个就是个多叉树。
用这个方法来生成字典的。


protected void createSubDictionaries() {
		if (this.start >= ascWords.length) {
			return;
		}
		
		// 定位相同头字符词语的开头和结束位置以确认分字典
		int beginIndex = this.start;
		int endIndex = this.start + 1;
		
		char beginHashChar = getChar(ascWords[start], hashIndex);
		char endHashChar;
		for (; endIndex < this.end; endIndex++) {
			endHashChar = getChar(ascWords[endIndex], hashIndex);
			if (endHashChar != beginHashChar) {
				addSubDictionary(beginHashChar, beginIndex, endIndex);
				beginIndex = endIndex;
				beginHashChar = endHashChar;
			}
		}
		addSubDictionary(beginHashChar, beginIndex, this.end);
	}


说明一下,传入字典的这个大数组是排好序的。endHashChar != beginHashChar,说的是相同位置的字不一样的时候,如一一 一二 二二,第三个字符串二二和前面的两个字的第一个字不一样,前面的两个都是一 二二的第一个字是二。这个时候执行addSubDictionary。意思就是说相同位置的字相同,那么久在一个SubDictionary,就是说这些是个分叉树。然后继续这样不断分叉下去。

/**
	 * 将位置在beginIndex和endIndex之间(不包括endIndex)的词语作为一个分词典
	 * 
	 * @param hashChar
	 * @param beginIndex
	 * @param endIndex
	 */
	protected void addSubDictionary(char hashChar, int beginIndex, int endIndex) {
		Dictionary subDic = createSubDictionary(ascWords, beginIndex, endIndex);
		SubDictionaryWrap subDicWrap = new SubDictionaryWrap(hashChar,
				subDic, beginIndex);
		subs.put(keyOf(hashChar), subDicWrap);
	}


注意subDicWrap包装的可能是HashBinaryDictionary,也可能是BinaryDictionary(二叉树),当数目小于16的时候就用二叉树了。
protected Dictionary createSubDictionary(Word[] ascWords, int beginIndex,
			int endIndex) {
		int count = endIndex - beginIndex;
		if (count < 16) {
			return new BinaryDictionary(ascWords, beginIndex, endIndex);
		} else {
			return new HashBinaryDictionary(ascWords, hashIndex + 1,
					beginIndex, endIndex, getCapacity(count), 0.75f);
		}
	}



所以其实整个字典就是个多叉树。

字典的使用:其实就是用个关键词去匹配这个多叉树,
HashBinaryDictionary的查找方法

public Hit search(CharSequence input, int begin, int count) {
		SubDictionaryWrap subDic = (SubDictionaryWrap) subs.get(keyOf(input
				.charAt(hashIndex + begin)));
		if (subDic == null) {
			return Hit.UNDEFINED;
		}
		Dictionary dic = subDic.dic;
		// 对count==hashIndex + 1的处理
		if (count == hashIndex + 1) {
			Word header = dic.get(0);
			if (header.length() == hashIndex + 1) {
				if (subDic.wordIndexOffset + 1 < this.ascWords.length) {
					return new Hit(subDic.wordIndexOffset, header,
							this.ascWords[subDic.wordIndexOffset + 1]);
				} else {
					return new Hit(subDic.wordIndexOffset, header, null);
				}
			} else {
				return new Hit(Hit.UNCLOSED_INDEX, null, header);
			}
		}
		// count > hashIndex + 1
		Hit word = dic.search(input, begin, count);
		if (word.isHit()) {
			int index = subDic.wordIndexOffset + word.getIndex();
			word.setIndex(index);
			if (word.getNext() == null && index < size()) {
				word.setNext(get(index + 1));
			}
		}
		return word;
	}

注意这里的状态有 Hit的几个状态来对应 找到:index>0,找不到:UNCLOSED_INDEX,和以这个词开头的都找不到:UNDEFINED。至于为什么要这些状态,这些在分词的环节中是有大用处的。

二叉树的和这个也类似 我就不细说了。



  • 大小: 4.8 KB
分享到:
评论

相关推荐

    庖丁分词jar包和dic目录

    标题中的“庖丁分词jar包和dic目录”指的是一个用于中文分词处理的软件工具,其中包含了必要的jar包和字典文件。庖丁分词是基于Java开发的一个高效、可扩展的中文分词库,它借鉴了Lucene的分词技术,并在此基础上...

    庖丁分词jar包

    在压缩包文件名称“paoding-analysis-2.0.0”中,“paoding”是庖丁分词的英文名称,“analysis”可能指的是其分析功能,尤其是中文文本分析。“2.0.0”表示这是该软件的第二个主要版本,版本号中的“0.0”可能表示...

    庖丁分词.jar

    庖丁分词.jar 庖丁分词.jar 庖丁分词.jar 庖丁分词.jar

    lucene中文分词(庖丁解牛)庖丁分词

    5. 搜索优化:在搜索阶段,同样可以使用庖丁分词器对用户输入的查询进行预处理,提高搜索的精确度。 四、庖丁分词的高级特性 1. 自定义词典:除了预设的词典,还可以通过编程方式动态加载自定义词典,适应变化的...

    庖丁解牛分词源码

    3. **动态匹配算法**:源码中可能使用了动态规划算法,如Boyer-Moore算法或者KMP算法,用于高效地进行字符串匹配,减少不必要的字符比较,提高分词速度。 4. **Java编程**:作为Java实现的分词工具,庖丁解牛分词器...

    庖丁分词测试数据集 工具

    庖丁分词是一款在中文自然语言处理领域...总的来说,庖丁分词测试数据集为开发者提供了一个评估和改进分词算法的平台,通过对"data"文件中内容的深入分析和处理,可以不断提升庖丁分词在中文自然语言处理任务中的表现。

    庖丁解牛 中文分词工具

    这种方式为开发人员提供了一个便捷的测试平台,使他们能够即时观察和分析分词效果,便于调试和优化分词算法。同时,非技术用户也能通过直观的交互界面来理解分词过程,体验从文本到词汇的转换。 软件的运行离不开...

    最新庖丁分词源代码(for lucene3.0)

    庖丁分词是一款知名的中文分词工具,专为Apache Lucene搜索引擎库设计和优化。Lucene是一个开源全文检索库,广泛应用于各种信息检索系统。在本压缩包中,你将找到针对Lucene 3.0版本优化的庖丁分词源代码。 1. **...

    庖丁解牛分词之自定义词库、庖丁解牛配置

    在提供的文件列表中,“庖丁解牛分词之自定义词库[自定义词典].htm”很可能是介绍如何创建和使用自定义词库的教程文档。通过阅读这个文件,开发者可以学习如何创建自己的词典文件,以及如何在庖丁解牛分词工具中进行...

    庖丁解牛分词 java包

    3. `Paoding中文分词参考手册.htm`: 这是一个HTML文档,包含了庖丁解牛分词的使用指南和API文档,对于学习和使用该工具至关重要。 4. `paoding-analysis.jar`: 这是核心的Java类库文件,包含了庖丁解牛分词的实现...

    庖丁分词归类

    "庖丁分词归类"是一个基于Java的自然语言处理工具包,主要专注于文本分词和分类。在中文文本处理领域,分词是基础且关键的一环,它将连续的汉字序列切分成具有语义意义的词语,为后续的文本分析、信息提取、情感分析...

    庖丁解牛,一种中文分词器

    "庖丁解牛"分词器采用了先进的算法和技术来解决这个问题,包括基于词典的匹配、上下文信息分析以及统计学习方法等,使得它在处理中文文本时表现出了较高的准确性和效率。 "Lucene"是一个流行的开源全文搜索引擎库,...

    庖丁分词工具

    庖丁中文分词需要一套词典,这些词典需要统一存储在某个目录下,这个目录称为词典安装目录。词典安装目录可以是文件系统的任何目录,它不依赖于应用程序的运行目录。将词典拷贝到词典安装目录的过程称为安装词典。...

    sorlr + tomcat+ 庖丁解牛中文分词 配置文档

    - 更新`schema.xml`文件,定义字段类型,指定使用庖丁解牛分词器。 - 在`managed-schema`或`schema.xml`中,定义包含中文内容的字段,并指定对应的字段类型。 6. **Solr的分词器配置**: 在`solrconfig.xml`中,...

    庖丁中文分词在VB.NET的使用例子方法

    在VB.NET环境下使用庖丁中文分词,首先需要将庖丁的DLL文件引入项目中。从给定的部分内容可以看出,代码中通过`Application.StartupPath`获取了项目的启动路径,并以此为基础定位到存放庖丁DLL文件的位置。`pangu_...

    lucene3庖丁解牛中文分词器

    2. **配置字典**:利用`dic`目录下的字典文件,可以定制化分词器的词典,以适应特定领域或行业的需求。 3. **初始化分词器**:在Lucene的Analyzer类中,选择庖丁解牛的Analyzer实现,例如`PaoDingAnalyzer`。 4. *...

    支持lucne4.X的庖丁分词jar包

    支持lucne4.X的庖丁分词jar包,自己打的jar包,保准好用

    Lucene3.0以上版本庖丁解牛分词法demo

    最新庖丁解牛分词法的使用demo,支持Lucene3.3、3.4等3.0以上版本,庖丁解牛的分词包为自己编译生成的,之前的2.0的版本不能支持Lucene3.0以上版本,所以需要从svn下载最新的庖丁解牛源码,生成jar文件(我同样已...

    paoding analysis 3.0.1 jar (庖丁解牛分词器)

    由于庖丁官方目前提供可下载尚不支持Lucene 3.0以上版本。因此作者对paoding进行重新编译,使其与最新Lucene 3.0.1版本适用。 Latest paoding 3.0.1 for lucene 3.0.1 使用说明: 先下载2.0.4的版本(h t t p : / ...

    lucene Analyzer 庖丁解牛 中文分词

    `SmartChineseAnalyzer`是Lucene针对简体中文设计的,它使用了基于词典的分词方法,能够识别常见的词语和成语。而`IKAnalyzer`(Intelligent Chinese Analyzer)则是一款第三方的开源Analyzer,它具有较好的分词效果...

Global site tag (gtag.js) - Google Analytics