当前位置: 首页 > news >正文

2019年认证杯SPSSPRO杯数学建模B题(第二阶段)外星语词典全过程文档及程序

2019年认证杯SPSSPRO杯数学建模

基于统计和迭代匹配的未知语言文本片段提取模型

B题 外星语词典

原题再现:

  我们发现了一种未知的语言,现只知道其文字是以 20 个字母构成的。我们已经获取了许多段由该语言写成的文本,但每段文本只是由字母组成的序列,没有标点符号和空格,无法理解其规律及含义。我们希望对这种语言开展研究,有一种思路是设法在不同段文本中搜索共同出现的字母序列的片段。语言学家猜测:如果有的序列片段在每段文本中都会出现,这些片段就很可能具备某种固定的含义 (类似词汇或词根),可以以此入手进行进一步的研究。在文本的获取过程中,由于我们记录技术的限制,可能有一些位置出现了记录错误。可能的错误分为如下三种:
  1. 删失错误:丢失了某个字母;
  2. 插入错误:新增了原本不存在的字母;
  3. 替换错误:某个字母被篡改成了其他的字母。
  第二阶段问题: 现假设我们已经获取了 30 段文本,每段文本的长度都在5000–8000 个字母之间。我们希望找到的片段的长度为 15 个字母。由于技术的限制,当我们在记录每个字母时,都可能有五分之一的概率发生错误。错误类型可能为删失错误、插入错误或替换错误,每个错误只涉及一个字母,且每个错误的发生是独立的。请你设计合理的数学模型,快速而尽可能多地找到符合要求的片段,并自行编撰算例来验证算法的效果。如果我们事先不知道所寻找的片段的长度,算法又应当进行什么改进呢?

整体求解过程概述(摘要)

  任何自然语言系统都可看作是表达意义的符号系统,本文提出的模型的目标是如何有效且快速地从完全未知的语言文本中提取出可能具有某个固定含义的片段,并考虑了在记录文本过程中由于技术限制出现的错误,能够最大限度提取出可能由于记录错误导致出错的片段,并分析错误的类型(替换错误、删失错误、插入错误)。
  针对问题一,本文假设希望获取到的片段长度固定的为 15 个字母,从时间上和空间上都简化了复杂度。首先我们按照要求模拟了 30 段长度在 5000~8000 个字母之间且含有错误的外星文本。具体做法是先构造一个每个字母呈 Gauss 分布的片段库,每个片段长度固定为 15个字母;再根据片段库里的片段构造出 30 段正确的文本,每个片段在文中也是呈 Gauss分布;接着又根据正确的文本构造出 30 段错误的文本,其特点是每个字母有 1/5 的出错概率,并且每个错误类型出现的概率皆为 1/3。然后,本文对外星文本进行大量统计和分析,寻找到截取出的每个片段的三个属性特征,由此建立三维坐标系。具体做法是首先以窗体形式截取出所有片段,固定窗体宽度为 15;然后基于马尔可夫(Markov)模型获取片段的概率;紧接着回到外星文本统计出每个字母的频率,观察其分布;最后统计出每个片段中不同符号(字母)的个数,作为片段的第三个特征量;经过这些工作,就可以建立三维坐标系。接着,对于上一步所得到的片段三维特征量进行减法聚类(subtrative clustering method,SCM)便得出中心点的三维坐标,根据中心点的坐标确定出中心片段,即我们的目标片段。最后将取得的目标片段与片段库 1 作比对,正确率为 73.3%。最后还对模型一做了扩展,在模型一的基础上,结合汉明距离(Hamming Distance)分析出错误片段的错误类型。分析结果表明错误片段的错误类型基本可以确定。
  针对问题二,本文通过改进模型一,建立了模型二,改进内容最主要有以下四个方面:第一方面,将模型一的片段库里的定长片段改为长度在 15~21 字母之间的不定长片段,其中 15~21 这一片段长度是根据第一阶段的问题而假定的,在模型二中只是用来说明模型,长度的范围可以灵活改变。第二方面是建模的难点,不定长的片段应如何截取才能得到我们所需要的片段,我们丢弃了传统的方法(传统方法是将每个长度的片段都截取一遍),而本文通过对片段进行仔细研究找到这样一个特点:从文本的同一位置出发,非最短长度(这里指长度为16、17、18、19、20、21 的片段)必定已经包含最短长度的片段(这里指长度为 15 的片段),即最短长度的片段一定是非最短长度的片段的子串,此处忽略非最短片段间的相互包含关系(如:长度为 19 的片段是长度为 21 片段的子片段)。根据这一特点,本文只选取最短片段长度作为窗体大小截取子串,再根据后面的算法找出子串的“后半段”来确定目标片段。第三方面是建模的重点,前面只截取了片段的子串,那么如何找出连接在子串后的后半段是该步骤要解决的问题。解决方法是迭代匹配搜索算法,把中心子串带回外星文本按一定的概率标准和长度限制进行“首字母位置不变,尾字母右移 1 位”匹配搜索,直至确定出目标片段。最后将取得的目标片段与片段库 1 作比对,正确率为 83.3%。第四个方面,分析错误类型时,长短不一的两个片段先使用“-”进行补位后再进行汉明距离的计算。另外本文运用 Java、Matlab 语言,用 Excel 工具做辅助,对模型和问题进行了仿真实验,验证了模型的可行性。
  最后本文还对模型进行了量化评价,总体来说通过对问题一的分析基本建立起了整体模型,通过问题二对模型一进行了改进,模型二的可靠性较强,有效性适中,但模型的使用灵活性大,范围广,还可用于自然语言处理(Natural Language Processing,NLP)、机器学习(Machine Learning)等方面,是一个应用性能比较强的模型。

问题分析:

  解读未知文本的过程,第一步是寻找很可能具备某种固定的含义(类似词汇或词根)的片段。这些希望被找到的片段出现频率不一,从经验的角度出发,文本的基元出现频率一般服从 Gauss 分布,为此,我们假设各片段、各字母在文本中出现的频率大致服从Gauss 分布。
  针对问题一
  问题一的要求是:有 30 段长度为 5000~8000 的外星文本,片段长度固定为 15,每个字母有 20%的概率发生错误,考虑有三种错误(删失错误、插入错误、替换错误),每个错误只涉及一个字母,且错误是独立发生的。要求快而尽可能多地找到符合要求的片段。正对该问题本文的基本思路是首先构造外星文本,对文本截取片段、做一些基础统计,由此建立三维坐标系,然后通过减法聚类找到目标片段,到此,我们还要根据聚类中心点以及汉明距离分析出有可能出现错误的片段和错误类型。
  针对问题二
  问题二的要求是:在问题一的基础上假设事先不知道所寻找的片段的长度,要如何改进模型一。本文假设片段的长度在 15–21 个字母之间(参考第一阶段的问题要求),设想在截取片段的过程中,在同一个位置往后截取长度为 15 的片段S1和截取长度为18(可以为 16、17、18、19、20、21)的片段S2,那么S2必定包含S1,换句话说,S1是S2的子串。在模型一的基础上我们改进的部分是:
  (1) 建立长度不固定的片段库;
  (2) 先只截取最小字串长度(15)的所有片段;
  (3) 减法聚类的结果其实就是我们要找的目标片段的子串,把子串带入外星文本搜索以这个子串为字串的更长片段,根据频率确定出本来该有的片段长度。

模型假设:

  在求解过程中,假设:
  (1) 文本中一共由 20 个不同的符号构成,符号的形状并不是主要研究对象,这里假设是英文字母表的前 20 个字母,(a~t);
  (2) 文本没有空格,没有标点符号;
  (3) 未知片段出现的频率服从 Gauss 分布;
  (4) 由于人类技术限制,替换和插入的字母是随机的,并且每个错误只涉及一个字母,错误是独立发生的;
  (5) 每个字母发生错误的概率是 1/5;
  (6) 每种错误(删失错误、插入错误、替换错误)发生的概率都是 1/3;
  (7) 对于问题一,片段长度为 15;对于问题二,希望找到的片段的长度在 15–21 个字母之间(参考第一阶段的问题要求)。

论文缩略图:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

全部论文请见下方“ 只会建模 QQ名片” 点击QQ名片即可

部分程序代码:(代码和文档not free)

import java.io.*;
import java.util.*;
public class dictionary {
public static void getStringRandom(String s,int leng) {
File file=new File(s);
String line=null;
String chars = "abcdefghijklmnopqrst";
Double[] p 
={0.3,0.6,0.6,0.7,0.75,0.8,0.85,0.9,0.9,0.95,0.95,0.95,0.9,0.85,0.8,0.75,0.7,0.6,0.4,0.3};
String val = "";//片段字符串
char c='\0';
List<String> pd = new ArrayList<String>();//片段
List<Double> pr = new ArrayList<Double>();//概率
try{
BufferedReader buf = new BufferedReader(new FileReader(file));
while((line = buf.readLine())!=null){
for(int i = 0; i < leng; i++) {
int m = (int)(Math.random() * 20);
if (mingZhong(p[m])) {
c=chars.charAt(m);
}
val +=c;
}
pd.add(val);//片段
pr.add(Double.parseDouble(line)); //概率
val="";
if(pd.size()>=50){
break;
}
if(pd.size()>=50){
break;
}
}
buf.close();
for (int m=0;m<pr.size() ;m++ ) {
System.out.println(pd.get(m)+":"+pr.get(m));
}
StringBuilder sb = new StringBuilder();
File file_result = new File("AlienLang.txt");
PrintWriter output = new PrintWriter(file_result);//创建写对象
Random rand = new Random();
for (int k=0;k<30 ;k++ ) {
int zishu = rand.nextInt(3001)+5000;//生成 5000-8000 之间的随
机数,包括 8000
while (true) {
int ra = (int)(Math.random()*50);
if (mingZhong(pr.get(ra))) {
sb.append(pd.get(ra));
}
if (sb.length()>=(zishu-15) && sb.length()<=(zishu+15)) {
output.println(sb.toString());
sb.delete( 0, sb.length() );
break;
}
}
}
output.close();System.out.println("结束");
}catch(Exception e){
e.printStackTrace();
}
}
public static boolean mingZhong(double hr) {
Random r = new Random();
int a = r.nextInt(100);//随机产生[0,100)的整数,每个数字出现的概率为
1%
if(a<(int) (hr*100)){ //前 hr*100 个数字的区间,代表的几率
return true;
}else{
return false;
}
}
public static void main(String[] args) {
getStringRandom("pro.txt",15);
}
}
import java.io.*;
import java.util.*;
class ErrorText{
public static void main(String[] args) throws Exception{
File file_source = new File("AlienLang.txt");
File file_result = new File("AlienLang_err.txt");
InputStreamReader is = new InputStreamReader(new 
FileInputStream(file_source));//将输入的字节流转换成字符流
BufferedReader br=new BufferedReader(is);//将字符流添加到缓冲流PrintWriter output = new PrintWriter(file_result);//创建写对象
String str=null;
String chars = "abcdefghijklmnopqrst";
try{
while ((str = br.readLine()) != null){
StringBuilder sb = new StringBuilder(str);
for (int i=0;i<sb.length() ;i++ ) {
if (mingZhong(0.2)) {
if (err_type()==1) {//插入
int ra2 = (int)(Math.random()*20);
String ch=String.valueOf(chars.charAt(ra2));
sb.replace(i,i+1,String.valueOf(str.charAt(i))+ch);//sb.append(str.charAt(i)+ch);
i++;//下一个字母
}else if (err_type()==2) {//替换
String ch=null;
while (true) {//不能替换成同一个字母。例如 b 不能
替换成 b
int ra2 = (int)(Math.random()*20);
ch=String.valueOf(chars.charAt(ra2));
if (!ch.equals(String.valueOf(str.charAt(i)))) {
break;
}
}
sb.replace(i,i+1,ch);//sb.append(ch);
}else {//缺失
sb.delete(i,i+1);//不包含 i+1
i--;
}
}
}
output.println(sb.toString());
}
}catch(FileNotFoundException e){
e.printStackTrace();
}br.close();
output.close();System.out.println("结束");
}
public static boolean mingZhong(double hr) {
Random r = new Random();
int a = r.nextInt(100);//随机产生[0,100)的整数,每个数字出现的概率为
1%
if(a<(int) (hr*100)){ //前 hr*100 个数字的区间,代表的几率
return true;
}else{
return false;
}
}
public static int err_type() {
Random r = new Random();
int flag;
int a = r.nextInt(100);//随机产生[0,100)的整数,每个数字出现的概率为
1%
if(a<33){ 
flag = 1;
}else if(a<66){
flag = 2;
}else {
flag = 3;
}
return flag;
}
}
全部论文及程序请见下方“ 只会建模 QQ名片” 点击QQ名片即可

相关文章:

2019年认证杯SPSSPRO杯数学建模B题(第二阶段)外星语词典全过程文档及程序

2019年认证杯SPSSPRO杯数学建模 基于统计和迭代匹配的未知语言文本片段提取模型 B题 外星语词典 原题再现&#xff1a; 我们发现了一种未知的语言&#xff0c;现只知道其文字是以 20 个字母构成的。我们已经获取了许多段由该语言写成的文本&#xff0c;但每段文本只是由字母…...

NFS的共享与挂载

一、NFS网络文件服务 1.1简介 NFS&#xff08;Network File System 网络文件服务&#xff09; 文件系统&#xff08;软件&#xff09;文件的权限 NFS 是一种基于 TCP/IP 传输的网络文件系统协议&#xff0c;最初由 Sun 公司开发。 通过使用 NFS 协议&#xff0c;客户机可以像访…...

函数式编程的Java编码实践:利用惰性写出高性能且抽象的代码

转载链接 本文会以惰性加载为例一步步介绍函数式编程中各种概念&#xff0c;所以读者不需要任何函数式编程的基础&#xff0c;只需要对 Java 8 有些许了解即可。 一 抽象一定会导致代码性能降低&#xff1f; 程序员的梦想就是能写出 “高内聚&#xff0c;低耦合”的代码&…...

2024年甘肃省职业院校技能大赛信息安全管理与评估 样题二 模块二

竞赛需要完成三个阶段的任务&#xff0c;分别完成三个模块&#xff0c;总分共计 1000分。三个模块内容和分值分别是&#xff1a; 1.第一阶段&#xff1a;模块一 网络平台搭建与设备安全防护&#xff08;180 分钟&#xff0c;300 分&#xff09;。 2.第二阶段&#xff1a;模块二…...

mysql 一对多 合并多个通过 逗号拼接展示

mysql 一对多 合并多个通过 逗号拼接展示 以上内容由chatgpt中文网 动态生成 SELECTuser_id,project_id,GROUP_CONCAT(project_specs_id) AS merged_specs_ids FROMzt_medication_specs_total WHEREspecs_num_total < 5 GROUP BYuser_id, project_id;laravel model 对应写…...

Java零基础教学文档第五篇:jQuery

今日新篇章 【jQuery】 【主要内容】 jQuery简介 jQuery安装 jQuery语法 jQuery选择器 jQuery事件处理 jQueryDOM操作 jQuery元素遍历 jQuery过滤 jQuery其它方法 【学习目标】 1.jQuery简介 1.1 jQuery简介 jQuery 库可以通过一行简单的标记被添加到网页中。 1.…...

samba

samba 文章目录 samba1. samba简介2. samba访问3. 示例 1. samba简介 Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件&#xff0c;由服务器及客户端程序构成。 在此之前我们已经了解了NFS&#xff0c;NFS与samba一样&#xff0c;也是在网络中实现文件共享的一种实现&a…...

「云渲染科普」3dmax vray动画渲染参数如何设置

动画渲染一直都是占用时间最多的地方&#xff0c;动画帧数通常 1 秒在 25 帧或者以上&#xff0c;电脑通常需要对每一帧的画面分批渲染&#xff0c;通常本地电脑由于配置上的限制&#xff0c;往往无法在短时间内快速的完成渲染任务。这时“云渲染”则成为了动画渲染的主要方案&…...

【GCC】6 接收端实现:周期构造RTCP反馈包

基于m98代码。GCC涉及的代码,可能位于:webrtc/modules/remote_bitrate_estimator webrtc/modules/congestion_controller webrtc/modules/rtp_rtcp/source/rtcp_packet/transport_feedback.cc webrtc 之 RemoteEstimatorProxy 对 remote_bitrate_estimator 的 RemoteEstimato…...

【RTOS】快速体验FreeRTOS所有常用API(6)事件组

目录 六、事件组6.1 基本概念6.2 创建6.3 设置事件6.4 等待事件6.5 实例 六、事件组 该部分在上份代码基础上修改得来&#xff0c;代码下载链接&#xff1a; https://wwzr.lanzout.com/iihn01la39je 密码:dtr0 该代码尽量做到最简&#xff0c;不添加多余的、不规范的代码。 内容…...

Springboot开发的大学生寝室考勤系统刷脸进出宿舍系统论文

摘要 近年来随着社会科学技术的全面进步及高等教育的普及&#xff0c;以计算机与通信技术为基础的信息系统正处于蓬勃发展的时期&#xff0c;学生作为预备的高新技术人才数量也在急剧上升&#xff0c;随之而来的就是高校管理上的一系列问题&#xff0c;首当其冲的便是高校应对…...

2024年美赛数学建模思路 - 复盘:校园消费行为分析

文章目录 0 赛题思路1 赛题背景2 分析目标3 数据说明4 数据预处理5 数据分析5.1 食堂就餐行为分析5.2 学生消费行为分析 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 赛题背景 校园一卡通是集…...

测试覆盖率 之 Cobertura的使用

什么是代码覆盖率&#xff1f; 代码覆盖率是对整个测试过程中被执行的代码的衡量&#xff0c;它能测量源代码中的哪些语句在测试中被执行&#xff0c;哪些语句尚未被执行。 为什么要测量代码覆盖率&#xff1f; 众所周知&#xff0c;测试可以提高软件版本的质量和可预测性。…...

vue表格插件vxe-table导出 excel

vxe-table 默认支持导出 CSV、HTML、XML、TXT格式的文件&#xff0c;不支持 xlsx 文件 要想导出 xlsx 文件&#xff0c;需要使用 vxe-table-plugin-export-xlsx 依赖 参考&#xff1a;https://cnpmjs.org/package/vxe-table-plugin-export-xlsx/v/2.1.0-beta 1.安装 npm inst…...

stable diffusion使用相关

IP Adapter&#xff0c;我愿称之它为SD垫图 IP Adapter是腾讯lab发布的一个新的Stable Diffusion适配器&#xff0c;它的作用是将你输入的图像作为图像提示词&#xff0c;本质上就像MJ的垫图。 IP Adapter比reference的效果要好&#xff0c;而且会快很多&#xff0c;适配于各种…...

Center项目创建——数据初始化(Linux/Windows版本)

本博客主要讲述Center的模块安装配置和数据初始化 1、定义安装Install函数&#xff0c;IP地址由makefile自动传入&#xff0c;也就是用户自动传入 bool Install(std::string ip); 2、编写Install函数 #define CENTER_CONF "ip bool XCenter::Install(std::string ip)…...

保送阿里云的云原生学习路线

近期好多人都有咨询学习云原生有什么资料。与其说提供资料不如先说一说应该如何学习云原生。 Linux基础知识&#xff1a;云原生技术通常在Linux环境中运行&#xff0c;因此建议首先掌握Linux的基础知识&#xff0c;包括命令行操作、文件系统、权限管理等。 容器化技术&#x…...

【昕宝爸爸小模块】深入浅出之JDK21 中的虚拟线程到底是怎么回事(二)

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你&#x1f44d;点赞、&#x1f5c2;️收藏、加❤️关注哦。 本文章CSDN首发&#xff0c;欢迎转载&#xff0c;要注明出处哦&#xff01; 先感谢优秀的你能认真的看完本文&…...

两周掌握Vue3(三):全局组件、局部组件、Props

文章目录 一、全局组件1.创建全局组件2.在main.js中注册全局组件3.使用全局组件 二、局部组件1.创建局部组件2.在另一个组件中注册、使用局部组件 三、Props1.定义一个子组件2.定义一个父组件3.效果 代码仓库&#xff1a;跳转 本博客对应分支&#xff1a;03 一、全局组件 Vue…...

Web前端篇——element-plus组件设置全局中文

背景&#xff1a;在使用el-date-picker组件时&#xff0c;发现组件中的文字默认都是英文。 设置全局中文的方法如下&#xff1a;&#xff08;本文只介绍CDN方式&#xff09; <script src"//unpkg.com/element-plus/dist/locale/zh-cn"></script> <s…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误

HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误&#xff0c;它们的含义、原因和解决方法都有显著区别。以下是详细对比&#xff1a; 1. HTTP 406 (Not Acceptable) 含义&#xff1a; 客户端请求的内容类型与服务器支持的内容类型不匹…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...