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

news2025/1/11 18:32:38

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名片即可

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1388255.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot从数据库读取数据数据源配置信息,动态切换数据源

准备多个数据库 首先准备多个数据库&#xff0c;主库smiling-datasource&#xff0c;其它库test1、test2、test3 接下来&#xff0c;我们在主库smiling-datasource中&#xff0c;创建表databasesource&#xff0c;用于存储多数据源相关信息。表结构设计如下 创建好表之后&#…

Batch_size对精度和损失的影响研究

1 问题 Batch_size(批尺寸)首先决定的是下降的方向&#xff0c;是机器学习中一个重要参数&#xff0c;所以本文主要探索不同的batch_size对精度和损失的影响。 2 方法 绘制不同batch_size下的训练和验证精度、损失图&#xff0c;并进行对比来研究其影响。 数据集&#xff1a;我…

Burp Suite如何拦截站点请求

Burp Suite是一款强大的Web渗透测试工具&#xff0c;可以用于拦截、修改和分析Web应用程序的请求和响应。要使用Burp Suite拦截站点请求有两个方案。我会倾向选用方案二&#xff0c;因为它不会影响本地电脑代理配置。 1. 方案一 安装Burp Suite&#xff1a;首先&#xff0c;您…

STM32 USB OTG主机模式的实现方法

为了实现STM32的USB OTG主机模式&#xff0c;我们首先需要了解一些基本概念和原理&#xff0c;然后进行相应的硬件连接和软件编程。在这篇文章中&#xff0c;我们将介绍如何在STM32微控制器上实现USB OTG主机模式&#xff0c;并提供相应的代码示例。 1. STM32 USB OTG主机模式…

智慧公厕:利用物联网、云计算和人工智能实现智能化管理与控制

智慧公厕是指利用传感感知、物联网、互联网、大数据、云计算、自动化控制等先进技术&#xff0c;实现对公厕的智能化管理与控制。通过以上高精尖的信息技术手段&#xff0c;可以实时监测厕所内人体活动状态、人体存在状态、空气质量情况、环境变化情况、设施设备运行状态等信息…

AI-基于Langchain-Chatchat和chatglm3-6b部署私有本地知识库

目录 参考概述部署安装环境准备原理和流程图一键启动启动WebAPI 服务启动WebUI服务 Docker部署知识库管理常见问题本地知识库怎么微调&#xff1f;回答不准确 参考 手把手教你搭建本地知识库问答AI机器人 LangChain-Chatchat&#xff1a;基于LangChain和ChatGLM2-6B构建本地离…

flink1.14.5使用CDH6.3.2的yarn提交作业

使用CDH6.3.2安装了hadoop集群&#xff0c;但是CDH不支持flink的安装&#xff0c;网上有CDH集成flink的文章&#xff0c;大都比较麻烦&#xff1b;但其实我们只需要把flink的作业提交到yarn集群即可&#xff0c;接下来以CDH yarn为基础&#xff0c;flink on yarn模式的配置步骤…

读元宇宙改变一切笔记09_硬件与互操作性(下)

1. 移动互联网的继承者 1.1. 要想让元宇宙成为现实&#xff0c;需要开发新的标准&#xff0c;创建新的基础设施&#xff0c;可能还需要对长期存在的TCP/IP协议进行彻底改革 1.1.1. 采用新的设备和硬件&#xff0c;甚至可能打破技术巨头、独立开发者和终端用户之间的权利平衡 …

简单整理FFmpeg相关命令集

FFmpeg相关命令集 简单整理了FFmpeg相关命令&#xff0c;主要包括ffplay播放控制和媒体播放命令、ffmpeg命令相关参数以及常用的提取音视频等命令。 &#x1f3a1;导航小助手&#x1f3a1; FFmpeg相关命令集1.ffmpeg命令分类查询2.ffplay命令2.1 ffplay播放控制2.2 ffplay命令…

使用ffmpeg进行视频截取

1 原始视频信息 通过ffmpeg -i命令查看视频基本信息 ffmpeg version 6.1-essentials_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developersbuilt with gcc 12.2.0 (Rev10, Built by MSYS2 project)configuration: --enable-gpl --enable-version3 --enable-sta…

【Kotlin】协程的字节码原理

前言 协程是Koltin语言最重要的特性之一&#xff0c;也是最难理解的特性。网上关于kotlin协程的描述也是五花八门&#xff0c;有人说它是轻量级线程&#xff0c;有人说它是无阻塞式挂起&#xff0c;有人说它是一个异步框架等等&#xff0c;众说纷芸。甚至还有人出了书籍专门介…

[笔记]深度学习入门 基于Python的理论与实现(一)

代码仓库 gitee 1. python 入门 1.5之前是python安装和基础语法, 我直接跳过了 1.5 Numpy 深度学习中经常出现数组和矩阵运算&#xff0c;Numpy 的数组类 numpy.array 提供了很多便捷的方法 1.5.1 导入 Numpy import numpy as np1.5.2 生成 Numpy 数组 np.array()&#xf…

云计算概述(发展过程、定义、发展阶段、云计算榜单)(一)

云计算概述&#xff08;一&#xff09; &#xff08;发展过程、定义、发展阶段、云计算榜单&#xff09; 本文目录&#xff1a; 零、00时光宝盒 一、前言 二、云计算的发展过程 三、云计算的定义 四、云计算发展阶段 五、云计算公司榜单看云计算兴衰 六、参考资料 零、0…

数据结构与算法教程,数据结构C语言版教程!(第四部分、字符串,数据结构中的串存储结构)二

第四部分、字符串&#xff0c;数据结构中的串存储结构 串存储结构&#xff0c;也就是存储字符串的数据结构。 很明显&#xff0c;字符串之间的逻辑关系也是“一对一”&#xff0c;用线性表的思维不难想出&#xff0c;串存储结构也有顺序存储和链式存储。 提到字符串&#xff…

《SPSS统计学基础与实证研究应用精解》视频讲解:SPSS运行环境设置

《SPSS统计学基础与实证研究应用精解》1.8 视频讲解 视频为《SPSS统计学基础与实证研究应用精解》张甜 杨维忠著 清华大学出版社 一书的随书赠送视频讲解1.6节内容。本书已正式出版上市&#xff0c;当当、京东、淘宝等平台热销中&#xff0c;搜索书名即可。本书旨在手把手教会使…

【机器学习300问】8、为什么要设计代价函数(损失函数)?它有什么用?

一、先介绍一下线性回归模型 &#xff08;1&#xff09;基本概念理解 文字解释&#xff1a;线性回归模型顾名思义&#xff0c;他处理的回归问题&#xff0c;是监督学习的一种。线性回归模型是一种预测模型&#xff0c;其基础是假设目标值和输入值之间存在线性关系。通过一条最…

矩阵快速幂技巧练习(一)— 经典牛问题

上一篇文章简单介绍了斐波那契数列的矩阵乘法&#xff0c;并做了一个小推广&#xff0c;这篇文章来小试牛刀&#xff0c;做一个经典的练习题。 求斐波那契数列矩阵乘法的方法 题目 第一年农场有一只成熟的母牛A&#xff0c;往后的每年&#xff1a; 每一只成熟的母牛都会生一只…

websocket项目 聊天室

1.项目概述 这个项目是一个基本的实时聊天应用&#xff0c;适用于小型团队或群体。提供了多个聊天室供用户选择。可以通过该代码进行进一步的扩展和定制&#xff0c;例如添加聊天机器人、改进界面等。 2.技术栈 flask&#xff0c;boostrapt&#xff0c;websocket&#xff0c…

【Rust】get_local_info 0.2.4发布

发布0.2.4&#xff0c;修正0.2.3&#xff08;[我的Rust库更新]get_local_info 0.2.3-CSDN博客&#xff09;中存在的峰值算法bug&#xff0c;现已提交力扣并通过&#xff0c;耗时0ms

[笔记]深度学习入门 基于Python的理论与实现(二)

2. 感知机 感知机(perceptron)是由美国学者 Frank Rosenblatt 在 1957 年提出的。它作为神经网络&#xff08;深度学习&#xff09;的起源的算法&#xff0c;是学习神经网络和深度学习的重要一环 严格地说&#xff0c;本章所说的感知机应该称为‘人工神经元’或‘朴素感知机’&…