中文信息处理实验报告一Word格式.docx
- 文档编号:16672215
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:12
- 大小:18.33KB
中文信息处理实验报告一Word格式.docx
《中文信息处理实验报告一Word格式.docx》由会员分享,可在线阅读,更多相关《中文信息处理实验报告一Word格式.docx(12页珍藏版)》请在冰豆网上搜索。
学号
一、实验目的
1.了解中文分词意义;
2.实现机器自动分词;
3.掌握中文分词的基本方法。
二.实验环境
Windows7操作系统
JDK1.6与Eclipse
VC++6.0
二、实验内容与步骤
基于统计的分词方法一般认为,词典的逆向匹配法要优于正向匹配法。
根据词典逆向最大匹配法,基本步骤:
1、将词典的每个词条读入内存,最长是4字词,最短是1字词;
2、从语料中读入一段(一行)文字,保存为字符串;
3、如果字符串长度大于4个中文字符,则取字符串最右边的4个中文字符,作为候选词;
否则取出整个字符串作为候选词;
4、在词典中查找这个候选词,如果查找失败,则去掉这个候选词的最左字,重复这步进行查找,直到候选词为1个中文字符;
5、将候选词从字符串中取出、删除,回到第3步直到字符串为空;
6、回到第2步直到语料已读完。
三、实验过程与分析
(一)机械分词方法
1.正向最大匹配算法
packagecom;
importjava.util.ArrayList;
importjava.util.List;
publicclassSegmentation1{
privateList<
String>
dictionary=newArrayList<
();
privateStringrequest="
北京大学生前来应聘"
;
publicvoidsetDictionary(){
dictionary.add("
北京"
);
北京大学"
大学"
大学生"
生前"
前来"
应聘"
}
publicStringleftMax(){
Stringresponse="
"
Strings="
for(inti=0;
i<
request.length();
i++){
s+=request.charAt(i);
if(isIn(s,dictionary)&
&
aheadCount(s,dictionary)==1){
response+=(s+"
/"
s="
}elseif(aheadCount(s,dictionary)>
0){
}else{
returnresponse;
privatebooleanisIn(Strings,List<
list){
for(inti=0;
list.size();
if(s.equals(list.get(i)))returntrue;
returnfalse;
privateintaheadCount(Strings,List<
intcount=0;
if((s.length()<
=list.get(i).length())&
(s.equals(list.get(i).substring(0,s.length()))))count++;
returncount;
publicstaticvoidmain(String[]args){
Segmentation1seg=newSegmentation1();
seg.setDictionary();
Stringresponse1=seg.leftMax();
System.out.println(response1);
2.逆向最大匹配算法
<
PREclass=javaname="
code"
snippet_file_name="
blog_20140507_2_819878"
code_snippet_id="
331438"
>
privateList<
privateStringrequest="
}
publicStringrightMax(){
for(inti=request.length()-1;
i>
=0;
i--){
s=request.charAt(i)+s;
tailCount(s,dictionary)==1){
response=(s+"
)+response;
}elseif(tailCount(s,dictionary)>
privateinttailCount(Strings,List<
if((s.length()<
=list.get(i).length())&
(s.equals(list.get(i).substring(list.get(i).length()-s.length(),list.get(i).length()))))count++;
publicstaticvoidmain(String[]args){
seg.setDictionary();
Stringresponse2=seg.rightMax();
System.out.println(response2);
}
(二)分词词典
#include<
string>
iostream>
fstream>
set>
vector>
usingnamespacestd;
#defineNL0x0A//newline
#defineCR0x0D//carrigereturn
#defineSP0x20//space
#defineGBK_HB_MIN0x80//minimumofgbkhighbyte
#defineDICT_PATH"
words.gbk.dict"
//字典路径
#defineTEXT_PATH"
sentence.txt"
//句子文本路径
/**
*加载词典
*@paramstringsDictPath字典路径
*@paramset<
oDict字典
*@paramintnMaxLen字典中的最长词的字节数
*/
voidLoadDictionary(conststring&
sDictPath,set<
oDict,int&
nMaxLen);
*采用基于词典的最大正向匹配分词
*@paramstringsSen需要分词的句子
字典
*@paramint字典中的最长词的字节数
*@paramvector<
分词后的结果
voidSegmentSentence(conststring&
sSen,constset<
oDict,intnMaxLen,vector<
vecWords);
intmain(intargc,char**argv){
set<
oDict;
intnMax=0;
LoadDictionary(DICT_PATH,oDict,nMax);
//获取句子
ifstreamoReader(TEXT_PATH);
if(!
oReader.is_open()){
cout<
"
Failtoopenfile:
<
TEXT_PATH;
stringsSen="
getline(oReader,sSen);
oReader.close();
OriginalSentence:
sSen<
endl;
/**
*采用正向最大匹配规则分词
vector<
vecSeg;
SegmentSentence(sSen,oDict,nMax,vecSeg);
//输出分词结果
Segment:
for(vector<
:
const_iteratorcItr=vecSeg.begin();
cItr!
=vecSeg.end();
++cItr){
*cItr<
return0;
}
oDict,intnMaxWordLen,vector<
vecWords){
//遍历每一个字节(不是汉字)
for(string:
const_iteratorcItr=sSen.begin();
cItr<
sSen.end();
){
intnWordLen=(cItr+nMaxWordLen)<
=sSen.end()?
nMaxWordLen:
(sSen.end()-cItr);
while(nWordLen>
1){
stringsWord(cItr,cItr+nWordLen);
if(oDict.find(sWord)!
=oDict.end()){
//字典中找到此对象
vecWords.push_back(sWord);
break;
nWordLen-=1;
//这个地方可以根据GBK编码规则优化
//跟新当前索引
if(nWordLen==1&
GBK_HB_MIN<
=static_cast<
unsignedchar>
(*cItr)){
//添加当前的单个汉字,gbk由两个byte组成
vecWords.push_back(string(cItr,cItr+2));
cItr+=2;
}elseif(nWordLen==1&
GBK_HB_MIN>
static_cast<
//添加当前的ascii码
vecWords.push_back(string(1,*cItr));
cItr+=1;
cItr+=nWordLen;
nMaxWordLen){
//加载字典
ifstreamoReader(sDictPath.c_str());
DICT_PATH<
exit(0);
stringsLine;
nMaxWordLen=0;
while(getline(oReader,sLine)){
//cout<
CurrentLine:
sLine<
//debug
*字典的每一行格式为:
*IDSP词语SP频率
*
*只有两个空格(SP)之间的词语需要添加到本字典中
//达到第一个空格
intnSpOffset=0;
const_iteratorcItr=sLine.begin();
=sLine.end();
++cItr,++nSpOffset){
if(SP==*cItr){
//读取词语
stringsWord("
const_iteratorcItr=sLine.begin()+nSpOffset+1;
//遇到第二个空格,断开
sWord.append(1,*cItr);
if(GBK_HB_MIN<
//针对GBK编码特殊处理,避免截断词语
++cItr;
if(cItr!
=sLine.end()){
lineformaterror:
'
'
//将此与添加到字典中
if("
!
=sWord){
oDict.insert(sWord).second){
Wordconflict:
sWord<
//比较最长字长
if(nMaxWordLen<
sWord.size()){
nMaxWordLen=sWord.size();
}
五、实验总结
通过这次实验,我了解到实现机器自动分词,首先要建立高效准确的分词词典,需要有快速的字符串匹配算法,在实验过程中,遇到一些困难,比如由于汉语广泛的歧义性导致的消岐算法、因词典不完善造成部分词语分词错误、由于格式不同导致的无法判断等问题。
自动分词是中文自然语言处理的基础,是汉语所特有的课程,在中文信息处理技术中最基础、最重要的一个问题,在现实中已经得到广泛应用。
通过这个实验让我熟悉了分词程序的基本结果,了解了中文分词意义,实现机器自动分词并且掌握中文分词的基本方法。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 中文信息处理 实验 报告