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

一、理论描述
中文分词(Chinese Word Segmentation) 指的是将一个汉字序列切分成一个一个单独的词。分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。

二、算法描述
本文实现双向匹配算法,具体算法描述如下:

正向最大匹配算法描述:

设MaxLen表示最大词长,D为分词词典

(1) 从待切分语料中按正向取长度为MaxLen的字串str,令

Len=MaxLen;

(2) 把str与D中的词从左往右相匹配;

(3) 若匹配成功,则认为该字串为词,指向待切分语料的指

针向前移Len个汉字,返回到(1);

(4) 若不成功:如果Len>1,则将Len减1,从待切分语料中

取长度为Len的字串str,返回到(2)。否则,得到长度为

2的单字词,指向待切分语料的指针向前移1个汉字,

返回(1)。

反向最大匹配**算法描述:

设MaxLen表示最大词长,D为分词词典

(1) 从待切分语料中按正向取长度为MaxLen的字串str,令

Len=MaxLen;

(2) 把str与D中的词从右往左相匹配;

(3) 若匹配成功,则认为该字串为词,指向待切分语料的指

针向后移Len个汉字,返回到(1);

(4) 若不成功:如果Len>1,则将Len减1,从待切分语料中

取长度为Len的字串str,返回到(2)。否则,得到长度为

2的单字词,指向待切分语料的指针向后移1个汉字,

返回(1)。

三、详例描述
正向:
S1=“计算语言学课程是三个课时” ,设定最大词长MaxLen = 5 ,S2= " "

字典中含有三个词:[计算语言学]、[课程]、[课时]

(1)S2="";S1不为空,从S1左边取出候选子串W=“计算语言学”;
(2)查词表,“计算语言学”在词表中,将W加入到S2中,S2=“计算语言学/ ”, 并将W从S1中去掉,此时S1=“课程是三个课时”;
(3)S1不为空,于是从S1左边取出候选子串W=“课程是三个”;
(4)查词表,W不在词表中,将W最右边一个字去掉,得到W=“课程是三”;
(5)查词表,W不在词表中,将W最右边一个字去掉,得到W=“课程是”;
(6)查词表,W不在词表中,将W最右边一个字去掉,得到W=“课程”
(7)查词表,W在词表中,将W加入到S2中,S2=“计算语言学/ 课程/ ”,并 将W从S1中去掉,此时S1=“是三个课时”;

(8)S1不为空,于是从S1左边取出候选子串W=“是三个课时”;
(9)查词表,W不在词表中,将W最右边一个字去掉,得到W=“是三个课”;
(10)查词表,W不在词表中,将W最右边一个字去掉,得到W=“是三个”;
(11)查词表,W不在词表中,将W最右边一个字去掉,得到W=“是三”
(12)查词表,W不在词表中,将W最右边一个字去掉,得到W=“是”,这时 W是单字,将W加入到S2中,S2=“计算语言学/ 课程/ 是/ ”,并将 W从S1中去掉,此时S1=“三个课时”;
(13)S1不为空,从S1左边取出候选子串W=“三个课时”;
(14)查词表,W不在词表中,将W最右边一个字去掉,得到W=“三个课”;
(15)查词表,W不在词表中,将W最右边一个字去掉,得到W=“三个”;
(16)查词表,W不在词表中,将W最右边一个字去掉,得到W=“三”,这时 W是单字,将W加入到S2中,S2=“计算语言学/ 课程/ 是/ 三/ ”,并 将W从S1中去掉,此时S1=“个课时”;

(17)S1不为空,从S1左边取出候选子串W=“个课时”;
(18)查词表,W不在词表中,将W最右边一个字去掉,得到W=“个课”;
(19)查词表,W不在词表中,将W最右边一个字去掉,得到W=“个”, 这时W是单字,将W加入到S2中,S2=“计算语言学/ 课程/ 是/ 三/ 个/ “,并将W从S1中去掉,此时S1=“课时”;
(20)S1不为空,从S1左边取出候选子串W=“课时”;
(21)查词表,W在词表中,将W加入到S2中,S2=“计算语言学/ 课程/ 是/ 三/ 个/ 课时/ “,并将W从S1中去掉,此时S1=””。
(22)S1为空,输出S2作为分词结果,分词过程结束。

逆向:
待分词句子: sentence[]={“计算语言学课程有意思”}

词表: dict[]={“计算”, “计算语言学”, “课程”, “有”, “意思”}

首先我们定义一个最大分割长度5,从右往左开始分割:

(1)首先取出来的候选词W是 “课程有意思”。

(2) 查词表,W不在词表中,将W最左边的第一个字去掉,得到W“程有意思”;

(3) 查词表,W也不在词表中,将W最左边的第一个字去掉,得到W“有意思”;

(4) 查词表,W也不在词表中,将W最左边的第一个字再去掉,得到W“意思”;

(5) 查词表,W在词表中,就将W从整个句子中拆分出来,此时原句子为“计算语言学课程有”

(6)根据分割长度5,截取句子内容,得到候选句W是“言学课程有”;

(7) 查词表,W不在词表中,将W最左边的第一个字去掉,得到W“言学课程有”;

(8) 查词表,W也不在词表中,将W最左边的第一个字去掉,得到W“学课程有”;

(9) 依次类推,直到W为“有”一个词的时候,这时候将W从整个句子中拆分出来,此时句子为“计算语言学课程”

(10)根据分割长度5,截取句子内容,得到候选句W是“算语言学课程”;

(11)查词表,W不在词表中,将W最左边的第一个字去掉,得到W“语言学课程”;

(12) 依次类推,直到W为“课程”的时候,这时候将W从整个句子中拆分出来,此时句子为“计算语言学”

(13)根据分割长度5,截取句子内容,得到候选句W是“计算语言学”;

(14) 查词表,W在词表,分割结束

四、软件演示
正向匹配:

逆向匹配:

正向匹配和逆向匹配的结果是一样的。而多次测试后,时间上总体来说是正向匹配算法比较长。逆向匹配算法时间稍少几毫秒。但也会出现逆向匹配算法时间较长的情况。两者的时间复杂度是一样的。

正向分词匹配代码
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

public class seg {
    
    String result;
    String segstring;
    int MaxLen;
    int Len;
    int indexpos;
    Map <String,String> dict; //<"石柱",n>
    
    public seg(String inputstr, int maxlen)
    {
        segstring=inputstr;
        MaxLen=maxlen;
        Len=MaxLen;
        indexpos=0;
        result="";
        dict=new HashMap<String,String>();
        
    }
    
    public void ReadDic() throws FileNotFoundException, IOException
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("chineseDic.txt"),"GBK"));
        String line = null; 
        while((line = br.readLine())!=null)
        {
            String[] words=line.trim().split(",");//"石柱",n,  words=["石柱","n"]
            String word=words[0];
            String cx=words[1]; 
            dict.put(word, cx);
        } 
        br.close();
    }
    
    public String MM_Seg() throws IOException
    {//正向最大匹配算法
        ReadDic();//读入字典
        segstring=segstring.replaceAll(" ", "");
        MM(segstring,MaxLen,0);//正向最大分词 
        return result;
    }
    
    public void MM(String str,int len,int frompos)
    {
        if(frompos+1>str.length())
            return;
        String curstr="";

int llen=str.length()-(frompos);
        if(llen<=len)
            curstr=str.substring(frompos,frompos+llen);
        else
            curstr=str.substring(frompos,frompos+len);
            
        if(dict.containsKey(curstr))
        {
            result=result+curstr+"/ ";
            Len=MaxLen;
            indexpos=frompos+len;
            MM(str,Len,indexpos);
        }
        else
        {
            if(Len>1)
            {
                Len=Len-1;
                MM(str,Len,frompos);
            }
            else
            {
                result=result+str+"/ ";
                frompos=frompos+1;
                Len=MaxLen;
                MM(str,Len,frompos);
            }
        }
    }
    
    
    public String getResult()
    {
        return result;
    }
            
    public static void main(String[] args) throws IOException, Exception
    {
        seg s=new seg("一把青菜勤奋勤政勤勤俭节约奇鸟怪物节",3);
        String result=s.MM_Seg();
        System.out.println(result);
        
    }
            
    
}

逆向
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

/**
 *
 * @author shelly
 */
public class RMM {

String result;
    String segstring;
    int MaxLen;
    int Len;
    int indexpos;
    Map <String,String> dict; //<"石柱",n>

public RMM(String inputstr, int maxlen)
    {
        segstring=inputstr;
        MaxLen=maxlen;
        Len=MaxLen;
        indexpos=0;
        result="";
        dict=new HashMap<String,String>();

}

public void ReadDic() throws FileNotFoundException, IOException
    {
        BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("chineseDic.txt"),"GBK"));
        String line = null;
        while((line = br.readLine())!=null)
        {
            String[] words=line.trim().split(",");//"石柱",n,  words=["石柱","n"]
            String word=words[0];
            String cx=words[1];
            dict.put(word, cx);
        }
        br.close();
    }

public String RMM_Seg() throws IOException
    {//反向最大匹配算法
        ReadDic();//读入字典
//        segstring=segstring.trim();
        segstring=segstring.replaceAll(" ", "");
        MM(segstring,MaxLen,segstring.length()-1);//反向最大分词
        return result;
    }

public void MM(String str,int len,int frompos)
    {
        if(frompos<0)
            return;
        String curstr="";

int llen=frompos+1-len;
        if(llen>=0)
            curstr=str.substring(frompos-len+1,frompos+1);
        else
            curstr=str.substring(0,frompos+1);

if(dict.containsKey(curstr))
        {
            result=curstr+"/ "+result;
            Len=MaxLen;
            indexpos=frompos-len;
            MM(str,Len,indexpos);
        }
        else
        {
            if(Len>1)
            {
                Len=Len-1;
                MM(str,Len,frompos);
            }
            else
            {
                result=result+str+"/ ";
                frompos=frompos-1;
                Len=MaxLen;
                MM(str,Len,frompos);
            }
        }
    }

public String getResult()
    {
        return result;
    }

public static void main(String[] args) throws IOException, Exception
    {
        RMM rm=new RMM("一你是的             是打多        分艾菲奥德赛",3);
        String result=rm.RMM_Seg();
        System.out.println(result);

}

}

UI界面代码

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

import java.io.IOException;

public class ui extends Application {

private Button zheng=new Button("正向匹配");
    private Button ni=new Button("逆向匹配");
    private TextField time = new TextField();
    private TextField time1 = new TextField();
    private TextArea tffen = new TextArea();
    private TextArea tfconsult = new TextArea();
    private TextArea tfconsultni = new TextArea();
    public static void main(String[] args) {
        launch(args);
    }

@Override
    public void start(Stage primaryStage) {
        tffen.setWrapText(true);
        tfconsult.setWrapText(true);
        tfconsultni.setWrapText(true);
        BorderPane mainpane = new BorderPane();
        HBox hBox = new HBox();
        hBox.setSpacing(30);
        hBox.setAlignment(Pos.CENTER);
        hBox.getChildren().addAll(zheng,time);
        HBox hBox1 = new HBox();
        hBox1.setSpacing(30);
        hBox1.setAlignment(Pos.CENTER);
        hBox1.getChildren().addAll(ni,time1);
        VBox vBox = new VBox();
        vBox.setSpacing(5);
        vBox.setPadding(new Insets(10,20,10,20));
        vBox.getChildren().addAll(tffen,hBox,tfconsult,hBox1,tfconsultni);
        mainpane.setCenter(vBox);
        Scene scene = new Scene(mainpane,500,500);
        primaryStage.setScene(scene);
        primaryStage.show();

zheng.setOnAction(event -> {
            tfconsult.clear();
            time.clear();
            String msg = tffen.getText();
            seg se = new seg(msg,4);
            try {
                long startTime = System.currentTimeMillis();
                String re = se.MM_Seg();
                long endTime = System.currentTimeMillis();
                time.appendText(String.valueOf(endTime-startTime)+"ms");
                tfconsult.appendText(re);
            } catch (IOException e) {
                e.printStackTrace();
            }

});
        ni.setOnAction(event -> {
            tfconsultni.clear();
            time1.clear();
            String msg = tffen.getText();
            RMM rm = new RMM(msg,4);
            try {
                long startTime = System.currentTimeMillis();
                String re = rm.RMM_Seg();
                long endTime = System.currentTimeMillis();
                time1.appendText(String.valueOf(endTime-startTime)+"ms");
                tfconsultni.appendText(re);
            } catch (IOException e) {
                e.printStackTrace();
            }

});
    }
}

双向最大匹配算法(含完整代码实现,ui界面)正向最大匹配算法,逆向最大匹配算法相关推荐

  1. 校运动会c语言程序编写,校运动会管理系统报告C语言(含完整代码)

    <校运动会管理系统报告C语言(含完整代码)>由会员分享,可在线阅读,更多相关<校运动会管理系统报告C语言(含完整代码)(20页珍藏版)>请在人人文库网上搜索. 1.目 录陈一. ...

  2. 机器学习图像分割——模型评价总结(含完整代码)

    机器学习&图像分割--模型评价总结(含完整代码) 模型评价的方法指标有很多,如:PR-curve,MAE,ROC,Precision,Recall,AUC,AP,mAP,DSI,VOE,RVD ...

  3. Python批量处理大量excel数据(含完整代码)

    Python批量处理excel数据(含完整代码) pandas库可以有效的处理excel.csv和txt文件,并能多格式将数据重新保存为excel.csv和txt文件. 一.导入数据 利用pandas ...

  4. 【动手教你学故障诊断:Python实现Tensorflow+CNN深度学习的轴承故障诊断(西储大学数据集)(含完整代码)】

    项目名称 动手教你学故障诊断:Python实现基于Tensorflow+CNN深度学习的轴承故障诊断(西储大学数据集)(含完整代码) 项目介绍 该项目使用tensorflow和keras搭建深度学习C ...

  5. Java代码控制UI界面

    介绍 在 Android 中,支持像 Java Swing 那样完全通过代码控制 UI 界面.也就是所有的 UI 组件都通过 new 关键字创建出来,然后将这些 UI 组件添加到布局管理器中,从而实现 ...

  6. GEE 遥感特征指数谐波分析 以Sentinel-2 NDVI为例(含完整代码链接)

    谐波分析(Harmonic Regression)是常用的云缺失填补方法, 它是一种频域时序列分析,从原始时间序列数据的正弦和余弦函数重构周期/季节性波.对遥感特征指数使用谐波分析,有利于反映特征的周 ...

  7. 【从零开始学习深度学习】25.卷积神经网络之LeNet模型介绍及其Pytorch实现【含完整代码】

    目录 1. LeNet模型介绍与实现 2. 输入为Fashion-MNIST时各层输出形状 3. 获取Fashion-MNIST数据和并使用LeNet模型进行训练 4.完整代码 之前我们对Fashio ...

  8. Java实现单机五子棋,含完整代码

    文章目录 五子棋!! 实现功能 改进方向 主体思路 遇到的困难 完整代码 五子棋!! 实现功能 基本的棋盘绘制,重绘,输赢判断,悔棋,重新开始 改进方向 添加背景音乐,背景图片美化,用棋子图片代替原棋 ...

  9. 分词算法----正向和逆向最大匹配算法(含Python代码实现)

    文章目录 分词算法(Segmentation Method) 最大匹配算法(Maximum Matching) 需要的前提 正向最大匹配算法(Forwards Maximum Match,FMM) 逆 ...

最新文章

  1. XML读取 java
  2. c++后台管理系统_【获奖案例】第三届全国医院物联网大会“中国医院物联网应用十大优秀案例”安徽医科大学第一附属医院手术室行为管理系统...
  3. WeakReference类详解
  4. LOW_VALUE、HIGH_VALUE、ENDPOINT_VALUE转换--UTL_RAW、DBMS_STATS.CONVERT_RAW_VALUE
  5. react-native Navigator 填坑
  6. 3.Prometheus 监控技术与实践 --- Exporter
  7. 熊猫可用人脸识别?大熊猫迎来熊生高光时刻,以后终于可以认清我了
  8. 适合写api接口文档的管理工具有哪些?
  9. 架构-大数据架构-阿里
  10. 集合竞价如何买入_教你几招!什么是集合竞价?散户如何参与集合竞价?
  11. Method类及其用法
  12. Seventh season eighteenth episode,Joey got an award??????
  13. 雷克萨斯品牌舆情监测-危机后,如何重新赢得消费者的认可?
  14. Google镜像代理地址:
  15. 卡在了杨继文的T10-1上
  16. 中国物料喷射(MJ)市场趋势报告、技术动态创新及市场预测
  17. 产品读书《怪诞行为学》
  18. 客制化 GH60 XD60 像 Poker 一样的 60% 机械键盘 (2) 采购以及组装
  19. 小猪佩奇用计算机怎么弹,小猪佩奇第一季学习笔记计算机软件及应用IT计算机专业资料-小猪.pdf...
  20. ubuntu18.0404 aws 云服务器启动和登陆 windows 虚拟机

热门文章

  1. linux x64 asm 参数传递,NASM汇编学习系列(1)——系统调用和参数传递
  2. python归并排序 分词_python-归并排序
  3. 计算机乐谱弱点,缺点简谱郑源
  4. 联想android手机驱动,驱动天空 - 手机驱动 - 联想手机 lenovo
  5. 4j是合法python数字类型_python数字类型
  6. python读excel字体颜色_python 设置 excel 单元格颜色填充和字体效果
  7. linux系统下pid的取值范围了解一下
  8. 一道关于信号量的问题
  9. tf.trainable_variables() and tf.all_variables()
  10. css3 奇技淫巧 - 如何给小汽车换个背景色谈起