簡單的關鍵詞查找實驗(基于C語言)
準備
書名數據庫的陣列表示
| 關鍵字 |
|
||||||
| B1 | B2 | B3 | B4 | B5 | B6 | B7 | |
| algebra | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
| application | 1 | 0 | 1 | 1 | 1 | 1 | 0 |
| elementary | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
| linear | 1 | 1 | 1 | 1 | 1 | 0 | 0 |
| matrix | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
| theory | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
- B1. Applied Linear Algebra
- B2. Elementary Linear Algebra
- B3. Elementary Linear Algebra with Applications
- B4. Linear Algebra and Its Applications
- B5. Linear Algebra with Applications
- B6. Matrix Algebra with Applications
- B7. Matrix Theory
編寫代碼
- 原本是準備了500本txt小說作為數據庫書目的,如果這樣就得自己在確定關鍵詞,和把這500本小說名通過關鍵詞組成一個數據庫陣列,而且對于中文來說,還得考慮編碼問題和文件操作問題,真要這樣,從我個人能力來估計,費老大功夫還不一定實現,所以干脆簡單點,直接照著線代書上的陣列抄了_。
- 關鍵詞庫
unsigned char *key_database[]={
"algebra",\
"application",\
"elementary",\
"linear",\
"matrix",\
"theory"
};
- 書目庫
unsigned char B1[]="Applied Linear Algebra";
unsigned char B2[]="Elementary Linear Algebra";
unsigned char B3[]="Elementary Linear Algebra with Applications";
unsigned char B4[]="Linear Algebra and Its Applications";
unsigned char B5[]="Linear Algebra with Applications";
unsigned char B6[]="Matrix Algebra with Applications";
unsigned char B7[]="Matrix Theory";
unsigned char *book_database[]={B1,B2,B3,B4,B5,B6,B7};
- 數據庫陣列
unsigned char database_matrix[7][6]={\
1,1,0,1,0,0,\
1,0,1,1,0,0,\
1,1,1,1,0,0,\
1,1,0,1,0,0,\
1,1,0,1,0,0,\
1,1,0,0,1,0,\
0,0,0,0,1,1
};
- 要做這個實驗之前,首先得確定數據庫陣列,行代表書名中包含的關鍵詞的向量,1表示包含,0表示不包含。而我們要做的就是把搜索向量與行向量比較,并且統計出現關鍵詞的次數,然后包含次數多的書靠前顯示。
- main.c
#include <stdio.h>
#include <stdlib.h>
#include "init_db.h" //初始化數據庫頭文件
#include <string.h>
#define CASE_SENSITIVE 0 //區分大小寫
#define CASE_INSENSITIVE 1 //不區分大小寫
void str_all_lowercase(unsigned char *str);//字符串小寫化函數
char str_cmp_sensitive(unsigned char str1[],unsigned char str2[],unsigned char options);//可選區分比較字符串函數
void keywords_to_vector(char argc,char *argv[],unsigned char *key_vector);//關鍵詞轉搜索向量函數
void search_database(unsigned char key_vector[],unsigned char res_vector[]);//搜索數據庫函數
void sort_search_res(unsigned char res_vector[],unsigned char sort_res_vector[]);//排列搜索結果函數
void main(int argc,char *argv[]){//參數:搜索關鍵詞
char book_count=0,i,j;
unsigned char key_vector[KEYWORD_NUM]={0};//關鍵詞向量->搜索向量
unsigned char res_vector[BOOK_NUM]={0};//結果向量
unsigned char sort_res_vector[BOOK_NUM]={0};//排序的位置向量
if(argc>=2){
keywords_to_vector(argc,argv,key_vector);//獲取搜索向量
search_database(key_vector,res_vector);//得到結果向量
for(i=0;i<BOOK_NUM;i++) sort_res_vector[i]=i;//生成位置向量
sort_search_res(res_vector,sort_res_vector);//對結果向量進行排序,使得符合搜索的書名靠前
for(i=0;i<BOOK_NUM;i++){
if(res_vector[i]!=0){
book_count++;
printf("book%d:%s---%d\n",i+1,book_database[sort_res_vector[i]],res_vector[i]);
}
}
printf("%d books found in total\n",book_count);
}
else{
printf("no arguments\n");
}
}
- 關鍵詞轉搜索向量函數
void keywords_to_vector(char argc,char *argv[],unsigned char *key_vector){
char *tmp,i,j;
for(i=1;i<argc;i++){
tmp=argv[i];
for(j=0;j<KEYWORD_NUM;j++){
key_vector[j]=((0==str_cmp_sensitive(tmp,key_database[j],1))?1:key_vector[j]);
}
}
}
- 搜索數據庫函數
void search_database(unsigned char key_vector[],unsigned char res_vector[]){
unsigned char i,j;
unsigned char *tmp;
for(i=0;i<BOOK_NUM;i++){
tmp=database_matrix[i];
for(j=0;j<KEYWORD_NUM;j++){
res_vector[i]+=((tmp[j]==key_vector[j])?tmp[j]:0);
}
}
}
- 排列搜索結果函數
void sort_search_res(unsigned char res_vector[],unsigned char sort_res_vector[]){
unsigned char i,j,tmp;
for(i=0;i<BOOK_NUM;i++){
for(j=BOOK_NUM-1;j>i;j--){
if(res_vector[j]>res_vector[j-1]){
tmp=res_vector[j-1];
res_vector[j-1]=res_vector[j];
res_vector[j]=tmp;
tmp=sort_res_vector[j-1];
sort_res_vector[j-1]=sort_res_vector[j];
sort_res_vector[j]=tmp;
}
}
}
}
調試過程
-
低級錯誤
?在函數str_all_lowercase中有兩處低級錯誤一個是數組的位移變量i沒有做++操作導致死循環在那里,然后在判斷是否大寫的時候用的是邏輯或||運算,而正確的是邏輯與&&運算。 -
邏輯錯誤
?在函數keywords_to_vector中的
key_vector[j]=((0==str_cmp_sensitive(tmp,key_database[j],1))?1:key_vector[j]);這里
原本我是這樣寫的
key_vector[j]=((0==str_cmp_sensitive(tmp,key_database[j],1))?1:0;
這就導致把我每一次對比關鍵詞的時候都會破壞上一次比較的結果,所以把0改為key_vector[j]后就可以保持上一次結果不變。
?在函數search_database中的
res_vector[i]+=((tmp[j]==key_vector[j])?tmp[j]:0);
原本我是這樣寫的
res_vector[i]+=((tmp[j]==key_vector[j])?1:0);
這就導致只要我的搜索向量和數據庫陣列比較結果一致時就會在結果向量上加一,這就導致同為0時,即書名不包含的關鍵詞,同時搜索向量也不包含時,結果向量還要加1,所以最后把1改為tmp[j],即可當同時不包含關鍵詞時結果向量加的是0。
運行結果

小結
?其實這樣的實驗老早就想要做了,我說這樣的實驗是指,把數學應用通過編程的手段來表達的實驗,或者更深一層次,我想用編程來學習數學,像是線代,微積分這些。老實說,我數學真的是垃圾,匆匆20+年,感覺連門把手都夠不著,很急,非常急,急出心理變態了,急出生理病變了,老子tmd什么時候能進入數學的殿堂,什么時候能tmd玩弄數學于股掌之間,tmd什么時候能會應用數學啊,啊啊啊。我現在只能另辟蹊徑,尋找一些應用的機會,除了這樣,我無計可施,因為我無法面對深奧的書本,無法面對難懂的公式,更無法面對亂入的定理和結論。我也想造原子彈,我也想玩加速器,我也tmd想搞量子力學和人工智能,還tmd想如果給關二爺上香有用的話,那我鐵定天天給畢達哥拉斯磕頭,我甚至還tmd想長生不老,能讓我等到打一針就能智商300的藥,夢一場就能貫通古今的覺,如果有人做這樣的實驗,請立即叫上我,我也這能通過這種方式了,真卑微啊,這樣一想我還真是一個徹徹底底的,真真切切的變態啊,哎,艸了,就當是一個渣人的本愿吧。
本文來自博客園,作者:pie_thn,轉載請注明原文鏈接:http://www.rzrgm.cn/pie-o/p/16461644.html

浙公網安備 33010602011771號