关键词索引
1、从列有书号和书名的文件中将书号和书名提取出来
2、提取书名中的关键词
3、将关键词插入索引表,将具有相同关键词的书的书号和关键词放在一起
比如有这样4本书:
006 Harry Potter and the Sorcerer's Stone
007 Harry Potter and the Chamber of Secrets
008 Harry Potter and the Prisoner of Azkab
009 Harry Potter Harry and the Goblet of Fire
007 Harry Potter and the Chamber of Secrets
008 Harry Potter and the Prisoner of Azkab
009 Harry Potter Harry and the Goblet of Fire
将其做成关键词索引表:
azkab 008
chamber 007
fire 009
goblet 009
harry 006 007 008 009
potter 006 007 008 009
只按相对位置摘取了一部分关键词,实际上需要将所有关键词提取并按字母排列顺序做成索引表
书上的索引表是用顺序存储结构建立并使用的,但是在这里我用链式结构建立索引表再将链式表转化为顺序存储
这样在建立索引表插入关键词的时候比较方便,而且节省了因关键词数量的不确定而多分配的内存。
下面列出一些细节,完整的工程请到最后的链接下载
建立关键词表,单纯的提取英文单词,只需判断空白字符的位置
可以直接使用strstr()去找空格的位置,但由于英文单词的空白字符不能确定,为了安全还是一个一个检查空白字符
利用FLAG和*lprear可以判断是否遇到了新的单词的开头和结尾
#define KEYSIZE 25
#define KEYNUMBER 15
typedef struct {
char szKey[KEYNUMBER][KEYSIZE];
int nKeyCount;
}KEYLIST;
BOOL SetKeyList(KEYLIST * lpKeyList, char * lpBookName)
{
int i, FLAG;
int nkeysize;
char * lpfront;
char * lprear;
i = 0;
FLAG = 1;
lpfront = lprear = lpBookName;
while (*lprear)
{
if (isspace(*lprear) && FLAG) //遇到了单词的结尾
{
nkeysize = lprear - lpfront;
memcpy_s(lpKeyList->szKey[i], KEYSIZE, lpfront, nkeysize);
lpKeyList->szKey[i][nkeysize] = '\0';
if (!IsFrequentWord(lpKeyList->szKey[i]))
i++;
FLAG = 0;
}
if (!(isspace(*lprear) || FLAG)