java 最大分词算法_Java实现的最大匹配分词算法详解

本文实例讲述了java实现的最大匹配分词算法。分享给大家供大家参考,具体如下:

全文检索有两个重要的过程:

1分词

2倒排索引

我们先看分词算法

目前对中文分词有两个方向,其中一个是利用概率的思想对文章分词。 也就是如果两个字,一起出现的频率很高的话,我们可以假设这两个字是一个词。这里可以用一个公式衡量:m(a,b)=p(ab)/p(a)p(b),其中 a表示一个字,b表示一个字,p(ab)表示ab相邻出现的概率,p(a)表示a在这篇文章中的频度,p(b)表示b在这篇文章中的频度。用概率分词的好 处是不需要借助词典的帮助,坏处是算法比较麻烦,效率不高,也存在一定的出错率。

另外的一个方向是使用词典分词。就是事先为程序准备一个词典,然后通过这个词典对文章分词。目前较流行的方式有正向最大匹配算法和逆向最大匹配算法。逆向最大匹配算法在准确性上要更好一些。

以 “我是一个坏人” 为例,并最大词长为3,词库包含有 我、是、一、个、一个、坏人、大坏人

正向的顺序为

我是一

我是

我 ===> 得到一个词

是一个

是一

是 ===>得到一个词

一个坏

一个===> 得到一个词

坏人===>得到一个词

结果 我、是、一个、坏人

反向算法

个坏人

坏人==> 坏人

是一个

一个==> 一个

我是

是==> 是

我==> 我

结果 我、是、一个、坏人

java代码如下

package data;

import java.util.arrays;

import java.util.hashset;

import java.util.set;

/**

* 最大匹配分词算法

*

* @author jyc506

*

*/

public class splitstring {

private set set = new hashset();

private int positiveover = 0;

private int reverseover = 0;

/**

* 正向最大匹配

*

* @param str 要分词的句子

* @param num 词的最大长度

* @return

*/

public string[] positivesplit(string str, int maxsize) {

int tem = 0;

int length = str.length();

string[] ss = new string[length];

char[] cc = str.tochararray();

for (int i = 0; i < length; i++) {

positiveover = 0;

string sb = this.tostr(cc, i, maxsize);

ss[tem++] = sb;

i = i + positiveover;

}

string[] ss2 = new string[tem];

system.arraycopy(ss, 0, ss2, 0, tem);

return ss2;

}

/**

* 添加词库

*

* @param words

*/

public void addword(string[] words) {

for (string st : words) {

this.set.add(st);

}

}

/**

* 逆向最大匹配

*

* @param str

* @param num

* @return

*/

public string[] reversesplit(string str, int num) {

int tem = 0;

int length = str.length();

string[] ss = new string[length];

char[] cc = str.tochararray();

for (int i = str.length() - 1; i > -1; i--) {

reverseover = 0;

string sb = this.tostr2(cc, i, num);

tem++;

ss[--length] = sb;

i = i - reverseover;

}

string[] ss2 = new string[tem];

system.arraycopy(ss, str.length() - tem, ss2, 0, tem);

return ss2;

}

private string tostr(char[] cs, int start, int num) {

int num2 = num;

out: for (int j = 0; j < num; j++) {

stringbuffer sb = new stringbuffer();

for (int i = 0; i < num2; i++) {

if (start + i < cs.length) {

sb.append(cs[start + i]);

} else {

num2--;

j--;

continue out;

}

}

if (set.contains(sb.tostring())) {

positiveover = num2 - 1;

return sb.tostring();

}

num2--;

}

return string.valueof(cs[start]);

}

private string tostr2(char[] cs, int start, int num) {

int num2 = num;

for (int j = 0; j < num; j++) {

stringbuffer sb = new stringbuffer();

for (int i = 0; i < num2; i++) {

int index = start - num2 + i + 1;

if (index > -1) {

sb.append(cs[index]);

} else {

num2--;

}

}

if (set.contains(sb.tostring())) {

reverseover = num2 - 1;

return sb.tostring();

}

num2--;

}

return string.valueof(cs[start]);

}

public static void main(string[] args) {

string[] words = new string[] { "我们", "我们五人", "五人一组", "一组" };

splitstring ss = new splitstring();

/*添加词到词库*/

ss.addword(words);

string st = "我们五人一组";

system.out.println("萬仟网测试结果:");

system.out.println("要分词的句子:" + st);

/*使用两种方式分词,下面我指定最大词长度为4*/

string[] ss2 = ss.reversesplit(st, 4);

string[] ss1 = ss.positivesplit(st, 4);

system.out.println("正向最大匹配分词算法分词结果:" + arrays.tostring(ss1));

system.out.println("逆向最大匹配分词算法分词结果:" + arrays.tostring(ss2));

}

}

88be60d489751f465b84a5b6930c2c8b.png

希望本文所述对大家java程序设计有所帮助。

希望与广大网友互动??

点此进行留言吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/527018.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java jnotify_Jnotify文件监控的用法以及Jar文件导入的方法

简介Jnotiy, 支持动态监控(支持级联监控)文件夹和文件的jar包。在linux中&#xff0c;调用linux底层的jnotify服务。在windows中&#xff0c;需要添加附件的dll文件。因为通用的Maven仓库中没有此Jar文件&#xff0c;pom.xml文件需要如下配置&#xff1a;net.contentobjects.jn…

java 异常练习题_Java 异常(习题)

异常Key Point* 异常的概念和分类* 异常的产生和传递* 异常的处理* 自定义异常练习1. 填空Java 中所有的错误都继承自throwable类&#xff1b;在该类的子类中&#xff0c;Error类表示严重的底层错误&#xff0c;对于这类错误一般处理的方式是不要求我们对其处理Exception类表示…

mysql 半同步 主主_MySQL主从,半同步,主主复制

MySQL Replication我们知道&#xff0c;MySQL数据库的二进制日志记录着每一个明确或者潜在可能导致数据库发生改变的sql语句&#xff0c;因此我们可以基于二进制日志来实现mysql的主从一致。而我们在此提到的mysql的复制的简单过程就是&#xff1a;首先mysql的主服务器(Master)…

java 数据队列_Java 数据结构 - 队列

Java 数据结构 - 队列我们今天要讲的数据结构是队列&#xff0c;比如 Java 线程池任务就是队列实现的。1. 什么是队列和栈一样&#xff0c;队列也是一种操作受限的线性结构。使用队列时&#xff0c;在一端插入元素&#xff0c;而在另一端删除元素。1.1 队列的主要特性队列中的数…

java+set+split_阿里资深工程师教你如何优化 Java 代码!

原标题&#xff1a;阿里资深工程师教你如何优化 Java 代码&#xff01;作者 | 王超责编 | 伍杏玲明代王阳明先生在《传习录》谈为学之道时说&#xff1a;私欲日生&#xff0c;如地上尘&#xff0c;一日不扫&#xff0c;便又有一层。着实用功&#xff0c;便见道无终穷&#xff0…

myVariable是java标识符吗_java 标识符与变量

一、Java 标识符三要素1.标识符由字母、下划线(_)、美元符号($)或者字母组成。2.标识符应以字母、下划线(_)、美元符开头。3.标识符字符大小写敏感&#xff0c;长度无限制。标识符最重要的就是 见名知意并且不能与java关键字重名!二、Java 变量1.java变量是程序中最基本的单元。…

友盟统计java代码_SFAnalytics 分析友盟统计源码,反编译 SDK,还有部分没有 出来 android 259万源代码下载- www.pudn.com...

文件名称: SFAnalytics下载 收藏√ [5 4 3 2 1 ]开发工具: Java文件大小: 8023 KB上传时间: 2016-06-05下载次数: 0提 供 者: 花心大萝卜详细说明&#xff1a;分析友盟统计源码&#xff0c;反编译友盟统计SDK&#xff0c;还有部分没有反编译出来-Analysis their Allies s…

java mvc数据库 封装_关于SpringMvc参数封装_JavaEE框架(Maven+SpringMvc+Spring+MyBatis)全程实战教程_Java视频-51CTO学院...

SpringMVCSpring MVC属于SpringFrameWork的后续产品&#xff0c;已经融合在Spring Web Flow里面。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色&#xff0c;这种分离让它们更容易进行定制。SpringSpring是一个开源框架&#xff0c;Spring是于2003 年兴起的…

20199计算机二级java答案_计算机二级Java练习题-2019.9

是不是急于做大量的计算机等级考试题库&#xff0c;却因测试结果不尽人意而心慌不安&#xff1f;不要急&#xff01;考无忧小编为大家准备了一些二级Java练习题&#xff0c;希望能帮助大家高效复习&#xff0c;轻松通关&#xff01;1.下列叙述中正确的是()。A.栈是“先进先出”…

平行志愿遵循分数优先php,2020平行志愿的录取规则是什么有哪些优势

摘要&#xff1a; 2020平行志愿的录取规则是什么有哪些优势为你介绍平行志愿的投档原则仍为“分数优先&#xff0c;遵循志愿”&#xff0c;而传统的顺序志愿则是根据“志愿优先&#xff0c;按分排序”。 2020平行志愿录取规则 平行志愿的投档原则仍为“分数优先&#xff0c;遵循…

Oracle quartile函数,Oracle分析函数六——数据分布函数及报表函数

Oracle 分析函数——数据分布函数及报表 函数CUME_DIST功能描述&#xff1a;计算一行在组中的相对位置&#xff0c; CUME_DIST 总是返回大于 0 、小于或等于 1 的数&#xff0c;该数表示该行在 N 行中的位置。例如&#xff0c;在一个 3 行的组中&#xff0c;返回的累计分布值为…

redhat配置oracle yum源,Redhat5和6 YUM源配置的区别

一、概述随着各个软件版本的不断升级&#xff0c;我们需要掌握的软件特性也越来越多&#xff0c;技术的不断更新也促进了我们脑细胞的循环。 今天在配置RedHat6.3的yum源时也出现了一个有趣的事情&#xff0c;下面请听俺道来。二、问题处理问题源于哥们处&#xff0c;自己就搭建…

linux7 修改服务启动项目命令,centos7服务部署flask项目

8种机械键盘轴体对比本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f;centos7语言配置问题登录服务器&#xff0c;注意观察是否出现以下警告提示warning: setlocale: LC_CTYPE: cannot change locale (en_US.utf8): No such file or d…

虚拟机linux中怎样打开qt,虚拟机中在Centos 4.7中安装qt-x11-opensource-4.4.3

本人最近学习qt&#xff0c;把qt安装在了虚拟机下&#xff0c;用的是免费的Linux&#xff0c;qt是Linux下开发c不错的软件&#xff0c;经过了2天的奋战&#xff0c;终于把qt安装在了自己的机器上面&#xff0c;现在把安装步骤告诉大家&#xff0c;希望对你们安装错误的同志们有…

linux top p 乱码,将Linux top命令输入到指定文件时的乱码问题

根据需求&#xff0c;项目需要读取linux系统环境参数&#xff0c;所以需要将top命令的输出结果输入到文件中。用重定向命令如下&#xff1a;topresult.txt。用vi打开文件&#xff1a;viresult.txt。显示的根据需求&#xff0c;项目需要读取linux系统环境参数&#xff0c;所以需…

win10子linux如何重置密码,Win10如何使用Windows PowerShell命令重置本地账户密码

在win10系统中&#xff0c;都自带有本地账户&#xff0c;为了安全也会给本地商户设置密码&#xff0c;不过使用一段时间之后&#xff0c;想要重置本地账户密码&#xff0c;但是很多用户并不知道要如何操作&#xff0c;其实我们可以使用Windows PowerShell命令方式来实现&#x…

linux wine 性能,Wine 1.9.16 发布,改善 GDI 性能

Wine 1.9.16 最近发布下载&#xff0c;配备了大量的新功能&#xff0c;改进和错误修正。显着的更新包括在MacOS下能更好与64位二进制兼容性&#xff0c;提升JavaScript性能&#xff0c;对Direct3D的改进&#xff0c;在Direct3D更多的着色器指令&#xff0c;提升GDI性能&#xf…

二级考试c语言中 星号与字母 题型总结,2017年计算机二级考试C语言知识点归纳...

2017年计算机二级考试C语言知识点归纳计算机二级考试是全国计算机等级考试(National Computer Rank Examination&#xff0c;简称NCRE)四个等级中的一个等级&#xff0c;考核计算机基础知识和使用一种高级计算机语言编写程序以及上机调试的基本技能。下面是2017年计算机二级考试…

c#语言输出字符串长度,C#获取字符串长度(string.Length)

字符串实际上是由多个字符组成的&#xff0c;字符串中的第一个字符使用字符串[0]即可得。[0]中的0称为下标。获取字符串中的第一个字符使用的下标是0,则字符串中最后一个字符的下标是字符串的长度减1。使用C#语言如果要获取字符串的长度&#xff0c;使用Length属性即可&#xf…

易语言取c盘文件夹中的文件被占用,win7系统怎么快速找出文件被什么进程占用|win7解除文件占用的方法...

‍‍很多时候我们想删除文件或文件夹的时候&#xff0c;会出现文件正在使用的提示导致文件无法删除&#xff0c;如果知道是什么程序在使用这个文件好&#xff0c;但多数时候我们并不知道是被什么程序占用&#xff0c;那么在win7系统怎么快速找出文件被什么进程占用呢&#xff1…