完成正向、逆向和双向最大匹配算法


import java.io.*;
import java.util.*;/*** 正向最大匹配* 逆向最大匹配* 双向最大匹配*/
public class TwoMaxMatch {private static final int MAX_LENGTH = 5;public static void main(String[] args) {//加载字典getDictionary();String string1 = "结婚的和尚未结婚的";System.out.println("正向最大匹配结果:" + leftMax(string1));System.out.println("逆向最大匹配结果:" + rightMax(string1));System.out.println("双向最大匹配结果:" + twoMax(string1));System.out.println("----------------------------------------------------");String string2 = "欢迎新老师生前来就餐";System.out.println("正向最大匹配结果:" + leftMax(string2));System.out.println("逆向最大匹配结果:" + rightMax(string2));System.out.println("双向最大匹配结果:" + twoMax(string2));System.out.println("----------------------------------------------------");String string3 = "项目的研究主题是商品和服务";System.out.println("正向最大匹配结果:" + leftMax(string3));System.out.println("逆向最大匹配结果:" + rightMax(string3));System.out.println("双向最大匹配结果:" + twoMax(string3));}/*** 正向最大匹配*/public static List<String> leftMax(String str) {List<String> results = new ArrayList<String>();String input = str;while (input.length() > 0) {String subSeq;// 每次取小于或者等于最大字典长度的子串进行匹配if (input.length() < MAX_LENGTH)subSeq = input;elsesubSeq = input.substring(0, MAX_LENGTH);while (subSeq.length() > 0) {// 如果字典中含有该子串或者子串颗粒度为1,子串匹配成功if (dictionary.contains(subSeq) || subSeq.length() == 1) {results.add(subSeq);// 输入中从前向后去掉已经匹配的子串input = input.substring(subSeq.length());break; // 退出循环,进行下一次匹配} else {// 去掉匹配字段最后面的一个字subSeq = subSeq.substring(0, subSeq.length() - 1);}}}return results;}/*** 逆向最大匹配*/public static List<String> rightMax(String str) {// 采用堆栈处理结果,后进先出Stack<String> store = new Stack<String>();List<String> results = new ArrayList<String>();String input = str;while (input.length() > 0) {String subSeq;// 每次取小于或者等于最大字典长度的子串进行匹配if (input.length() < MAX_LENGTH)subSeq = input;elsesubSeq = input.substring(input.length() - MAX_LENGTH);while (subSeq.length() > 0) {// 如果字典中含有该子串或者子串颗粒度为1,子串匹配成功if (dictionary.contains(subSeq) || subSeq.length() == 1) {store.add(subSeq);// 输入中从后向前去掉已经匹配的子串input = input.substring(0, input.length() - subSeq.length());break;} else {// 去掉匹配字段最前面的一个字subSeq = subSeq.substring(1);}}}// 输出结果int size = store.size();for (int i = 0; i < size; i++) {results.add(store.pop());}return results;}/*** 双向最大匹配*/public static List<String> twoMax(String str) {List<String> leftmax = leftMax(str);List<String> rightmax = rightMax(str);// 如果分词的数量结果不同,返回长度较小的if (leftmax.size() != rightmax.size()) {if (leftmax.size() > rightmax.size())return rightmax;elsereturn rightmax;}// 如果分词的数量结果相同else {//计算各自的  单字数int leftSingle = 0, rightSingle = 0;boolean isEqual = true;for (int i = 0; i < rightmax.size(); i++) {if (!leftmax.get(i).equals(rightmax.get(i))) {isEqual = false;}//判断是否为 单字if (leftmax.get(i).length() == 1)leftSingle++;if (rightmax.get(i).length() == 1)rightSingle++;}// 如果正向、逆向匹配结果完全相等,返回任意结果if (isEqual) {return leftmax;// 否则,返回单字数少的匹配方式} else if (leftSingle > rightSingle)return rightmax;elsereturn leftmax;}}/*** 载入字典和自定义添加词*/private static Set<String> dictionary;// 初始化字典,采用 hashset 存储public static void getDictionary() {dictionary = new HashSet<String>();String dicpath = "D:/ChineseDic.txt";String line = null;BufferedReader br;try {// 按照 UTF-8 编码读入文件br = new BufferedReader(new InputStreamReader(new FileInputStream(dicpath), "UTF-8"));try {while (((line = br.readLine()) != null)) {// 按照空格切分String[] str = line.split("\\s+");for (int i = 0; i < str.length; i++) {line = str[i];dictionary.add(line);}}br.close();} catch (IOException e) {e.printStackTrace();}} catch (Exception e) {e.printStackTrace();}}// 自定义添加词汇public void addWord(String str) {dictionary.add(str);}
}

在D盘新新建txt文件,ChineseDic.txt,中文词用空格隔开
内容如下:

项目 研究 目的 商品 服务 和服 研究生 结婚 和尚 结婚 尚末 生命 起源 当下 雨天 地面 积水 下雨天 欢迎 老师 生前 就餐 迎新 师生 前来

代码运行效果如下:

正向最大匹配结果:[结婚, 的, 和尚, 未, 结婚, 的]
逆向最大匹配结果:[结婚, 的, 和尚, 未, 结婚, 的]
双向最大匹配结果:[结婚, 的, 和尚, 未, 结婚, 的]
----------------------------------------------------
正向最大匹配结果:[欢迎, 新, 老师, 生前, 来, 就餐]
逆向最大匹配结果:[欢, 迎新, 老, 师生, 前来, 就餐]
双向最大匹配结果:[欢迎, 新, 老师, 生前, 来, 就餐]
----------------------------------------------------
正向最大匹配结果:[项目, 的, 研究, 主, 题, 是, 商品, 和服, 务]
逆向最大匹配结果:[项, 目的, 研究, 主, 题, 是, 商品, 和, 服务]
双向最大匹配结果:[项目, 的, 研究, 主, 题, 是, 商品, 和服, 务]进程已结束,退出代码0

参考:
https://blog.csdn.net/qq_41982466/article/details/100009918

Java---中文词匹配 正向、逆向和双向最大匹配算法相关推荐

  1. 双向最大匹配算法(含完整代码实现,ui界面)正向最大匹配算法,逆向最大匹配算法

    双向最大匹配算法(含完整代码实现,ui界面)正向最大匹配算法,逆向最大匹配算法 一.理论描述 中文分词(Chinese Word Segmentation) 指的是将一个汉字序列切分成一个一个单独的词 ...

  2. 【自然语言处理】正向、逆向、双向最长匹配算法的 切分效果与速度测评

    本文摘要 · 理论来源:[统计自然语言处理]第七章 自动分词:[自然语言处理入门]第二章 词典分词: · 代码目的:手写三种算法:正向最长匹配.逆向最长匹配.双向最长匹配,比较它们的单词切分效果与速度 ...

  3. 词法分析-中文分词技术-正向最大匹配法与逆向最大匹配法

    词法分析-中文分词技术-正向最大匹配法与逆向最大匹配法 Type真是太帅了 于 2018-12-31 13:20:07 发布 1930  收藏 1 分类专栏: 编程 版权 编程 专栏收录该内容 15 ...

  4. java 中文 正则_Java正则匹配中文的方法实例分析

    本文实例讲述了Java正则匹配中文的方法.分享给大家供大家参考,具体如下: 1.匹配双引号间内容: public void test1() { // 匹配双引号间内容 String pstr = &q ...

  5. java使用正则表达式匹配中文字符

    匹配中文正则表达式:[\u4e00-\u9fa5] 工具匹配测试: 多个中文字符匹配: 可以看到上图是只匹配到单个字符,若作多字符匹配可以在表达式后加上"+"或者是"{1 ...

  6. [Leetcode][第32题][JAVA][最长有效括号][动态规划][栈][正向逆向结合]

    [问题描述][困难] 给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度.示例 1:输入: "(()" 输出: 2 解释: 最长有效括号子串为 &qu ...

  7. java加载中文词向量_Chinese Word Vectors:目前最全的中文预训练词向量集合

    对于国内自然语言处理的研究者而言,中文词向量语料库是需求很大的资源.近日,来自北京师范大学和人民大学的研究者开源了「中文词向量语料库」,试图为大家解决这一问题,该库包含经过数十种用各领域语料(百度百科 ...

  8. Java实现简单的违规词匹配功能

    实现一个违规词匹配的功能. 像一些名称检测,弹幕检测,都会有这么一个匹配,输入的内容与违规词库进行匹配,只要匹配出来一个就不允许通过,那具体怎么实现呢. 首先是违规词库的录入,一般开发过程违规词库肯定 ...

  9. java中文分词的简单实现

    java中文分词的简单实现 中文分词 算法 算法思路 算法实现 代码及注释 评价 结语 中文分词 通俗来讲,中文分词是指将一句中文句子中的所有中文词汇相互分隔开来.它是文本挖掘的基础,有着十分广阔的应 ...

最新文章

  1. http和ftp下载的区别
  2. H.264编码系统几个比较重要的算法
  3. 笔记-项目沟通管理-沟通基本原则
  4. 网页附加题写出下图的html,附加题(写HTML文件):根据给定的博客名单,自动生成HTML网页...
  5. centos开放端口以及Telnet测试端口
  6. VLC详细的使用说明以及配置说明综合示范实例精通VLC开发
  7. java重定向post_java实现响应重定向发送post请求操作示例
  8. 学UI设计好不好找工作?零基础能学UI设计吗?
  9. java中implements是什么意思_java中extends与implements区别
  10. 熊猫分发_熊猫下降列和行
  11. AIDL Service
  12. Cisco-NetDevOps-CI/CD-Experiment Workflow
  13. 这个软件真好用,让 iPhone 无线投屏到 Mac 上
  14. HDU 2258 Continuous Same Game
  15. hashmap删除指定key_Java集合:HashMap底层实现和原理(源码解析)
  16. 按键精灵修改计算机名,最新按键精灵脚本代码大全 按键精灵命令运行方法
  17. 设计模式——代理模式详解(Java版)
  18. 最痛苦的时候不能对最亲近的人诉说——痛苦莫过如此——最痛的苦
  19. ios中SQLite3的基本操作
  20. 【数据集显示标注】VOC文件结构+数据集标注可视化+代码实现

热门文章

  1. 2016年02月29日
  2. Content Provider
  3. verilog串口没有C语言灵活,用verilog写的串口转并口程序
  4. javascript/nodejs 中获取当前时间(昨天、今天、明天)
  5. 连接rabbitmq超时问题(自定义、与springboot连用等)
  6. android 如何在系统为三方应用添加drx api 服务(一)
  7. 数据库查询结果ResultSet详解
  8. 用python画函数的梯度图_只需45秒,用Python给故宫画一组雪景手绘图
  9. 毕业5年决定你的一生_5
  10. 撤销还是注销,你分得清吗?