基于机器学习的英汉字典模糊查询毕业设计论文.docx
《基于机器学习的英汉字典模糊查询毕业设计论文.docx》由会员分享,可在线阅读,更多相关《基于机器学习的英汉字典模糊查询毕业设计论文.docx(31页珍藏版)》请在冰豆网上搜索。
基于机器学习的英汉字典模糊查询毕业设计论文
○A基础理论
●B应用研究
○C调查报告
○D其他
本科生毕业设计(论文)
基于机器学习的英汉字典模糊查询
二级学院
:
信息科学与技术学院
专业
:
计算机科学与技术
年级
:
2010级
学号
:
2010344369
作者姓名
:
苏家辉
指导教师
:
蔡广基副教授
完成日期
:
2014年5月24日
基于机器学习的英汉字典模糊查询
专业名称:
计算机科学与技术
作者姓名:
苏家辉
指导教师:
蔡广基
论文答辩小组
组长:
蔡广基
成员:
王晓晔
关心
论文成绩:
基于机器学习的英汉字典模糊查询
作者苏家辉指导教师蔡广基副教授
(湛江师范学院信息科学与技术学院,湛江524048)
摘要:
本文研究机器学习的基本原理和实现方法,对一个使用动态规划实现的英汉字典模糊查询系统构建一个机器学习模型。
该模型实现了对用户的检索习惯进行分析,提取用户检索数据中的有趣模式,并通过统计频度对模式集进行自动优化,为用户的模糊查询提供智能化的查询结果。
釷鹆資贏車贖孙滅獅赘。
关键词:
机器学习模型,动态规划,模糊查询
FuzzyqueryofanEnglish-Chinesedictionarybasedonmachinelearning怂阐譜鯪迳導嘯畫長凉。
SuJiahui
Schoolofinformationscienceandtechnology,ZhanjiangNormalUniversity,Zhanjiang,524048China谚辞調担鈧谄动禪泻類。
Abstract:
Basedonthemachinelearningtheory,amodelofthefuzzyqueryofanEnglish-Chinesedictionarysystem,whichisfulfilledbythedynamicprogrammingalgorithmisgiven.Themodelanalysestheuser’sfuzzyquerydataandfindsouttheconnectionsbetweenthedata,recordingtheminingmodels,appliesthemtothefuzzyquerysetduringanon-accuratesearching,andautomaticallyimprovestheminingmodelssetaccordingtothestatisticsatfrequenciesofuser,providingintelligentsolutionsforthefuzzyquery.嘰觐詿缧铴嗫偽純铪锩。
Keywords:
Machinelearning;dynamicprogrammingalgorithm;fuzzyquery;熒绐譏钲鏌觶鷹緇機库。
1引言
1.1研究背景及其意义
机器学习是现代人工智能研究、发展的重要领域,它通过研究计算机如何模拟或实现人类的学习行为,通过分析、归纳、综合建立人类学习过程的计算模型或认识模型,基于已有数据识别复杂模式,做出智能化的决策,并将其应用于实际问题中,为解决问题提供可行决策和方案支持[1]。
自1980年在卡内基梅隆大学召开第一届机器学习研讨会以来,机器学习的研究工作发展迅猛,已成为人工智能领域研究的中心课题之一。
随着机器学习的蓬勃发展,人们在工作中累积了大量可供测试算法的数据集或者超大数据集,机器学习工作者在此基础上可以进行更精准的研究。
目前机器学习已经广泛应用于智能搜索、数据分析等领域,如许多大型的搜索引擎网站的智能化的用户体验都是基于机器学习等研究成果实现的。
在大数据时代,机器学习研究将会得到更大的发展。
鶼渍螻偉阅劍鲰腎邏蘞。
1.2研究内容和目标
研究机器学习模型的生成过程,构建机器学习的模型,将其应用到英汉字典模糊查询中。
第2节介绍机器学习和模糊查询中的基本思路和实现方法,第3节具体介绍算法实现的设计和数据的处理,第4节编码实现构想,第5节通过一些测试用例验证、完善算法的基本功能,最后一节对本研究做出总结并提出新展望。
纣忧蔣氳頑莶驅藥悯骛。
2研究与实现中的关键技术
2.1机器学习的基本原理
机器学习是从已有或动态的数据中提取有用的新知识[2],并将其应用到问题的决策中,其基本过程为:
1.收集学习材料,即获取的数据;
2.分析数据,从中提取有趣的模式;
3.基于数据分析获取有趣的模式,生成知识库,制定决策;
4.通过学习新知识检验知识库数据的有效性,修改、完善知识库。
在步骤1中获取的知识是原始的数据或材料,他们看起来可能是杂乱无章的,因此在步骤2需要对数据进行分析,挖掘复杂的隐藏的模式,使用朴素的贝叶斯分类、噪声处理等方法对数据进行分离、提取,然后在将来的决策(步骤3)中使用这些模式去提供方案。
但是提取出来的模式也可能是无效的,这就需要步骤4不断地学习新的知识,判定模式是否有效,修改完善知识库。
颖刍莖蛺饽亿顿裊赔泷。
2.2有趣模式的提取
如何从原始数据中提取有用的模式,挖掘那些隐藏的有趣知识?
分类是数据分析的一种重要的形式,通过它可以提取重要的数据类型。
分类首先要基于现有数据建立一个分类模型,然后根据模型对数据进行分类。
分类模型有决策树分类器、贝叶斯分类器和基于规则的分类器等[3]。
濫驂膽閉驟羥闈詔寢賻。
在英汉字典模糊查询系统,使用的是基于规则的分类器--形如IF-THEN的分类器。
规则的IF部分是前提条件,THEN部分是结论。
假如用户的某些输入满足特定的条件则可认为是有趣模式。
一般情况下,如果用户本次输入的数据在上一次模糊查询的结果集中,则可认为上一次为用户提供的结果集中的对应项是有趣的。
如果不满足这一条件则可认为上一次的模糊结果集对用户没有帮助,即为无效数据,丢弃之。
英汉字典模糊查询系统的规则分类器实现大体如下:
銚銻縵哜鳗鸿锓謎諏涼。
本次是否为精确查询?
YESNO
上一次是否有模糊结果集?
非有趣模式
YESNO
本次输入在上一次模糊结果集中?
非有趣模式
YESNO
有趣模式非有趣模式
图2.1规则分类器的实现
2.3有趣模式集的优化
有趣模式集中的记录都是用户感兴趣的,但是对于一个非精确的输入可能存在多个用户感兴趣的选择项,如何确定最优的选择项呢?
在统计学上,使用概率表示一件事情在大量测试下发生的可能性[4]。
假设A代表用户的一个模糊输入,X1,…,Xi代表A输入所对应的用户感兴趣的选择项,设p(A|Xi)为用户输入A后选择Xi的概率,分别计每一个选择项Xi的p(A|Xi),将具有最大值的选择项排在最前面,即为最优的选择项。
用户每次输入A后选择Xi都是对A—Xi模式的一次强化。
p(A|Xi)=n(Xi)/n(A),在该式中n(Xi)表示Xi被选择的次数,n(A)表示输入A的总次数,对于计算A的所有选择项的p(A|Xi),分母都是相同的,因此在具体的实现中,只需要为每一个选择项项添加一个频度计数,这样具有最大频度计数的选择项即为最优的选择项。
挤貼綬电麥结鈺贖哓类。
2.4使用动态规划的最长公共子序列
动态规划[5]采用自底向上的递推求值,把中间的结果存储起来并用于后面的计算,对于改善蛮力搜索的时间复杂度是比较有效的,假设a[n],b[m]分别表示长度为n,m的两个字符串,则a[0],…,a[n-1]中的任意组合表示a的子序列,b[0]…b[m-1中的任意组合表示b的子序列,如果要求这两个字符串的最长公共子序列,采用简单的线性规划的方法是:
列举a的所有所有2的n次方个子序列,察看它与b[m]的最长公共子序列长度,采用这种方法的时间复杂度是指数级的Ο(n^2),如果采用动态规划的方法可以使解决最初公共子序列问题优化到Ο(nlogn)。
假设L[n][m]表示a的前n个字符与b的前m个字符之间的最长公共子序列长度,则L[n][m]的递推公式如下:
赔荊紳谘侖驟辽輩袜錈。
LCSflag初始值为0,用于标记当n或m为0时,前面是否有a的子序列与b的子序列相等的情况。
对于n=0或m=0,若a[n]=a[m],则L[n][m]=LCSflag=1,如果a[n]!
=a[m],若LCSflag=1则,L[n][m]=1,否则L[n][m]=0;塤礙籟馐决穩賽釙冊庫。
对于n和m都不等于0的情况:
若a[n]=b[m]则L[n][m]=L[n-1][m-1]+1;若a[n]!
=b[m]则L[n][m]={L[n-1][m]和L[n][m-1]中的最大值}。
裊樣祕廬廂颤谚鍘羋蔺。
3系统设计
3.1总体结构
系统的主要功能包括以下部分
1.用户输入
接收用户输入的单词或词组,它们可能是精确的输入,也可能是存在拼写错误的单词或词组,如“department”和“deparmen”等。
仓嫗盤紲嘱珑詁鍬齊驁。
2.精确查询
在字典的索引文件中查找查看是否存在,如果存在,则去词库的译义文件中读取,并将结果输出给用户。
3.一般模糊查询
如果通过精确查找无法查出该单词/词组,这种可能是由于单词的单复数,动词过去式,现在分词的ing形式类等造成,因此一般模糊查询就是对以上形式的单词进行简单的处理,如去掉词尾的‘s’、‘d’等,然后再对处理之后的单词进行精确查询。
绽萬璉轆娛閬蛏鬮绾瀧。
4.基于最长公共子序列的模糊查询(以下简称lcs查询)
如果基于一般模糊查询仍无法查出,则使用lcs查询,该查询是基于全文的检索,找出与输入单词最为相近的单词,即与输入单词的最长公共子序列是在全文中的最大值的单词,并将其作为选择项输出给用户。
骁顾燁鶚巯瀆蕪領鲡赙。
5.机器学习的模块
开始时候,用户的使用记录为空。
在一次lcs查询之后,可以将lcs模糊查询的结果集记录起来,如果用户下一次查询的输入与lcs模糊查询的结果集记录有匹配项,则认为它们是一个有趣模式,并把其加入到有趣模式集中。
每一次模糊查询给用户输出的结果集都会与模式结果集中的结果进行匹配,如果找到,则把模式结果集中的匹配数据与模糊结果集,匹配数据优先放到结果集前,去除重复的项,生成最终结果集(决策),最后输出给用户。
瑣钋濺暧惲锟缟馭篩凉。
3.2业务流程设计
系统的业务流程如下:
图3.1业务流程图
是
3.3数据结构设计
3.3.1宏定义
宏定义
含义
#defineWORDCOUNT59372
词库中单词的个数
#defineWORDLEN24
单词的最大长度
#defineError(msg){perror(msg);eXit
(1);}
出错处理
#definePRENUM5
对于每个用户输入可以提取的有效模式的最大个数
3.3.2结构体
1.单词索引记录
typedefstruct{
charword[WORDLEN];
intoffset;
intlength;
}Node;
其中word表示单词,offset是该单词在词库文件中的索引,length是该单词的释义的长度
2.用户的偏好记录
typedefstruct{
charword[WORDLEN];
intcount;
}Preference;
其中word表示用户偏好的单词,count是该单词的的支持度计数,即在用户的输入中该单词被选中的频数。
鎦诗涇艳损楼紲鯗餳類。
3.模式记录集
typedefstruct{
charinput[WORDLEN];//用户输入的单词
Preferencepres[MAXPRES];//最多记录5个偏好
}Record;
其中input是用户的非精确单词,pres是该单词对应的用户偏好单词数组,最多5个记录。
3.3.3文件
1.单词的索引文件star.ndx
存放的是一个个Node类型的数据,每个单词/词组都有一个对应的Node,这些数据按照单词的英文次序升序排列,因此在查找单词时可使用二分查找快速检索。
栉缏歐锄棗鈕种鵑瑶锬。
2.词库文件star.dict
存放单词的释义
3.用户输入记录文件search.dat
存放用户输入的非精确单词,及该单词对应的lcs模糊查询结果集
4.模式记录文件record.dat
存放的是有趣模式记录,这些记录也是按用户的输入非精确单词升序排序,这样方便在进行记录查找时使用二分查找,快速的查询某一记录是否存在,在记录的内部是按照模式的有效次数降序按序的。
辔烨棟剛殓攬瑤丽阄应。
4实施应用
4.1开发环境
4.1.1硬件平台
CPU:
i5-4200h2.8GHz;
内存:
256MB及以上。
4.1.2软件平台
操作系统:
Windows虚拟机VMware10.0下的ubuntulinux。
开发工具:
gcc,vim
4.2开发环境的搭建和配置
1.安装vim
在linux终端输入 sudoapt-getinstallvim-gtk,然后输入root用户密码等待完成vim工具的安装峴扬斕滾澗辐滠兴渙藺。
2.vim的基本配置
在linux终端输入vi~/.vimrc按如下方式配置
setnu
setts=4
setsw=4
setcindent
setautoident
3.环境变量的设置
在终端输入vi~/.bashrc
添加以下行:
exportPATH="$PATH:
./"
保存之后在命令行输入source.bashrc
4.3编写代码
4.3.1最长公共子序列长度核心代码
intLCS(char*a,char*b)
{
intn,m,i,j;
intflag=0;
n=strlen(a)-1;
m=strlen(b)-1;
intL[100][100]={0};
for(i=0;i<=n;i++)
{
if(flag||(a[i]==b[0]))
{
L[i][0]=1;
flag=1;
}
elseL[i][0]=0;
}
flag=0;
for(j=0;j<=m;j++)
{
if(flag||(a[0]==b[j]))
{
L[0][j]=1;
flag=1;
}
elseL[0][j]=0;
}
//chara[100],b[100];
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
if(a[i]==b[j])
L[i][j]=L[i-1][j-1]+1;
elseif(L[i][j-1]>=L[i-1][j])
L[i][j]=L[i][j-1];
else
L[i][j]=L[i-1][j];
}
returnL[n][m];
}
4.3.2机器学习模型的c语言实现
1.在learn.h中的定义
#ifndef_LEARN_H
#define_LEARN_H
#include"dict.h"
#include
#include
#include
#defineMAXPRES5//用户偏好的最大个数
#defineWORDLEN24//单词最大长度
#definePRENUM5//有效模式的个数
typedefstruct{
charword[WORDLEN];//用户偏好
intcount;//次数
}Preference;
typedefstruct{
charinput[WORDLEN];//用户选择项
Preferencepres[MAXPRES];//最多记录5个偏好
}Record;
//intRecordsize=sizeof(Record);//一个记录的大小
voidRecordData(char*word,Node*nodes);
voidNewRecord(char*word,char*match_word);
voidAnalyse(char*word);
voidSolution(char*newData,Node*nodes);
voidDecision(Node*dst_node,Node*src_node);
//用于快速查找查询记录或对记录快排
intRecordcmp(constvoid*dst,constvoid*src);
intPrescmp(constvoid*dst,constvoid*src);
#endif
主要函数解释:
RecordData:
用于记录用户每次输入的非精确单词及其使用lcs模糊查询得到的结果集。
Analyse:
分析用户的输入和lcs模糊结果集间的关系,提取有趣模式。
NewRecord:
记录有趣模式。
Solution:
提取与用户输入的非精确单词相关的模式记录。
Decision:
根据历史模式记录,生成最终的决策方案。
2.在learn.c中主要函数的实现
voidRecordData(char*word,Node*nodes)
{//word代表用户的输入,nodes是模糊查询的结果集
FILE*fd=fopen("./search.dat","w+b");//打开并清空上一次的结果
if(!
fd)
return;
intnode_len=0;
intlen=strlen(word);
fwrite(&len,sizeof(int),1,fd);
fwrite(word,1,len,fd);
while(strlen(nodes[node_len].word)>0)
node_len++;
fwrite(&node_len,sizeof(int),1,fd);
fwrite(nodes,sizeof(Node),node_len,fd);
fclose(fd);
}
intRecordcmp(constvoid*dst,constvoid*src)
{
Record*d=(Record*)dst;
Record*s=(Record*)src;
returnstrcmp(d->input,s->input);
}
//对用户偏好按降序排序
intPrescmp(constvoid*dst,constvoid*src)
{
Preference*d=(Preference*)dst;
Preference*s=(Preference*)src;
return(d->count)<(s->count);
}
voidNewRecord(char*word,char*match_word)
{
FILE*fd=fopen("./record.dat","a+b");
if(!
fd)
return;
intRecordCount=0;;
Record*matched=NULL;
charch;
fseek(fd,0,SEEK_SET);
fread(&ch,1,1,fd);
if(ch==EOF)//即初始状态,空文件
{
RecordCount=1;
fseek(fd,0,SEEK_SET);
fwrite(&RecordCount,sizeof(int),1,fd);
RecordnewRcd={0};
strcpy(newRcd.input,word);
strcpy(newRcd.pres[0].word,match_word);
newRcd.pres[0].count=1;
fwrite(&newRcd,sizeof(Record),1,fd);
//checkthefirstrecord
fclose(fd);
return;
}
else{
fseek(fd,0,SEEK_SET);
fread(&RecordCount,sizeof(int),1,fd);
Record*records=(Record*)malloc((RecordCount+1)*Recordsize);詩叁撻訥烬忧毀厉鋨骜。
fread(records,Recordsize,RecordCount,fd);
fclose(fd);
//a+模式从文件头读,从文件尾写
matched=(Record*)bsearch(word,records,RecordCount,Recordsize,Recordcmp);则鯤愜韋瘓賈晖园栋泷。
//是已有记录
if(matched!
=NULL)
{
intnum=0,i;//用于标识是否找到
while(strlen(matched->pres[num].word)>0)
num++;//计算当前用户偏好的数目
for(i=0;i{
if(!
strcmp(match_word,matched->pres[i].word))
{
matched->pres[i].count++;
qsort(matched->pres,num,sizeof(Preference),Prescmp);胀鏝彈奥秘孫戶孪钇賻。
break;
}
}
if(!
(i{
PreferencenewPre={0};
strcpy(newPre.word,match_word);
newPre.count=1;
if(imatched->pres[i]=newPre;
elsematched->pres[i-1]=newPre;
}
}
//新记录
else{
RecordCount++;
RecordnewRcd={0};
strcpy(newRcd.input,word);
strcpy(newRcd.pres[0].word,match_word);
newRcd.pres[0].count=1;
records[RecordCount-1]=newRcd;
//对record数组重新排序
qsort(records,RecordCount,sizeof(Record),Recordcmp);鳃躋峽祷紉诵帮废掃減。
}
//写回记录文件
FILE*fw=fopen("./record.dat","r+b");
fseek(fw,0,SEEK_SET);