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 集合迭代器_Java中的集合迭代器

集合的迭代器任何集合都有迭代器。任何集合类&#xff0c;都必须能以某种方式存取元素&#xff0c;否则这个集合容器就没有任何意义。迭代器&#xff0c;也是一种模式(也叫迭代器模式)。在java中它是一个对象&#xff0c;其目的是遍历并选中其中的每个元素&#xff0c;而使用者…

git关闭密码自动存储_项目在 git 里怎样合理的保存配置文件(服务器密码等敏感内容)...

办法其实很多&#xff0c;有两种较常用。第一种是配置文件不提交真实内容&#xff0c;只提交一个模板文件。每个开发者克隆之后按照自己的环境补完配置文件&#xff0c;这样自然而然就独立出来了(需更改文件名并忽略有效配置文件)。如果配置文件很大配置项很多&#xff0c;此法…

isfull mysql_Mysql8.0及以上版本,关于only_full_group_by的问题

mysql8.0及以上版本&#xff0c;关于only_full_group_by的问题&#xff1a;ERROR 1055 (42000): Expression #7 of SELECT list is not in GROUP BY clause and contains nonaggregated column postscan.verifyDelayLog.auditor which is not functionally dependent on column…

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 local_java.time.LocalDateTime with()方法

java.time.LocalDateTime with()方法java.time.LocalDateTime.with(TemporalAdjuster adjuster)方法返回此日期时间的调整副本。1 语法public LocalDateTime with(TemporalAdjuster adjuster)2 参数adjuster&#xff1a;要使用的调整器&#xff0c;而不是null。3 返回值一个Loc…

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

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

java中死锁_关于java中死锁的总结

关于死锁&#xff0c;估计很多程序员都碰到过&#xff0c;并且有时候这种情况出现之后的问题也不是非常好排查&#xff0c;下面整理的就是自己对死锁的认识&#xff0c;以及通过一个简单的例子来来接死锁的发生&#xff0c;自己是做python开发的&#xff0c;但是对于死锁的理解…

eclipse java的jvm匹配_eclipse设置jvm

Java虚拟机默认分配64M内存&#xff0c;如果你的应用比较大&#xff0c;超出64M内存&#xff0c;Java虚拟机就会抛出outOfMemoryError&#xff0c;并停止运行。不管是什么应用(Web应用、Application等)&#xff0c;只需要修改你的机器上的运行Java命令&#xff0c;在javaxxx命令…

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

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

java返回特定下标元素_java基础--输出数组中指定元素的下标

java基础--输出数组中指定元素的下标java基础--输出数组中指定元素的下标package com.lcn.day05;public class ArrayDemo8 {/*** 输出数组指定元素的下标*/public static void main(String[] args) {//定义一个数组int[] array new int[]{123,456,789,321,654,987};int index …

java钱币换算_Java编写钱币转换为大写程序

import java.text.DecimalFormat;public class ChangeMonney {private static final String[] STR_UNIT {"零", "壹", "贰", "叁", "肆", "伍","陆", "柒", "捌", "玖"…

java mongodb 使用场景_mongodb使用场景一般是什么?mongodb有哪些基本命令?

此前我们已经充分了解过了mongodb的原理及各种概念&#xff0c;你们知道一般在什么场景下才会使用mongodb吗?下面通过文章来了解一下吧。一、mongodb基本命令1)、数据库切换use admin;2)、浏览当前数据库db;3)、浏览全部数据库show dbs;4)、删除数据库use test;db.dropDatabas…

java desktop mailto,mailto在Java?

I am trying to set a hyperlink in my eclipse java project.when someone clicks on a button, it should open up an email client along with the givenemail id. is it possible to implement it with java.awt.Desktop?解决方案Yes it is possible using desktop.mail()…

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

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

使java代码更干净_java如何使用Lombok更优雅地编码

Lombok简介和其他语言相比&#xff0c;Java经常因为不必要的冗长被批评。Lombok提供了一系列注解用以在后台生成模板代码&#xff0c;将其从你的类中删除&#xff0c;从而有助于保持你的代码整洁。较少的模板意味着更简洁的代码&#xff0c;更易于阅读和维护。在本文中&#xf…

java自动创建月份_使用Java根据月份动态绘制BarGraph

您需要通过每次更改来更新数据集.我添加了一个updateDataset()方法,并在几个关键位置调用了它.private void updateDataset() {dataset.clear();for (int i 1; i < finalday; i) {dataset.setValue(i, "Marks", "" i);}笔记&#xff1a;>不要使用绝…

mysql 5.6.23 源码包安装报错_Ubuntu 14.10下编译安装MySQL 5.6.23

1. 安装环境&#xff1a;Ubuntu Server 14.10MySQL-5.6.23.tar.gz2. 安装必备的工具sudo apt-get install make bison g build-essential libncurses5-dev cmake3. 添加组合用户 设置安装目录权限sudo groupadd mysqlsudo useradd –g mysql mysql –s /bin/false #创建用户mys…

java 阻塞 性能_聊聊并发-Java中的阻塞队列

1. 什么是阻塞队列&#xff1f;阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是&#xff1a;在队列为空时&#xff0c;获取元素的线程会等待队列变为非空。当队列满时&#xff0c;存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景…