建立词索引表
Posted helenandyoyo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了建立词索引表相关的知识,希望对你有一定的参考价值。
#include<iostream>
#include<fstream>
#include<string>
#include<ctype.h>
#include"HString.h"
#include"LinkList.h"
using namespace std;
#define MaxBookNum 6 //假设只对6本书建立索引表
#define MaxKeyNum 30 //索引表的最大容量
#define MaxLineLen 30 //书目串的最大长度
#define MaxWordNum 10 //词表的最大容量
#define MaxWordLen 30 //关键词的最大长度
typedef struct
string *item[MaxWordNum];//字符串
int last;//词表的长度
WordListType; // 词表的类型(顺序表)
typedef struct
HString key;//关键词
LinkList bnolist;//存放书号索引的链表
IdxTermType; //索引项类型
typedef struct
IdxTermType item[MaxKeyNum+1];
int last;
IdxListType; //索引表类型(有序表)
string buf;//书目串缓冲区
int BookNo[3];//数组存放书号
WordListType wdlist;//词表
string str[9]="a","an","of","to","and","the","if","many","more";//常用词表
class IdxlistOperation
public:
//建立一个书目文件
void BookFile(void);
//初始化操作,置索引表为idxlist为空表,且在idxlist[0]设一空串
void InitIdxList(IdxListType &idxlist);
//从文件f读入一个书目信息到书目缓冲区buf
void GetLine(ifstream &infile);
//从buf中提取书名关键词到词表wdlist,书号存入bno
void ExtractKeyWord(int *bno);
//将书号为BookNo[3]的书名关键词按词典顺序插入索引表idxlist
Status InsIdxList(IdxListType &idxlist,int *bno);
//将生成的索引表输出到文件g
void PutText(ofstream &outfile,IdxListType idxlist);
;//IdxlistOperation
void IdxlistOperation::BookFile(void)//建立书目文件
string book;
ofstream outfile("BookInfo.dat",ios::out);//打开文件“BookInfo”
if(!outfile)
cerr<<"open error"<<endl;
exit(1);
//if
for(int i=0;i<MaxBookNum;i++)
getline(cin,book); //写入带空格的字符串
cout<<endl;
outfile<<book<<endl;
//for
outfile.close();//关闭文件
//BookFile
Status Init_HString(HString &S)
S.ch=new char[MaxWordLen];
for(int i=0;i<MaxWordLen;i++)
S.ch[i]='\\0';
S.length=0;
return ok;
//Init_HString
void IdxlistOperation::InitIdxList(IdxListType &idxlist)
int i;
for(i=0;i<MaxKeyNum;i++)
Init_HString(idxlist.item[i].key);
LOP.InitList(idxlist.item[0].bnolist);
idxlist.last=0;
//InitIdxList
void IdxlistOperation::GetLine(ifstream &infile)
getline(infile,buf);//读出带空格字符串
cout<<"buf: "<<buf<<endl;
//GetLine
bool IsKeyWord(string s)
int i=0;
while(i<9)
if(s!=str[i])//字符串比较大小
i++;
else
break;
//while
if(i>=9)
return true;//字符串s不在常用词表中
else
return false;
//IsKeyWord
Status InitWdList(WordListType &wdlist)//初始化关键词表
//DesWdList(wdlist);//销毁上一个关键词表
for(int i=0;i<MaxWordNum;i++)
wdlist.item[i]=new string[MaxWordLen];
//for
wdlist.last=0;
return ok;
//InitWdList
void IdxlistOperation::ExtractKeyWord(int *bno)
unsigned int i=0;
while(i<buf.length()&&buf[i]==' ')//跳过字符串buf开头的空格字符
i++;//while
while(isdigit(buf[i])&&i<buf.length())//判断字符是否为数字‘0-9’
*(bno++)=buf[i]-'0';//将buf中的书号存入到bno[3]中,字符型变整型
i++;
//while
while(i<buf.length()&&buf[i]==' ')//跳过buf中书号和关键字之间的空格字符
i++;//while
InitWdList(wdlist);//初始化关键词表
while(wdlist.last<MaxWordNum&&i<buf.length())//i<buf.length()防止i溢出
string chars;
unsigned int pos=i;
while(pos<buf.length())
if(isalpha(buf[pos])!=0)//当前字符为‘a’-‘z’或‘A’-‘Z’
if(isupper(buf[pos]))//若是大写字母
buf[i]=tolower(buf[i]);//将大写字母转换成小写英文字母
pos++;
//if
else
break;
//if
if(pos-i>0)//连续的英文字符串长度大于0
chars.assign(buf,i,pos-i);//用buf中刚才遍历的英文字符串替换chars
if(IsKeyWord(chars))//字符串chars是关键词
*wdlist.item[wdlist.last]=chars;//将buf中提取的关键词插入到关键词表wdlist中
wdlist.last++;
//if
//for
i=pos+1;//此时pos为空格字符,于是i赋值为pos位置的后一个字符,跳过空字符进行下一轮循环
//while
//ExtractKeyWord
void GetWord(int i,HString &wd)//用wd返回词表wdlist中的第i个关键词
unsigned int j;
char str[30],*p=str;
string s=*wdlist.item[i-1];
for(j=0;j<s.length();j++)//将string类型转换成char型以匹配HString型
str[j]=s[j];
str[j]='\\0';//字符串结束的标志
SOP.StrAssign(wd,p,j);//生成关键字字符串,长度j不包括‘\\0’
//GetWord
int Locate(IdxListType idxlist,HString wd,bool &b)
//在索引表idxlist中查询是否存在与wd相等的关键词。若存在,则返回其在索引表中
//的位置,且b去true值,否则返回插入位置,且b取false值
int i,m;
//索引表从后向前依次进行比较
for(i=idxlist.last-1;(m=SOP.StrCompare(idxlist.item[i].key,wd))>0;i--);
if(m==0)//索引表中存在与wd相等的关键词
b=true; return i;//if
else//当前遍历的索引表中的关键词小于wd
b=false; return (i+1);
//else
//Locate
void InsertNewKey(IdxListType &idxlist,int i,HString wd)
//在索引表idxlist的第i项上插入新关键词wd,并初始化书号索引的链表为空表
int j;
for(j=idxlist.last-1;j>=i;--j)//后移索引项
idxlist.item[j+1].key=idxlist.item[j].key;//将关键字后移,此时j+1的ch指针指向j的ch指针指向的内存
idxlist.item[j+1].bnolist=idxlist.item[j].bnolist;//将索引书号后移,j+1的head与j的head相同
//for
LOP.InitList(idxlist.item[i].bnolist);//赋值导致前后内存空间一致,因此要对当前内容进行内存的重分配
Init_HString(idxlist.item[i].key);//同理,链表前后内存空间一致,对当前链表重分配内存
SOP.StrCopy(idxlist.item[i].key,wd);//赋串值
idxlist.last++;
//InsertNewKey
Status InsertBook(IdxListType &idxlist,int i,ElemType bno[3])
//在索引表中idxlist的第i项中插入书号为BookNo[3]的索引
Link p=NULL;
if(!LOP.MakeNode(p,bno))
cout<<"分配失败"<<endl;
return (-1);
//if
LOP.Append(idxlist.item[i].bnolist,p);//插入新的书号索引
return ok;
//InsertBook
Status IdxlistOperation::InsIdxList(IdxListType &idxlist,int *bno)
int i,j;
bool b;
HString wd;
wd.ch=NULL;wd.length=0;
for(i=1;i<=wdlist.last;i++)
GetWord(i,wd);//取出关键词表中的关键词
j=Locate(idxlist,wd,b);//判断关键词是否在索引表中
if(!b)
InsertNewKey(idxlist,j,wd);//不在则插入新的索引项
InsertBook(idxlist,j,bno);//插入书号索引
//for
return ok;
//InsIdxList
Status DesIdxList(IdxListType &idxlist)//销毁关键词索引表
for(int i=0;i<idxlist.last;i++)
delete idxlist.item[i].key.ch; idxlist.item[i].key.ch=NULL;
LOP.DestroyList(idxlist.item[i].bnolist);
//for
return ok;
//DesIdxList
void IdxlistOperation::PutText(ofstream &outfile,IdxListType idxlist)
int i;
for(i=0;i<idxlist.last;i++)
outfile.width(16);outfile.setf(ios::left);//规定key的域宽及左对齐
outfile<<idxlist.item[i].key.ch<<" ";
Link p=idxlist.item[i].bnolist.head->next;//书号链表的第一个结点
while(p)
for(int j=0;j<3;j++)
outfile<<p->data[j];//输出关键字对应的索引书号
outfile<<" ";
p=p->next;
//while
outfile<<endl;
//for
//PutText
void main()
IdxlistOperation IOP;
IdxListType idxlist;
//IOP.BookFile();
ifstream infile("BookInfo.dat",ios::in);
if(!infile)
cerr<<"open error"<<endl;
exit(-1);
//if
ofstream outfile("BookIdx.dat",ios::out);
if(!outfile)
cerr<<"opern error"<<endl;
exit(-1);
//if
if(outfile)
IOP.InitIdxList(idxlist);
while(infile)
IOP.GetLine(infile);
if(buf.length())
IOP.ExtractKeyWord(BookNo);
IOP.InsIdxList(idxlist,BookNo);
//if
//while
IOP.PutText(outfile,idxlist);
outfile.close();
//if
infile.close();
DesIdxList(idxlist);
//main
头文件#include"HString.h"
#include"LinkList.h"根据以下文件进行适当修改而成: http://blog.csdn.net/u014033518/article/details/38041503
http://blog.csdn.net/u014033518/article/details/38371343
以上是关于建立词索引表的主要内容,如果未能解决你的问题,请参考以下文章
机器学习入门-文本数据-构造词频词袋模型 1.re.sub(进行字符串的替换) 2.nltk.corpus.stopwords.words(获得停用词表) 3.nltk.WordPunctToke