自然语言理解.docx
- 文档编号:6952554
- 上传时间:2023-01-13
- 格式:DOCX
- 页数:18
- 大小:113.28KB
自然语言理解.docx
《自然语言理解.docx》由会员分享,可在线阅读,更多相关《自然语言理解.docx(18页珍藏版)》请在冰豆网上搜索。
自然语言理解
一分词概述
语言学中一般将“词”定义为“能够独立运用的,有意义的最小语法单元”。
自然语言中句子是由词组成的,而计算机要理解和处理自然语言就是从词这一步开始的。
汉语不同于西文,在一个汉语句子中,词与词之间没有明显的分隔符(如空格)。
此外,汉语的词法约束很不规范,而且千变万化,就给汉语分词带来了很大的麻烦。
正是由于汉语分词的困难及其在中文信息自动处理中的重要地位,自70年代末以来,许多人投入到了汉语自动分词的研究工作中来,也出现了好多具有应用前景的分词方法。
1.1汉语分词的歧义
汉语分词是汉语分析以及计算机处理汉语的一大难点,导致汉语分词精度不高的原因一般有:
词语(抑或说汉语分析基本单位)的界定、词典范围、分词中因为算法问题产生的歧义。
分词过程中歧义产生的根源可归结为以下三类:
(1)由自然语言的二义性所引起的歧义,称为第一类歧义。
如:
“乒乓球拍卖完了”可切分为“乒乓球/拍卖/完了”又可以切分为“乒乓球拍/卖/完了”。
这两种切分形式无论在语法上还是语义上都是正确的,就是人工分词也会产生歧义,只有结合上下文才能给出正确的切分。
(2)由机器自动分词产生的特有歧义,称为第二类歧义。
如:
“在这种环境下工作是太可怕了”用机器切分可以切分为“在/这种/环境/下工/作/是/太/可怕/了”也可以切分为,“在/这种/环境/下/工作/是/太/可怕/了”。
对本句来说,只有第二种切分是正确的,用人工分词是不可能产生歧义的,歧义是由于机器机械切分产生的。
(3)由于分词词典的大小而引起的歧义,称为第三种歧义。
如:
“王小二是一个农民”用机器切分被分为“王/小/二/是/一个/农民”,这里“王小二”是一个人名,在汉语中应是一个词,所以这个切分是错误的。
由于机器自动切分是依据分词词典进行的,故词典中没有的词,就不可能被正确切分,分词词典不可能也没有必要包括所有的词(如人名、地名),同时,词典中所包括的词越多,就会产生新的歧义。
例如“发展社会主义的新乡村”,新乡是一个地名,若词典中有该词,则“新乡村”是一个歧义字段。
因此,不论词典的大与小都可以产生歧义。
统计表明第一类歧义字段只占歧义字段总数的5%左右,剩下来的就都是第二类歧义字段和第三类歧义字段。
而对于第二类歧义,又主要有两种:
组合型歧义与交集型歧义。
其定义分别如下:
定义1:
汉字串AJB被称作交集型切分歧义,如果满足AJ、JB同时为词(A、J、B分。
此时汉字串J被称作交集串。
别为汉字串)
[例]交集型切分歧义:
“结合成”
a.结合│成
b.结│合成
其中A=“结”,J=“合”,B=“成”。
定义2:
汉字串AB被称作多义组合型切分歧义,如果满足A、B、AB同时为词。
[例]多义组合型切分歧义:
“起身”
a.他站│起│身│来。
b.他明天│起身│去北京。
1.2汉语分词方法
基本的分词方法:
最大匹配算法(MaximumMatchbasedapproach)
最大概率方法(ProbabilityapproachtoWordSegmentation)
基本分词算法就是单纯的没有经过添加规则或统计方法的最基本的分词方法。
它是其它分词方法的基础。
由于这类方法太过机械,得到的结果难以满足实际应用的要求的,于是就有在此基础上人工参与设计加入知识的方法。
基于规则的分词方法主要是在分词的过程中加入词法规则、语法规则甚至语义规则来提高分词的质量。
基于统计的分词方法主要是用在分词过程中出现的歧义现象的消歧。
基于统计的方法主要靠一个或多个语料库,该语料库一般都是训练语料库,规模虽然较小,但有一定的代表性。
该方法根据从语料库中的相关信息统计得到的数据(主要是词频和字间邻接关系)来指导分词,如:
对可能的分词结果根据统计得到正确性最大的分词结果。
1.3实验数据
1.词和对应的频率表,可以求出每个词出现的概率,用于最大概率法
2.人民日报 词性标注语料库
1.4本文方法
本文尝试采用了最大匹配法,最大概率法,HMM算法算法等来实现了对汉语的分词。
1.5开发环境
软件平台:
VisualC++6.0,运行环境为Windows7操作系统
硬件平台:
PC电脑
二实验思路和算法
2.1最大匹配算法
1)算法思路
对于一个输入的句子,我们从字符串的头部开始,找出最长的在语料库中出现过的词,将其作为一个词,将其切出来,然后再从剩下的部分中,重复这一过程,直至切出所有的词为止。
2)算法流程
其流程图如下图所示:
图1:
最大匹配算法流程
2.2最大概率算法
1)算法思路
对于一个句子S来说,有很多种的分词方式,然而最终输出的结果只能有一个,那么我们从中挑选哪一种输出呢。
当然选择概率最大的一个。
举例:
S:
有意见分歧
分词方式W1:
有意/见/分歧
分词方式W2:
有/意见/分歧
即求解:
,其中p(wn)为第n个词在语料库中出现的频率。
但是具体如何来实现最大概率方法,采用的动态规划算法,即Veterbi动态规划算法。
2)Veterbi动态规划算法实现最大概率算法
核心思想(动态方程):
每次读入一个字i,求解出截止到这个字为止,所能得到的最大概率P(0,i)。
而当读入到第K字时,只需求解出
时间复杂度为O(maxLen*N)
2.3总词数最少分词算法
1)算法思想
对于一个句子S来说,有很多种的分词方式,然而最终输出的结果只能有一个,那么我们从中挑选哪一种输出呢。
倾向于选择总词数最少的分词算法。
2)Veterbi动态规划算法实现总词数最少分词算法
核心思想(动态方程):
每次读入一个字i,求解出截止到这个字为止,所能得到的总词数最少分词minCount(0,i)。
而当读入到第K字时,只需求解出
时间复杂度为O(maxLen*N)
2.3HMM(隐马尔可夫模型)算法
1)算法思想
假定词性标注结果之间满足马尔科夫模型,并利用此辅助分词,完成分词的同时完成词性标注。
所以其思想就是对于一个句子S来说,有很多种的分词方式,然而最终输出的结果只能有一个,那么我们从中挑选哪一种输出呢。
倾向于选择最满足此法的分词算法,即具有最大符合词法之间关系的概率。
2)Veterbi动态规划算法实现隐马尔科夫模型算法
核心思想(动态方程):
每次读入一个字i,求解出截止到这个字为止,所能得到的最大符合词法之间关系的概率P(0,i)。
而当读入到第K字时,只需求解出
时间复杂度为O(maxLen*N)
三方法实现
3.1程序整体框架
每一种算法分别占据一个头文件,在wordSegment.cpp,既是信息中心,存储了所有包括语料库中提取的信息,也由此来调用所有的算法。
数据结构
//词语的数据结构
classWord
{
public:
staticintwordCount;
staticintinterCount;
public:
stringword;
doublefrequent;
Pos*pos;//partofspeechIndex;
Word()
{
pos=newPos();
}
};
//词性的数据结构
classPos
{
public:
staticintposCount;
public:
stringpos;
intposIndex;
Pos()
{
posIndex=0;
pos="";
}
};
map
map
double*p[50];//存储词性与词性之间转换的马尔科夫转移矩阵
Pos**poses;//存储所有的词性
Word**words;//存储所有的词语
3.2最大匹配算法
实现了正向最大匹配算法和逆向最大匹配算法。
//正向最大匹配算法
boolWordSegmentUsingMM(conststring&s1,string&s2,map
{
intcnt=0;
s2="";
while(cnt { for(intj=MAXLENINAWORD*2;j>0;j-=2) { strings=s1.substr(cnt,j); map : iteratoriter; iter=mapStringAndInt.find(s); if(iter! =mapStringAndInt.end()) { cnt=cnt+j; s2+=(s+"/"); break; } } if(j==0) returnfalse; } returntrue; } //逆向最大匹配算法 boolWordSegmentUsingRMM(conststring&s1,string&s2,map { intcnt=s1.length(); s2=""; while(cnt>0) { for(intj=MAXLENINAWORD*2;j>0;j-=2) { strings; if(cnt>=j) s=s1.substr(cnt-j,j); else s=s1.substr(0,cnt); map : iteratoriter; iter=mapStringAndInt.find(s); if(iter! =mapStringAndInt.end()) { cnt=cnt-j; s2.insert(0,(s+"/")); break; } } if(j==0) returnfalse; } returntrue; } 3.3最大概率算法 //最大概率算法 boolWordSegmentUsingMP(conststring&s1,string&s2,map { constintMAXLEN=200; constintMAXWORDLEN=8; stringss[MAXLEN];//截止到第i个位置,切分的词 doublep[MAXLEN]; intcnt=0; inti,j; //Step1.初始化 for(i=0;i { p[i]=0; } //Step2. for(i=0;i { intindex=-1; for(j=(i i: MAXWORDLEN);j>=0;j-=2) { strings=s1.substr(i-j,j+2); map : iteratoriter; iter=mapStringAndInt.find(s); if(iter! =mapStringAndInt.end()) { if(i==j) { //只取概率最大的那一位 if(words[iter->second]->frequent>p[i]) { ss[i]=words[iter->second]->word; p[i]=words[iter->second]->frequent; } } else { if(! ss[i-j-2].empty()) { //只取概率最大的那位 doublefreq=p[i-j-2]*words[iter->second]->frequent; if(freq>p[i]) { ss[i]=ss[i-j-2]+"/"+s; p[i]=p[i-j-2]*words[iter->second]->frequent; } } } } } } s2=ss[s1.length()-2]; returntrue; } 3.4总词数最少分词算法 //总词数最少分词算法 boolWordSegmentUsingMinWordNum(conststring&s1,string&s2,map { if(s1==""//s1.empty()) { s2=""; returntrue; } constintMAXLEN=200; constintMAXWORDLEN=8; stringss[MAXLEN];//截止到第i个位置,切分的词 intcount[MAXLEN];//截止到第i个位置,切分的词的数目 inti,j; //Step1.初始化 for(i=0;i { count[i]=MAXLEN; } //Step2. for(i=0;i { intindex=-1; for(j=(i i: MAXWORDLEN);j>=0;j-=2) { strings=s1.substr(i-j,j+2); map : iteratoriter; iter=mapStringAndInt.find(s); if(iter! =mapStringAndInt.end()) { if(i==j) { ss[i]=words[iter->second]->word; count[i]=1; } else { if(! ss[i-j-2].empty()) { //只取概率最大的那位 intc=count[i-j-2]+1; if(c { ss[i]=ss[i-j-2]+"/"+s; count[i]=c; } } } } } } s2=ss[s1.length()-2]; returntrue; } 3.5HMM算法 预处理阶段: //step1初始化Pos poses=InitPos(mapPosAndInt); //step2初始化Word words=InitWord(mapWordAndInt); //step3初始化单词词性 InitWordPos(mapPosAndInt,poses,mapWordAndInt,words); //Step4.训练马尔科夫模型 TrainHMM(poses,p,mapPosAndInt); 核心算法: boolWordSegmentUsingHMM(conststring&s1,string&s2,map { if(s1==""//s1.empty()) { s2=""; returntrue; } constintMAXLEN=200; constintMAXWORDLEN=8; stringss[MAXLEN];//截止到第i个位置,切分的词 doublepp[MAXLEN];//截止到第i个位置,切分的词根据马尔科夫模型最大概率值 intposIndex[MAXLEN];//截止到第i个位置,切分的词根据马尔科夫模型取得最大概率值时的词性 inti,j; //Step1.初始化 for(i=0;i { pp[i]=0; } intstartPosIndex=mapPosAndInt["w"]; intcurPosIndex; //Step2. for(i=0;i { for(j=(i i: MAXWORDLEN);j>=0;j-=2) { strings=s1.substr(i-j,j+2); map : iteratoriter; iter=mapWordAndInt.find(s); //查找单词,如果找到了该单词 if(iter! =mapWordAndInt.end()) { //获得该单词的词性 curPosIndex=words[iter->second]->pos->posIndex; if(curPosIndex==-1) curPosIndex=Pos: : posCount; //如果该单词是第一个单词,初始化 if(i==j) { //初始化单词,初始概率 ss[i]=words[iter->second]->word; pp[i]=p[startPosIndex][curPosIndex]; posIndex[i]=curPosIndex; } //如果不是第一个单词,采用动态规划进行处理 else { if(! ss[i-j-2].empty()) { //只取概率最大的那位 doubleprob=p[posIndex[i-j-2]][curPosIndex]*pp[i-j-2]; if(prob>pp[i]) { ss[i]=ss[i-j-2]+"/"+s; pp[i]=prob; posIndex[i]=curPosIndex; } } } } /* else//如果没有找到这个单词 { curPosIndex=Pos: : posCount; //如果该单词是第一个单词,初始化 if(i==j) { //初始化单词,初始概率 ss[i]=words[iter->second]->word; pp[i]=p[startPosIndex][curPosIndex]; posIndex[i]=curPosIndex; } //如果不是第一个单词,采用动态规划进行处理 else { if(! ss[i-j-2].empty()) { //只取概率最大的那位 doubleprob=p[posIndex[i-j-2]][curPosIndex]*pp[i-j-2]; if(prob>pp[i-j-2]) { ss[i]=ss[i-j-2]+"/"+s; pp[i]=prob; posIndex[i]=curPosIndex; } } } } */ } } s2=ss[s1.length()-2]; returntrue; } 四实验结果与分析 4.1测试文档: 央视对搜索引擎下手已经不是第一次了。 上一次抓的是在互联网上具有同样影响力的搜索引擎XX,其“罪名”是竞价排名。 与XX相比,谷歌的“网页快照”功能要逊色不少,而且,随着政府对不良信息网站的打击力度日益加大,淫秽色情内容更多的是出现在搜索结果的“网页快照”而不是能够点开的网页中。 可是,为什么央视对危害同样严重甚至更为严重的XX视而不见,却对谷歌的批判如此不遗余力呢? 联想到就在央视曝光XX竞价排名事件后不久,XX就迅速“改邪归正”,堂而皇之地成为了央视广告的座上宾,我们是不是可以期待,未来某天,谷歌同样也会被央视广告成功“招安”呢? 4.2结果文档: 采用正向最大匹配算法: 央视/对/搜索引擎/下手/已经/不/是/第一/次/了/。 上/一/次/抓/的/是/在/互联网/上/具有/同样/影响力/的/搜索引擎/百/度/,其/“罪名/”是/竞价/排名/。 与/百/度/相比/,谷/歌/的/“网页/快照/”功能/要/逊色/不少/,而且/,随着/政府/对/不良/信息网/站/的/打击/力度/日益/加大/,秽淫/色情/内容/更/多/的/是/出现/在/搜索/结果/的/“网页/快照/”而/不/是/能够/点/开/的/网页/中/。 可是/,为什么/央视/对/危害/同样/严重/甚至/更为/严重/的/百/度/视而不见/,却/对/谷/歌/的/批判/如此/不遗余力/呢/? 联想/到/就/在/央视/曝光/百/度/竞价/排名/事件/后/不久/,百/度/就/迅速/“改邪归正/”,堂而皇之/地/成为/了/央视/广告/的/座上宾/,我们/是/不/是/可以/期待/,未来/某/天/,谷/歌/同样/也/会/被/央视/广告/成功/“招安/”呢/ 采用逆向最大匹配算法: 央视/对/搜索引擎/下手/已经/不/是/第一/次/了/。 上/一/次/抓/的/是/在/互联/网上/具有/同样/影响力/的/搜索引擎/百/度/,其/“罪名/”是/竞价/排名/。 与/百/度/相比/,谷/歌/的/“网页/快照/”功能/要/逊色/不少/,而且/,随着/政府/对/不良/信息
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 自然语言 理解