基于Java实现的中文分词系统

article/2025/10/15 22:02:27

资源下载地址:https://download.csdn.net/download/sheziqiong/85941192
资源下载地址:https://download.csdn.net/download/sheziqiong/85941192
目录

1.问题描述

2.相关工作

3.系统框架和算法设计

3.1系统整体框架

3.2基于HMM模型分词算法设计

3.2.1构建HMM模型(HMM的学习问题)

3.2.2viterbe算法(HMM的解码问题)

3.3正向最大匹配分词算法设计

3.4逆向最大匹配分词算法设计

4.任务分工

5.系统运行步骤

5.1基于HMM模型

5.1.1训练集训练

5.1.2文件输入测试

5.1.3直接输入测试

5.2正向最大匹配

5.2.1文件输入测试

5.2.2直接输入测试

5.3逆向最大匹配

5.3.1文件输入测试

5.3.2直接输入测试

6.实验和分析

6.1基于HMM模型

6.1.1文件输入测试结果

6.1.2直接输入测试结果

6.1.3结果集评估

6.2正向最大匹配

6.2.1文件输入测试结果

6.2.2直接输入测试结果

6.3逆向最大匹配

6.3.1文件输入测试结果

6.2.2直接输入测试结果

7.总结

1.问题描述

中文分词 (Chinese Word Segmentation) 指的是将一个汉字序列切分成一个一个单独的词。分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。我们知道,在英文的行文中,单词之间是以空格作为自然分界符的,而中文只是字、句和段能通过明显的分界符来简单划界,唯独词没有一个形式上的分界符,虽然英文也同样存在短语的划分问题,不过在词这一层上,中文比之英文要复杂的多、困难的多。

而对于中文分词也有很多种算法,基本算法主要分为基于词典的方法、基于统计的方法和基于规则的方法。

基于词典的方法是指按照一定策略将待分析的汉字串与一个“大机器词典”中的词条进行匹配,若在词典中找到某个字符串,则匹配成功。按照扫描方向的不同包括正向匹配和逆向匹配,按照长度的不同分为最大匹配和最小匹配。在基于词典的方法中,我们采用了正向最大匹配和逆向最大匹配的方法进行分词。

而基于统计的分词方法,没有词典,主要思想是在上下文中,相邻的字同时出现的次数越多,就越可能构成一个词,因此字与字相邻出现的概率或频率能较好的反映词的可信度。主要的统计模型包括N元文法模型(N-gram),隐马尔科夫模型(Hidden Markov Model, HMM)。在基于统计的分词方法中,我们使用了隐马尔科夫模型来进行分词。

基于规则的方法,主要思想就是通过模拟人对句子的理解,达到识别词的效果,基本思想是语义分析,句法分析,利用句法信息和语义信息对文本进行分词。自动推理,并完成对未登录词的补充是其优点。但是这种方法现在发展还不成熟,需要继续发展和研究。

因此在我们的中文分词系统中,采用了基于词典的方法:正向最大匹配和逆向最大匹配,以及基于统计的方法中的隐马尔科夫(HMM)模型。

2.相关工作

现如今已经有很多的开源中分分词系统,而且效果都还不错。下面介绍几种比较常见的中文分词项目。

SCWS,Hightman开发的一套基于词频词典的机械中文分词引擎,它能将一整段的汉字基本正确的切分成词。采用的是采集的词频词典,并辅以一定的专有名称,人名,地名,数字年代等规则识别来达到基本分词,经小范围测试大概准确率在 90% ~ 95% 之间,已能基本满足一些小型搜索引擎、关键字提取等场合运用。45Kb左右的文本切词时间是0.026秒,大概是1.5MB文本/秒,支持PHP4和PHP 5。

ICTCLAS,这是最早的中文开源分词项目之一,ICTCLAS在国内973专家组组织的评测中活动获得了第一名,在第一届国际中文处理研究机构SigHan组织的评测中都获得了多项第一名。ICTCLAS3.0分词速度单机996KB/s,分词精度98.45%,API不超过200KB,各种词典数据压缩后不到3M。ICTCLAS全部采用C/C++编写,支持Linux、FreeBSD及Windows系列操作系统,支持C/C++、C#、Delphi、Java等主流的开发语言。

HTTPCWS,是一款基于HTTP协议的开源中文分词系统,目前仅支持Linux系统。HTTPCWS 使用“ICTCLAS 3.0 2009共享版中文分词算法”的API进行分词处理,得出分词结果。HTTPCWS 将取代之前的 PHPCWS 中文分词扩展。

3.系统框架和算法设计

3.1系统整体框架

系统主要包括选择分词算法和进行数据的测试。首先需要选择进行分词的算法,包括基于HMM模型的分词算法,正向最大匹配分词算法和逆向最大匹配分词算法。选择了分词算法之后即可进行分词操作。

若选择的是基于HMM模型的分词算法,需要先进行训练集的训练,得到训练的统计数据,然后再进行数据测试。数据测试包括了文件输入测试,进行大规模数据的测试,也包括了直接输入测试,测试一句话或多句话进行简单测试。

对于正向最大匹配和逆向最大匹配则不需要进行训练集的训练,因为其是基于词典的方法,需要词典,而词典我们已经事先载入程序中了。正向最大匹配和逆向最大匹配也包括了文件输入测试和直接输入测试。

系统的整体框架如图3-1所示。

在这里插入图片描述
部分代码如下:

package mainframe;
import hmm.hmmmain.hmmmain;import java.awt.Font;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.StringTokenizer;
import java.util.Timer;
import java.util.TimerTask;import javax.swing.ButtonGroup;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.EtchedBorder;
import javax.swing.border.TitledBorder;import lexicon.Segment;@SuppressWarnings("serial")
public class CWS_frame extends JFrame{//定义组件JLabel label_title=new JLabel("CWJT中文分词系统");JPanel algorithm_select_panel;JRadioButton algorithm_jrb_hmm;JRadioButton algorithm_jrb_zhengxiang;JRadioButton algorithm_jrb_nixiang;ButtonGroup bg_algorithm;JLabel label_showalgorithm=new JLabel("你选择的算法是: 基于HMM模型");JPanel input_panel;JTabbedPane hmm_tabbe=new JTabbedPane();JPanel hmm_tabbe_pane_train=new JPanel();JPanel hmm_tabbe_pane_fileinput=new JPanel();JPanel hmm_tabbe_pane_input=new JPanel();JLabel label_train_title = new JLabel("选择训练集");static JTextField jTextField_train=new JTextField();JButton scan_train=new JButton("浏览文件");JButton train_start=new JButton("点击训练");JLabel label_test_title = new JLabel("选择测试集");JLabel label_result_title = new JLabel("结果集存储目录");JButton scan_test=new JButton("浏览文件");JButton scan_result=new JButton("浏览目录");JButton test_start = new JButton("开始分词");static JTextField jTextField_test=new JTextField();static JTextField jTextField_result=new JTextField();JLabel label_inputdata = new JLabel("输入测试数据:");JTextArea textarea_input = new JTextArea();JLabel label_outputdata = new JLabel("输出结果:");JTextArea textarea_ouptput = new JTextArea();JButton seg_start = new JButton("开始分词");static JLabel label_wait ;JLabel label_train_wait;//定义一个定时器Timer wait_time = null, seg_threadtime=null;static int count_dot=0;Timer train_wait_time=null,train_time=null;int train_count_dot = 0;//设置滚动条用于装短信内容文本域,使其产生滚动条效果JScrollPane scrollPane;JScrollPane outscrollPane;static JPanel main_panel; //构造函数public CWS_frame(){setTitle("中文分词系统");setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setResizable(false);int width=550;int height=500;setSize(width,height);//设置窗体在屏幕出现的位置setLocation(400, 100);//设置titleint label_title_x=200;int label_title_y=25;int label_title_width=250;int label_title_height=30;int label_train_x=60;int label_train_y=50;int label_train_width=80;int label_train_height=25;int label_test_x=50;int label_test_y=40;int label_test_width=100;int label_test_height=25;int label_result_x=50;int label_result_y=70;int label_result_width=100;int label_result_height=25;int JTextField_train_x=140;int JTextField_train_y=50;int JTextField_train_width=150;int JTextField_train_height=25;int JTextField_test_x=150;int JTextField_test_y=40;int JTextField_test_width=150;int JTextField_test_height=25;int JTextField_result_x=150;int JTextField_result_y=70;int JTextField_result_width=150;int JTextField_result_height=25;int alg_select_x=40;int alg_select_y=60;int alg_select_width=450;int alg_select_height=80;int label_showalg_x=180;int label_showalg_y=140;int label_showalg_width=200;int label_showalg_height=20;int input_x=40;int input_y=170;int input_width=450;int input_height=250; int scan_train_x=300;int scan_train_y=50;int scan_train_width=80;int scan_train_height=23;int train_start_x=180;int train_start_y=110;int train_start_width=90;int train_start_height=25;int test_start_x=180;int test_start_y=130;int test_start_width=90;int test_start_height=25;int scan_test_x=310;int scan_test_y=40;int scan_test_width=80;int scan_test_height=23;int scan_result_x=310;int scan_result_y=70;int scan_result_width=80;int scan_result_height=23;int label_inputdata_x=20;int label_inputdata_y=10;int label_inputdata_width=100;int label_inputdata_height=20;int textarea_input_x=20;int textarea_input_y=30;int textarea_input_width=180;int textarea_input_height=120;int label_outputdata_x=230;int label_outputdata_y=10;int label_outputdata_width=100;int label_outputdata_height=20;int textarea_output_x=230;int textarea_output_y=30;int textarea_output_width=180;int textarea_output_height=120;int seg_start_x=180;int seg_start_y=160;int seg_start_width=90;int seg_start_height=25;int label_wait_x=170;int label_wait_y=160;int label_wait_width=120;int label_wait_height=25;int label_train_wait_x=170;int label_train_wait_y=150;int label_train_wait_width=120;int label_train_wait_height=25;main_panel=new JPanel();//main_panel.setLayout(new FlowLayout(FlowLayout.CENTER,10,10));main_panel.setLayout(null);algorithm_select_panel=new JPanel();algorithm_select_panel.setBorder(new TitledBorder(new EtchedBorder(), "选择分词算法"));bg_algorithm=new ButtonGroup();algorithm_jrb_hmm=new JRadioButton("基于HMM模型");algorithm_jrb_zhengxiang=new JRadioButton("正向最大匹配");algorithm_jrb_nixiang=new JRadioButton("逆向最大匹配");algorithm_jrb_hmm.setSelected(true);bg_algorithm.add(algorithm_jrb_hmm);bg_algorithm.add(algorithm_jrb_zhengxiang);bg_algorithm.add(algorithm_jrb_nixiang);input_panel=new JPanel();//input_panel.setLayout(null);input_panel.setLayout(new GridLayout(1, 1));input_panel.setBorder(new TitledBorder(new EtchedBorder(), "输入数据"));scrollPane=new JScrollPane(textarea_input);outscrollPane=new JScrollPane(textarea_ouptput);textarea_ouptput.setEnabled(false);hmm_tabbe_pane_train.setLayout(null);hmm_tabbe_pane_fileinput.setLayout(null);hmm_tabbe_pane_input.setLayout(null);hmm_tabbe.addTab("使用训练集训练", hmm_tabbe_pane_train);hmm_tabbe.addTab("文件输入测试集", hmm_tabbe_pane_fileinput);hmm_tabbe.addTab("直接输入测试数据", hmm_tabbe_pane_input);//hmm_tabbe.setTabPlacement(LEFT_ALIGNMENT);label_title.setFont(new Font("",Font.BOLD,15));label_wait = new JLabel("");label_train_wait=new JLabel("");//定位label_title.setBounds(label_title_x, label_title_y, label_title_width, label_title_height);algorithm_select_panel.setBounds(alg_select_x, alg_select_y, alg_select_width, alg_select_height);		label_showalgorithm.setBounds(label_showalg_x, label_showalg_y, label_showalg_width, label_showalg_height);input_panel.setBounds(input_x, input_y, input_width, input_height);//algorithm_jrb_hmm.setLocation(alg_hmm_x, alg_hmm_y);//	algorithm_jrb_hmm.setBounds(alg_hmm_x, alg_hmm_y, alg_hmm_width, alg_hmm_height);//	algorithm_jrb_zhengxiang.setBounds(alg_zhengxiang_x, alg_zhengxiang_y, alg_zhengxiang_width, alg_zhengxiang_height);label_train_title.setBounds(label_train_x, label_train_y, label_train_width, label_train_height);label_test_title.setBounds(label_test_x, label_test_y, label_test_width, label_test_height);label_result_title.setBounds(label_result_x, label_result_y, label_result_width, label_result_height);jTextField_train.setBounds(JTextField_train_x, JTextField_train_y, JTextField_train_width, JTextField_train_height);jTextField_test.setBounds(JTextField_test_x, JTextField_test_y, JTextField_test_width, JTextField_test_height);jTextField_result.setBounds(JTextField_result_x, JTextField_result_y, JTextField_result_width, JTextField_result_height);scan_train.setBounds(scan_train_x, scan_train_y, scan_train_width, scan_train_height);train_start.setBounds(train_start_x, train_start_y, train_start_width, train_start_height);scan_result.setBounds(scan_result_x, scan_result_y, scan_result_width, scan_result_height);scan_test.setBounds(scan_test_x, scan_test_y, scan_test_width, scan_test_height);test_start.setBounds(test_start_x, test_start_y, test_start_width, test_start_height);label_inputdata.setBounds(label_inputdata_x, label_inputdata_y, label_inputdata_width, label_inputdata_height);scrollPane.setBounds(textarea_input_x, textarea_input_y, textarea_input_width, textarea_input_height);label_outputdata.setBounds(label_outputdata_x, label_outputdata_y, label_outputdata_width, label_outputdata_height);outscrollPane.setBounds(textarea_output_x, textarea_output_y, textarea_output_width, textarea_output_height);seg_start.setBounds(seg_start_x, seg_start_y, seg_start_width, seg_start_height);label_wait.setBounds(label_wait_x, label_wait_y, label_wait_width, label_wait_height);label_train_wait.setBounds(label_train_wait_x, label_train_wait_y, label_train_wait_width, label_train_wait_height);//将组件加入到容器中main_panel.add(label_title);main_panel.add(algorithm_select_panel);main_panel.add(input_panel);algorithm_select_panel.add(algorithm_jrb_hmm);algorithm_select_panel.add(algorithm_jrb_zhengxiang);algorithm_select_panel.add(algorithm_jrb_nixiang);input_panel.add(hmm_tabbe);hmm_tabbe_pane_train.add(label_train_title);hmm_tabbe_pane_train.add(jTextField_train);hmm_tabbe_pane_train.add(scan_train);hmm_tabbe_pane_train.add(train_start);hmm_tabbe_pane_train.add(label_train_wait);hmm_tabbe_pane_fileinput.add(label_test_title);hmm_tabbe_pane_fileinput.add(label_result_title);hmm_tabbe_pane_fileinput.add(test_start);hmm_tabbe_pane_fileinput.add(scan_test);hmm_tabbe_pane_fileinput.add(scan_result);hmm_tabbe_pane_fileinput.add(jTextField_test);hmm_tabbe_pane_fileinput.add(jTextField_result);hmm_tabbe_pane_fileinput.add(label_wait);hmm_tabbe_pane_input.add(label_inputdata);hmm_tabbe_pane_input.add(scrollPane);hmm_tabbe_pane_input.add(label_outputdata);hmm_tabbe_pane_input.add(outscrollPane);hmm_tabbe_pane_input.add(seg_start);main_panel.add(label_showalgorithm);//将容器加入到窗体中add(main_panel);/*	wait_time = new Timer(500,new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubif(count_dot==0)label_wait.setText("正在分词,请稍等");else if(count_dot==1)label_wait.setText("正在分词,请稍等.");else if(count_dot==2)label_wait.setText("正在分词,请稍等. .");else if(count_dot==3)label_wait.setText("正在分词,请稍等. . .");JOptionPane.showMessageDialog(null,"test","提示",JOptionPane.INFORMATION_MESSAGE);//count_dot=(count_dot+1)%4;//	System.out.println(count_dot);}});*/algorithm_jrb_hmm.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubif(algorithm_jrb_hmm.isSelected()){label_showalgorithm.setText("你选择的算法是: 基于HMM模型");hmm_tabbe.removeAll();hmm_tabbe.addTab("使用训练集训练", hmm_tabbe_pane_train);hmm_tabbe.addTab("文件输入测试集", hmm_tabbe_pane_fileinput);hmm_tabbe.addTab("直接输入测试数据", hmm_tabbe_pane_input);hmm_tabbe.revalidate(); hmm_tabbe.repaint();}if(algorithm_jrb_zhengxiang.isSelected()){label_showalgorithm.setText("你选择的算法是: 正向最大匹配");}if(algorithm_jrb_nixiang.isSelected()){label_showalgorithm.setText("你选择的算法是: 逆向最大匹配");} }});algorithm_jrb_zhengxiang.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubif(algorithm_jrb_hmm.isSelected()){label_showalgorithm.setText("你选择的算法是: 基于HMM模型");}if(algorithm_jrb_zhengxiang.isSelected()){label_showalgorithm.setText("你选择的算法是: 正向最大匹配");hmm_tabbe.removeAll();//hmm_tabbe.addTab("使用训练集训练", hmm_tabbe_pane_train);hmm_tabbe.addTab("文件输入测试集", hmm_tabbe_pane_fileinput);hmm_tabbe.addTab("直接输入测试数据", hmm_tabbe_pane_input);hmm_tabbe.revalidate(); hmm_tabbe.repaint();}if(algorithm_jrb_nixiang.isSelected()){label_showalgorithm.setText("你选择的算法是: 逆向最大匹配");}}});algorithm_jrb_nixiang.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubif(algorithm_jrb_hmm.isSelected()){label_showalgorithm.setText("你选择的算法是: 基于HMM模型");}if(algorithm_jrb_zhengxiang.isSelected()){label_showalgorithm.setText("你选择的算法是: 正向最大匹配");}if(algorithm_jrb_nixiang.isSelected()){label_showalgorithm.setText("你选择的算法是: 逆向最大匹配");hmm_tabbe.removeAll();//hmm_tabbe.addTab("使用训练集训练", hmm_tabbe_pane_train);hmm_tabbe.addTab("文件输入测试集", hmm_tabbe_pane_fileinput);hmm_tabbe.addTab("直接输入测试数据", hmm_tabbe_pane_input);hmm_tabbe.revalidate(); hmm_tabbe.repaint();}}});//输入hmm模型的训练集文件进行训练scan_train.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubFile dicFile = openFile();if(dicFile == null)return;jTextField_train.setText(dicFile.getAbsolutePath());//写要执行的操作//loadDic(dicFile);return;}});//输入测试集文件scan_test.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubFile dicFile = openFile();if(dicFile == null)return;jTextField_test.setText(dicFile.getAbsolutePath());}});//输入存储结果集目录scan_result.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubFile dicDir = openDir();if(dicDir == null)return;jTextField_result.setText(dicDir.getAbsolutePath());}});//点击通过选择输入文件进行分词的按钮,通过载入测试集文件进行大规模数据的分词test_start.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubString temp_test_str = jTextField_test.getText();if(temp_test_str.equals("")){JOptionPane.showMessageDialog(null,"请选择测试集文件!","提示",JOptionPane.INFORMATION_MESSAGE);return ;}String temp_result_str = jTextField_result.getText();if(temp_result_str.equals("")){JOptionPane.showMessageDialog(null,"请选择存储结果集目录!","提示",JOptionPane.INFORMATION_MESSAGE);return ;}count_dot = 0;//有两种定义定时器的方法,分别在不同的java包内//定义等待提示的定时器wait_time=new Timer(true);TimerTask task=new TimerTask() {@Overridepublic void run() {// TODO Auto-generated method stublabel_wait.setText(wait_seg());//	 System.out.println(wait_seg());  }};wait_time.schedule(task, 0, 1000);//再定义个定时器,相当于再开一个线程seg_threadtime = new Timer(true);TimerTask task2 = new TimerTask() {@Overridepublic void run() {// TODO Auto-generated method stub//进行分词Segmentation();}};seg_threadtime.schedule(task2, 0);}});//通过直接输入数据进行分词seg_start.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubString jtextarea_str = textarea_input.getText();if(jtextarea_str.equals("")){JOptionPane.showMessageDialog(null,"请输入要测试的数据!","提示",JOptionPane.INFORMATION_MESSAGE);return ;}if(algorithm_jrb_zhengxiang.isSelected()||algorithm_jrb_nixiang.isSelected()){//token,没有指定分隔符默认情况下是空格换行等StringTokenizer tokens = new StringTokenizer(jtextarea_str);//创建分词类的对象Segment seg=new Segment();String output_str="";while(tokens.hasMoreElements()){//System.out.println(tokens.nextToken());String temp_str=tokens.nextToken();String temp_seg="";//如果选中的是最大正向匹配if(algorithm_jrb_zhengxiang.isSelected()){temp_seg=seg.forwardSegment(temp_str);}//如果选中的是最大逆向匹配if(algorithm_jrb_nixiang.isSelected()){temp_seg=seg.backwardSegment(temp_str);}output_str += temp_seg;output_str += "\n";}textarea_ouptput.setText(output_str);}//使用hmm模型进行分词if(algorithm_jrb_hmm.isSelected()){//	String jtextarea_str = textarea_input.getText();//System.out.println(testfile);String output="";hmmmain hmmmodel = new hmmmain();output = hmmmodel.Inputtest(jtextarea_str);textarea_ouptput.setText(output);}}});//hmm模型训练train_start.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubString temp_train_str = jTextField_train.getText();if(temp_train_str.equals("")){JOptionPane.showMessageDialog(null,"请选择训练集文件!","提示",JOptionPane.INFORMATION_MESSAGE);return ;}train_count_dot = 0;//定义等待提示的定时器train_wait_time=new Timer(true);TimerTask task=new TimerTask() {@Overridepublic void run() {// TODO Auto-generated method stublabel_train_wait.setText(train_wait());//	 System.out.println(wait_seg());  }};train_wait_time.schedule(task, 0, 500);//再定义个定时器,相当于再开一个线程train_time = new Timer(true);TimerTask task2 = new TimerTask() {@Overridepublic void run() {// TODO Auto-generated method stub//进行训练hmmmain hmmmodel = new hmmmain();String train_str = jTextField_train.getText();hmmmodel.Trainset(train_str);JOptionPane.showMessageDialog(null,"训练结束,可进行分词","提示",JOptionPane.INFORMATION_MESSAGE);label_train_wait.setText("");train_wait_time.cancel();}};train_time.schedule(task2, 0);return ;}});}//同步public static synchronized String wait_seg(){  String show_wait = "";if(count_dot==0)show_wait = "正在分词,请稍等";//		label_wait.setText("正在分词,请稍等");else if(count_dot==1)show_wait = "正在分词,请稍等.";//	label_wait.setText("正在分词,请稍等.");else if(count_dot==2)show_wait = "正在分词,请稍等. .";//	label_wait.setText("正在分词,请稍等. .");else if(count_dot==3)show_wait = "正在分词,请稍等. . .";//	label_wait.setText("正在分词,请稍等. . .");count_dot = (count_dot+1)%4;//  System.out.println(count_dot);  return show_wait;//repaint();//revalidate();//	JOptionPane.showMessageDialog(null,//          "test","提示",//           JOptionPane.INFORMATION_MESSAGE);}public synchronized String train_wait(){String show_wait = "";if(train_count_dot==0)show_wait = "正在训练,请稍等";else if(train_count_dot==1)show_wait = "正在训练,请稍等.";else if(train_count_dot==2)show_wait = "正在训练,请稍等. .";else if(train_count_dot==3)show_wait = "正在训练,请稍等. . .";train_count_dot = (train_count_dot+1)%4;return show_wait;}//通过输入测试集文件进行大规模数据的分词private void Segmentation(){if(algorithm_jrb_zhengxiang.isSelected()||algorithm_jrb_nixiang.isSelected()){//创建分词类的对象Segment seg=new Segment();InputStreamReader inputdata;BufferedReader in;String str;String testfile=jTextField_test.getText();System.out.println(testfile);String resultdir=jTextField_result.getText();try {inputdata = new InputStreamReader (new FileInputStream(testfile),"UTF-8");in = new BufferedReader(inputdata);FileOutputStream out = null;resultdir += "\\CWS_truth_utf8";out = new FileOutputStream(new File(resultdir));  while((str=in.readLine())!= null){String temp_seg="";if(algorithm_jrb_zhengxiang.isSelected()){temp_seg=seg.forwardSegment(str);}if(algorithm_jrb_nixiang.isSelected()){temp_seg=seg.backwardSegment(str);}out.write(temp_seg.getBytes("UTF-8"));   out.write("\r\n".getBytes("UTF-8"));}//关闭定时器//	wait_time.stop();inputdata.close();out.close();JOptionPane.showMessageDialog(null,"分词结束,请在"+resultdir+"查找","提示",JOptionPane.INFORMATION_MESSAGE);} catch (UnsupportedEncodingException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (FileNotFoundException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}}//使用hmm模型进行分词if(algorithm_jrb_hmm.isSelected()){String testfile=jTextField_test.getText();//System.out.println(testfile);String resultdir=jTextField_result.getText();resultdir += "\\CWS_truth_utf8";hmmmain hmmmodel = new hmmmain();hmmmodel.Testset(testfile, resultdir);JOptionPane.showMessageDialog(null,"分词结束,请在"+resultdir+"查找","提示",JOptionPane.INFORMATION_MESSAGE);}//label_wait.setText("");wait_time.cancel();}//打开文件(数据、词典或者语料库)private File openFile(){JFileChooser chooser = new JFileChooser();//文件选择对话框int ret = chooser.showOpenDialog(this);if (ret != JFileChooser.APPROVE_OPTION) {return null;}File f = chooser.getSelectedFile();if (f.isFile() && f.canRead()) {return f;} else {JOptionPane.showMessageDialog(this,"Could not open file: " + f,"Error opening file",JOptionPane.ERROR_MESSAGE);return null;}}//打开目录private File openDir(){JFileChooser parseDir = new JFileChooser();parseDir.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);int ret = parseDir.showOpenDialog(this);if(ret !=JFileChooser.APPROVE_OPTION)return null;File f=parseDir.getSelectedFile();if(f.exists())return f;else{JOptionPane.showMessageDialog(this,"Could not open directory: " + f,"Error opening directory",JOptionPane.ERROR_MESSAGE);return null;}}//重写JPanel容器添加背景图片class MainPanel extends JPanel{ImageIcon background = new ImageIcon("images\\backimg.jpg");//加载图片Image im=Toolkit.getDefaultToolkit().getImage("images\\backimg.jpg");public void paintComponent(Graphics g) {g.drawImage(im, 0, 0, this);}}}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
资源下载地址:https://download.csdn.net/download/sheziqiong/85941192
资源下载地址:https://download.csdn.net/download/sheziqiong/85941192


http://chatgpt.dhexx.cn/article/4XcPmN2C.shtml

相关文章

基于Python的汉语分词系统

资源下载地址:https://download.csdn.net/download/sheziqiong/86776599 资源下载地址:https://download.csdn.net/download/sheziqiong/86776599 汉语分词系统 目录 汉语分词系统 1 摘要 1 1 绪论 1 2 相关信息 1 2.1 实验目标 1 2.2 编程语言与环境 2 …

ICTCLAS分词系统研究(一)

ICTClAS分词系统是由中科院计算所的张华平、刘群所开发的一套获得广泛好评的分词系统,难能可贵的是该版的Free版开放了源代码,为我们很多初学者提供了宝贵的学习材料。 但有一点不完美的是,该源代码没有配套的文档,阅读起来可能有一定的障碍,尤其是对C/C++不熟的人来说.本…

自然语言处理——分词系统(正向最大匹配法)

算法分析 正向最大匹配法,对于输入的一段文本从左至右、以贪心的方式切分出当前位置上长度最大的词。正向最大匹配法是基于词典的分词方法,其分词原理是:单词的颗粒度越大,所能表示的含义越确切。该算法主要分两个步骤: 该算法主要分为两个步…

LTE学习-信道均衡(ZF)

前面学习了信道估计和插值,现在说说信道均衡,信道均衡的作用就是根据信道估计和插值的结果尽可能恢复发射数据。信道均衡技术主要有两种,迫零(ZF)均衡和最小均方误差(MMSE)均衡,实际上还有一个最大似然(ML)均衡,但计算…

解调去载波后均衡信道与实际信道的关系

关注公号【逆向通信猿】更精彩!!! 通常,信号经过调制后发送,会经过信道作用,示意图可以表示为 其中 x ( t ) x(t) x(t)为基带信号, e

WLAN信道利用率

WLAN空口/信道利用率监控大致如下 参数 说明 Ctl channel 主信道号 Channel Band 信道带宽 Ext Channel-11N产品支持 辅信道类型(Bellow/Above) Bellow:辅信道向下绑定 Above:辅信道向上绑定 CtlBusy(%) 主信道利用率 TxBusy(%) 发送帧利用率 RxBusy(%) 接收帧利用…

第7章:OFDM 信道估计与均衡(1)

第7章(1)内容如下: 一、OFDM相关书籍二、OFDM基本原理三、OFDM经过高斯白噪声信道的误码率分析三、总结 本人最近搞懂了OFDM的一些知识,便给本章取名为第7章——OFDM信道估计、均衡。本文所有代码下载地址是:123kevin4…

信道利用率

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接: https://blog.csdn.net/weixin_42682806/article/details/84592569 这又是计算机网络中的一个计算题所在,真题…

无线通信——基于MATLAB实现OFDM系统(信道估计与均衡)

基于MATLAB实现OFDM系统基带信号在频率选择性衰落信道条件下的发送与接收 题目及要求: 仿真系统构成:信号输入(为随机比特流)、OFDM调制、仿真信道传输、OFDM解调、信号输出(可能存在误码的比特率)&#…

信道模型

下面是4种信道模型: 什么是信道模型?信道模型是用数学表达式来描述信道特性的,H_rx_tx,例如h21表示1发2收,下图的n表示噪声加在每个接收天线上,在实际中,很多噪声进入一个接收天线中,例如n1是所…

第7章:OFDM 信道估计与均衡(4)

第7章(4)内容如下: 一、导频结构与图案二、基于导频的信道估计算法和插值方法 本文所有可运行代码下载地址是:123kevin456/OFDM- 一、导频结构与图案 前三讲介绍了OFDM经过AWGN信道和衰落信道的误码率情况,其中在第&…

信道均衡之线性均衡——迫零滤波器

在通讯系统中,信道是影响信号传输质量的最重要因素,而信道均衡目的是则为了消除信道的影响。 一个基带传输的通信系统的简单示意图如图1,数字信号m(n)经过单位冲激响应为ht(t)的发送滤波器后,变成模拟信号 s(t), 然后通过的单位冲…

4.4.5 信道均衡(二)

4.4.5 信道均衡(二) 基本上 《XILINX FPGA的OFDM通信系统基带设计》一书已经带有各部分的代码,我做的工作就是将代码整合到一起,并按照仿真修改,让其能正常工作。本文将对实现中的重点部分做解释,并指出…

基带信号传输之信道均衡

信道中的频域均衡器中,它是用可调滤波器的频域特性去补偿基带系统的频域特性,使系统总的传输函数满足无失真传输条件; 时域均衡器,使用均衡器产生的波形去补偿已经变形的波形,使总的输出波形满足无码间串扰的条件。 …

无线衰落信道、多径与OFDM、均衡技…

参见 张贤达 通信信号处理。OFDM移动通信技术原理与应用,移动通信原理 吴伟陵 目录 无线信道的传播特征 无线信道的大尺度衰落 阴影衰落 无线信道的多径衰落 多径时延与与叠加后的衰落 频率选择性衰落和非频率选择性衰落 符号间干扰ISI的避免 多径信号的时延扩展引…

【通信技术专题:信道均衡器】

| 通信技术 通信技术发展至今,每个人都离不开它的存在。通信系统的核心主要在于物理层,物理层的关键在基带。在通信系统中,逻辑开发工程师主要工作就在基带和射频部分,甚至射频都不在从事的任务内。今天给大家简单讲讲基带接收机…

[培训-无线通信基础-7]:信道均衡器(信道估计、信道均衡)

作者主页(文火冰糖的硅基工坊):https://blog.csdn.net/HiWangWenBing 本文网址:https://blog.csdn.net/HiWangWenBing/article/details/118832368 目录 引言: 第1章 均衡器概述 1.1 什么是均衡器 1.2 如何进行信道估计 第2章 线性均衡器…

4.4.5 信道均衡(一)

4.4.5 信道均衡(一) 一、为什么要信道均衡? 数字信号在实际信道上传输时,由于信道传输特性不理想以及信道噪声的影响,接收端接收到的信号不可避免地发生错误。为了恢复发送的数据信息,接收端需要估计出信道…

信道均衡理论

一、基本概念 什么是均衡? 在得到的 Y [ n ] Y[n] Y[n]当中,存在符号间干扰和噪声。在通信当中,把符号间干扰去掉的技术叫作均衡( equalization)。 横向抽头滤波器 图中 x ( t ) x(t) x(t)为存在符号间干扰的模拟基带信号, y ( t ) y(t) y(…

信道均衡的原理

信道均衡的概念 信道均衡(Channel equalization)是指为了提高衰落信道中的通信系统的传输性能而采取的一种抗衰落措施。它主要是为了消除或者是减弱宽带通信时的多径时延带来的码间串扰(ISI)问题。 其机理是对信道或整个传输系…