Lucene中文分词mmseg4j

2024-04-05 22:08
文章标签 中文 分词 lucene mmseg4j

本文主要是介绍Lucene中文分词mmseg4j,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

mmseg4j 用 Chih-Hao Tsai 的 MMSeg 算法实现的中文分词器,并实现 lucene 的 analyzer 和 solr 的TokenizerFactory 以方便在Lucene和Solr中使用。

MMSeg 算法有两种分词方法:Simple和Complex,都是基于正向最大匹配。Complex 加了四个规则过虑。官方说:词语的正确识别率达到了 98.41%。mmseg4j 已经实现了这两种分词算法。

项目地址:

mmseg4j:https://github.com/chenlb/mmseg4j-from-googlecode

mmseg4j-core:https://github.com/chenlb/mmseg4j-core

mmseg4j-solr:https://github.com/chenlb/mmseg4j-solr

mmseg4j有几个analyzer:SimpleAnalyzer、ComplexAnalyzer、MaxWordAnalyzer、MMSegAnalyzer。前面三个都是继承 MMSegAnalyzer,MMSegAnalyzer 默认使用 max-word 方式分词。这些 analyzer 都有无参数的构造函数,还有一个带词库目录为参数的构造函数。
mmseg4j 的词库是使用utf-8 格式的,由于utf-8文件有带与不带 BOM 之分,建议词库第一行为空行或为无 BOM 格式的 utf-8 文件。
可以根据需要替换的词库文件:
data/chars.dic 是单字与语料中的频率,一般不用改动,mmseg4j 1.5版本后已经加到mmseg4j的jar里了,我们不需要关心它,当然你在词库目录放这个文件可以覆盖它。
data/units.dic 是单字的单位,默认读jar包里的,你也可以自定义覆盖它,这功能是试行,如果不喜欢它,可以空的units.dic文件(放到你的词库目录下)覆盖它。
词库文件
data/words.dic 是词库文件,一行一词,当然你也可以使用自己的,1.5版本使用 sogou 词库,1.0的版本是用 rmmseg 带的词库。 一般我们使用这个作为系统自带词库。分词效果当然还与词库有关,sogou 的词库是统计得出,有些高频的单字组合也成了词,如“我们的”。如果还要提高 mmseg4j 的分词效果,还要在整理下词库。
data/wordsxxx.dic 1.6版支持多个词库文件,data 目录(或你定义的目录)下读到"words"前缀且".dic"为后缀的文件。如:data/words-my.dic。 一般我们在这里里面,把这个当成我们自身特色的词库。
停止词
mmseg4j没有加任何stopword,如果需要stopword,需要用户自己实现。

maven依赖:

<properties><lucene.version>5.2.1</lucene.version></properties><dependencies><dependency><groupId> org.apache.lucene</groupId><artifactId> lucene-core</artifactId><version> ${lucene.version}</version></dependency><dependency><groupId> org.apache.lucene</groupId><artifactId> lucene-analyzers-common</artifactId><version> ${lucene.version}</version></dependency><dependency><groupId> org.apache.lucene</groupId><artifactId> lucene-queryparser</artifactId><version> ${lucene.version}</version></dependency><dependency><groupId> org.apache.lucene</groupId><artifactId> lucene-highlighter</artifactId><version> ${lucene.version}</version></dependency><dependency><groupId>com.chenlb.mmseg4j</groupId><artifactId>mmseg4j-core</artifactId><version>1.10.0</version></dependency><!--  如下可以编译最新的mmseg4j-analysis替换,不然加载报错 --><dependency><groupId>com.chenlb.mmseg4j</groupId><artifactId>mmseg4j-solr</artifactId><version>2.3.0</version><exclusions><exclusion><groupId>org.apache.solr</groupId><artifactId>solr-core</artifactId></exclusion></exclusions></dependency></dependencies>

测试实例:

package cn.slimsmart.lucene.mmseg4j.demo;import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.IndexWriterConfig.OpenMode;
import org.apache.lucene.queryparser.classic.QueryParser;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;import com.chenlb.mmseg4j.analysis.ComplexAnalyzer;public class Test {static Analyzer analyzer = null;static Directory directory = null;static String text = "CSDN.NET - 全球最大中文IT社区,为IT专业技术人员提供最全面的信息传播和服务平台";public static void main(String[] args) throws Exception {analyzer = new ComplexAnalyzer();directory = new RAMDirectory();write();search();}/*** 简单分词* * @throws Exception*/public static void write() throws Exception {IndexWriterConfig iwConfig = new IndexWriterConfig(analyzer);iwConfig.setOpenMode(OpenMode.CREATE_OR_APPEND);IndexWriter iwriter = new IndexWriter(directory, iwConfig);Document doc = new Document();doc.add(new TextField("text", text, Field.Store.YES));iwriter.addDocument(doc);iwriter.commit();iwriter.close();}public static void search() throws Exception {IndexReader ireader = DirectoryReader.open(directory);  IndexSearcher searcher = new IndexSearcher(ireader);  QueryParser qp = new QueryParser("text", analyzer);Query q = qp.parse("全球最大");System.out.println(q);TopDocs tds = searcher.search(q, 10);System.out.println("======size:" + tds.totalHits + "========");for (ScoreDoc sd : tds.scoreDocs) {System.out.println(sd.score);System.out.println(searcher.doc(sd.doc).get("text"));}}
}

参考文章:
1.官方博客
2.中文分词 mmseg4j

这篇关于Lucene中文分词mmseg4j的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/878267

相关文章

SQL Server安装时候没有中文选项的解决方法

《SQLServer安装时候没有中文选项的解决方法》用户安装SQLServer时界面全英文,无中文选项,通过修改安装设置中的国家或地区为中文中国,重启安装程序后界面恢复中文,解决了问题,对SQLSe... 你是不是在安装SQL Server时候发现安装界面和别人不同,并且无论如何都没有中文选项?这个问题也

Python实现中文文本处理与分析程序的示例详解

《Python实现中文文本处理与分析程序的示例详解》在当今信息爆炸的时代,文本数据的处理与分析成为了数据科学领域的重要课题,本文将使用Python开发一款基于Python的中文文本处理与分析程序,希望... 目录一、程序概述二、主要功能解析2.1 文件操作2.2 基础分析2.3 高级分析2.4 可视化2.5

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

RedisTemplate默认序列化方式显示中文乱码的解决

《RedisTemplate默认序列化方式显示中文乱码的解决》本文主要介绍了SpringDataRedis默认使用JdkSerializationRedisSerializer导致数据乱码,文中通过示... 目录1. 问题原因2. 解决方案3. 配置类示例4. 配置说明5. 使用示例6. 验证存储结果7.

springboot集成Lucene的详细指南

《springboot集成Lucene的详细指南》这篇文章主要为大家详细介绍了springboot集成Lucene的详细指南,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起... 目录添加依赖创建配置类创建实体类创建索引服务类创建搜索服务类创建控制器类使用示例以下是 Spring

一文教你解决Python不支持中文路径的问题

《一文教你解决Python不支持中文路径的问题》Python是一种广泛使用的高级编程语言,然而在处理包含中文字符的文件路径时,Python有时会表现出一些不友好的行为,下面小编就来为大家介绍一下具体的... 目录问题背景解决方案1. 设置正确的文件编码2. 使用pathlib模块3. 转换路径为Unicod

Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)

《Python爬虫selenium验证之中文识别点选+图片验证码案例(最新推荐)》本文介绍了如何使用Python和Selenium结合ddddocr库实现图片验证码的识别和点击功能,感兴趣的朋友一起看... 目录1.获取图片2.目标识别3.背景坐标识别3.1 ddddocr3.2 打码平台4.坐标点击5.图

Java下载文件中文文件名乱码的解决方案(文件名包含很多%)

《Java下载文件中文文件名乱码的解决方案(文件名包含很多%)》Java下载文件时,文件名中文乱码问题通常是由于编码不正确导致的,使用`URLEncoder.encode(filepath,UTF-8... 目录Java下载文件中文文件名乱码问题一般情况下,大家都是这样为了解决这个问题最终解决总结Java下

Go语言实现将中文转化为拼音功能

《Go语言实现将中文转化为拼音功能》这篇文章主要为大家详细介绍了Go语言中如何实现将中文转化为拼音功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 有这么一个需求:新用户入职 创建一系列账号比较麻烦,打算通过接口传入姓名进行初始化。想把姓名转化成拼音。因为有些账号即需要中文也需要英

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取