<正向/反向>最大匹配算法(Java)
算法描述(正向):
给定最大词长n,待分词文本str,指针f=0,词典dic文档
1 取子串sub=str(f,f+n)
2 如果(遍历dic,有匹配sub) f++;
3 否则 n--;
4 注意:边界判定、没有找到词的情况
算法举例分析(正向):
你有个要分词的文本“你毁了我容忍傻逼的能力”,你给出能最大接受的词长为6
(注意,6为6字节(byte),而一个汉字为2字节,你可能注意到下面的程序里我把6除以2了,因为在java里,char也是两字节的,所以它能装一个汉字,也可以装一个字母或符号。)
现在指针指向第一个字,第一次取到的子串是“你毁了”,在词典中找有没有这个词,没有,那我们把词长变成4,即两个字,第二次取到的子串是“你毁”,再找,也没有,第三次取到的子串是“你”,在词典中能找到了,这时指针加一,指向“毁”字,词长恢复6,这就是一轮查找了。
。。。
跳过几步,假如现在指针指向了“容”字,第一次取到“容忍傻”,第二次取到“容忍”,“容忍”在词典能找到,这个时候,指针需要移动两位指向“傻”字,同理,若你取到三个字的词而且这个词能在词典中找到时,指针也要移三位,即 f+n
反向最大匹配跟正向原理一样,只是指针从最后一位开始向前移动。
package Algorithm; import common.InitializeCorpus;
import java.io.IOException;
import java.util.Stack; /**
*
* @author 小振xzh 20140317
* 正向/反向最大匹配分词算法
*/
public final class MaximumMatching {
public String result; //结果
private int posIndex; //指针
private int len; //长度
private int maxLen; //最大长度
private boolean re; //false正向,true反向 //---正向---
public String forwardMaximumMatching(int maxLength, String str) throws IOException{
result = "";
posIndex = 0;
len = maxLength;
maxLen = len;
re = false;
MM(str, maxLen, 0);
return result;
} //---反向---
public String reversedMaximumMatching(int maxLength, String str) throws IOException{
result = "";
posIndex = 0;
len = maxLength;
maxLen = len;
re = true;
MM((new StringBuilder(str)).reverse().toString(), maxLen, 0); //源串反转
return result;
} public void MM(String source,int len,int frompos) throws IOException{
if(posIndex>source.length()-1){
return;
}
if(source.length()-frompos<len){
len = source.length()-frompos;
}
String tmp = source.substring(frompos, frompos+len); //获得子串 if(!re){
if(InitializeCorpus.ChineseDicList.contains(tmp)){ //这是另一个类里定义的静态ArrayList,里面存的是词
result += tmp+"/ ";
posIndex += len;
len = maxLen; //重置长度
MM(source, len, posIndex);
}else if(len>1){
len -= 1;
MM(source, len, posIndex);
}else{
result += "字典中没有‘"+tmp+"’字/ ";
posIndex += 1;
len = maxLen;
MM(source, len, posIndex);
}
}else{
tmp = (new StringBuilder(tmp)).reverse().toString();
Stack<String> sk = new Stack<String>(); //反向使用stack存储词语
if(InitializeCorpus.ChineseDicList.contains(tmp)){
sk.push(tmp+"/ ");
posIndex += len;
len = maxLen;
MM(source, len, posIndex);
}else if(len>1){
len -= 1;
MM(source, len, posIndex);
}else{
sk.push("字典中没有’"+tmp+"'字/ ");
posIndex += 1;
len = maxLen;
MM(source, len, posIndex);
}
while(!sk.isEmpty()){
result += sk.pop();
}
}
}
}
------------------2014年03月22日
关于算法的效率改进的一个地方,就是在构造函数中,把词典读到一个数组里,空间换时间,这样速度可以提高大约10倍?
-------------------2014年04月15日
修改了算法的代码 | 代码整洁之道
<正向/反向>最大匹配算法(Java)的更多相关文章
- 【05】Nginx:TCP / 正向 / 反向代理 / 负载均衡
写在前面的话 在我们日常的工作中,不可能所有的服务都是简单的 HTML 静态网页,nginx 作为轻量级的 WEB 服务器,其实我们将它用于更多的地方还是作为我们网站的入口.不管你是后端接口,还是前端 ...
- SSH 正向/反向代理小记
上周因为玩耍Minecraft的原因,折腾了下ssh的正向.反向代理,不得不说,科技改变命运..了解了基础的用法之后,很多跨域的事情都可以通过代理解决,而且只需要ssh帐号权限即可. 那么就简单来介绍 ...
- 《DNS的正向反向解析》RHEL6
DNS的正向解析: Iptables –F Setenforce 0 安装DNS服务器的软件包: 启动DNS服务器: 修改DNS的配置文件:vim /etc/named.conf 修改DNS的配置:( ...
- MyEclipse 利用反向功能生成Java 实体类
1.Window -> Open Perspective -> MyEclipse Database Explorer 到DB Broswer界面 2.右键 -> New,新建一个数 ...
- 03-UIKit、VC之间正向反向传值、代理
目录: 一.正向传值 二.反向传值 三.代理模式 回到顶部 正向传值:就是把第一个界面的值传给第二个界面显示,其简单实现方法 1 首先在第一个界面中要有一个textField输入框,一个按钮butto ...
- POJ-1511 Invitation Cards---Dijkstra+队列优化+前向星正向反向存图
题目链接: https://vjudge.net/problem/POJ-1511 题目大意: 给定节点数n,和边数m,边是单向边. 问从1节点出发到2,3,...n 这些节点路程和从从这些节点回来到 ...
- C# 算法之链表、双向链表以及正向反向遍历实现
1.简介 链表是一种非常基础的数据结构之一,我们在日常开发种都会接触到或者是接触到相同类型的链表数据结构.所以本文会使用C#算法来实现一个简单的链表数据结构,并实现其中几个简单的api以供使用. 2. ...
- django 正向,反向
表名 ,foreignkey, 正向 obj.表名小写_set.all() 反向操作.
- 使用netcat的正向 / 反向shell
reverse shell bind shell reverse shell描述图: 在此示例中,目标使用端口4444反向连接攻击主机.-e选项将Bash shell发回攻击主机.请注意,我们也可以在 ...
随机推荐
- WinRAR 自动解压 解压完成后,执行批处理文件
部分内容参考网页:http://bbs.kafan.cn/thread-1243208-1-1.html WinRAR 的自动解压文件功能使压缩包也能像 Setup 程序那样,双击后显示一个软件许可, ...
- Mantis 缺陷管理系统配置与安装[Z]
什么是Mantis MantisBT is a free popular web-based bugtracking system (feature list). It is written in t ...
- Lazarus解决含中文文件名或路径的使用问题
其实用lazarus很久(也不算久啦..),目前打算做完手头的最后一个小程序然后就转向c#窗体程序..之前用lazarus的时候出了很多问题,资料也不是很好找,所以这回把比较容易说的记下来省得忘掉 ...
- centos6安装vncserver实现图形化访问
一.配置163的yum源 1.导入CentOS-6的GPG证书 #rpm --import http://mirrors.163.com/centos/RPM-GPG-KEY-CentOS-6 2.让 ...
- mysql建立数据库的方法
mysql建立数据库的方法 方法一:使用create mysql> create database roudy; Query OK, 1 row affected (0.00 sec) mysq ...
- 深入理解this对象
最近一直在看js关于面向对象编程方面的东西,那么this肯定是需要一个被吃透 理解 同时灵活运用的对象 现在总结一下自己的学习成果: 我们可以用一句很形象的话来理解什么是this关键字? " ...
- VueJS搭建简单后台管理系统框架(一)环境搭建
做这份笔记的时候,Vue.js还是1.0,10月份Vue已经升级到2.0,这边也进行相应的更新,用Vue2.0进行一个简单的环境搭建 饿了么也刚好开源了其基于Vue.js的UI框架element-ui ...
- High Context とLow Context文化
社会の様々な文化を分類するのに.Low context culture, High context cultureという分け方がある.ビジネススクールのグローバル・マーケティングの授業などでよく取り上 ...
- WebUploader IE9下报错
WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件.在项目中,推荐并一直在使用WebUploader进行文件上传业务开发. ...
- jsp 配置MySQL服务器 以及数据的插入和读取
不多说,直接上代码.百度上面也是一大堆,大家多问百度就行. 在利用JDBC访问数据库过程中,主要涉及三种资源:对数据库的连接的连接对象Connection,SQL语句对象 Statement,访问结果 ...