建立词索引表

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



以上是关于建立词索引表的主要内容,如果未能解决你的问题,请参考以下文章

图书管理系统

文本预处理

sqlserver怎么建立索引

ElasticSearch 倒排索引

机器学习入门-文本数据-构造词频词袋模型 1.re.sub(进行字符串的替换) 2.nltk.corpus.stopwords.words(获得停用词表) 3.nltk.WordPunctToke

08顶会热词统计-补