實現一種簡單原始的檔案相似度計算,即以兩檔案的公共詞彙佔總詞彙的比例來定義相似度。為簡化問題,這裡不考慮中文(因為分詞太難了),只考慮長度不小於3、且不超過10的英文單詞,長度超過10的只考慮前10個字母。
輸入首先給出正整數n(<= 100),為檔案總數,隨後按以下格式給出每個檔案的內容:首先給出檔案正文,最後在一行中只給出乙個字元「#」,表示檔案結束。在n個檔案內容結束之後,給出查詢總數m(<= 10^4),隨後m行,每行給出一對檔案編號,其間以空格分隔。這裡假設檔案按給出的順序從1到n編號。
針對每一條查詢,在一行中輸出兩檔案的相似度,即兩檔案的公共詞彙量佔兩檔案總詞彙量的百分比,精確到小數點後1位。注意,這裡的乙個「單詞」只包含僅由英文本母組成的、長度不小於3、且不超過10的英文單詞,長度超過10的只考慮前10個字母。單詞間以任何非英文本母隔開。另外,大小寫不同的同一單詞被認為是相同的單詞,例如「you」和「you」是同乙個單詞。
將每個單詞利用雜湊函式對映到對應的雜湊表中,同時將檔案編號插入到雜湊表中的倒排索引表,之後將單詞在雜湊表中的位置存入每個檔案的詞彙索引表。計算兩個檔案的相似度時,只需要選擇詞彙量較小的那個檔案,遍歷該檔案的詞彙索引表,找到單詞在雜湊表中的位置並掃瞄該單詞的倒排索引表,如果倒排索引表中的檔案編號與另乙個檔案的編號相同,則說明該單詞同時出現在兩個檔案中。
極致碼農題
#include #include #include #include #define maxs 10
#define mins 3
#define maxb 5
#define maxtable 500009
typedef char elementtype[maxs + 1];
typedef struct fileentrywlist;
typedef struct wordentryflist;
struct hashentry;
typedef struct hashtblhashtable;
hashtable* table_init(int tablesize)
return h;
}wlist* fileindex_init(int size)
return f;
}int getword(elementtype word)
while (isalpha(c))
scanf("%c", &c);
if (p < mins)
return getword(word);
else
}int hash(char *key,int p)
int find(elementtype key, hashtable *h)
return pos;
}int insertandindex(int fileno, elementtype key, hashtable *h)
else
return -1;
}void fileindex(wlist *file, int fileno, int pos)
double work(wlist *file, int f1, int f2, hashtable *h)
temp = 0;
w = file[f1-1].next;
while (w)
if (f)
temp++;
w = w->next;
}return ((double)(temp * 100)/ (double)(file[f1 - 1].words + file[f2 - 1].words - temp));
}int main()
return 0;
}
檔案的詞彙索引表:
typedef struct fileentrywlist;
簡化版雜湊表定義以及初始化:
typedef struct wordentryflist;
struct hashentry;
typedef struct hashtblhashtable;
hashtable* table_init(int tablesize)
return h;
}
初始化檔案索引表:
wlist* fileindex_init(int size)
return f;
}
讀取單詞:
int getword(elementtype word)
while (isalpha(c)) //跳過超長的字母(相當於只讀取、不儲存)
scanf("%c", &c);
if (p < mins) //太短的單詞不要,讀下乙個
return getword(word);
else
}
字串移位法雜湊函式(雜湊函式):
int hash(char *key,int p)
在雜湊表中分配單詞及查詢單詞的位置:
int find(elementtype key, hashtable *h)
return pos;
}
將單詞插入雜湊表,同時插入對應的倒排索引表:
int insertandindex(int fileno, elementtype key, hashtable *h)
else
return -1; //同一檔案重複單詞,不插入
}
將單詞在雜湊表中的位置存入檔案索引表:
void fileindex(wlist *file, int fileno, int pos)
計算兩個檔案之間的相似度:
double work(wlist *file, int f1, int f2, hashtable *h) //選擇詞彙量較小的那個檔案作為檔案索引表的檔案
temp = 0; //統計公共詞彙量
w = file[f1-1].next; //掃瞄檔案的詞彙索引表
while (w)
if (f)
temp++; 說明該單詞是公共的
w = w->next;
}//兩檔案的詞彙總量 = 兩檔案詞彙量的和 - 公共詞彙量
return ((double)(temp * 100)/ (double)(file[f1 - 1].words + file[f2 - 1].words - temp));
}
主程式部分:
int main()
return 0;
}
基於詞頻的檔案相似度
基於詞頻的檔案相似度 實現一種簡單原始的檔案相似度計算,即以兩檔案的公共詞彙佔總詞彙的比 例來定義文章內容相似度。為簡化問題,這裡不考慮中文 因為分詞困難 只 考慮長度不小於 1000 個英文單詞的文章,長度超過 10 字母的單詞只考慮前 10 個字母。輸入 給出要檢查的英文文字檔案的資料夾位置 輸...
7 44 基於詞頻的檔案相似度(30 分)
本題目要求實現乙個簡化的熱門話題推薦功能,從大量英文 因為中文分詞處理比較麻煩 微博中解析出話題,找出被最多條微博提到的話題。輸入格式 輸入說明 輸入首先給出乙個正整數n 105 隨後n行,每行給出一條英文微博,其長度不超過140個字元。任何包含在一對最近的 中的內容均被認為是乙個話題,輸入保證 成...
7 44 基於詞頻的檔案相似度 (30 分
實現一種簡單原始的檔案相似度計算,即以兩檔案的公共詞彙佔總詞彙的比例來定義相似度。為簡化問題,這裡不考慮中文 因為分詞太難了 只考慮長度不小於3 且不超過10的英文單詞,長度超過10的只考慮前10個字母。輸入格式 輸入首先給出正整數n 100 為檔案總數。隨後按以下格式給出每個檔案的內容 首先給出檔...