首先,是关键词的选取:
好吧这个我这模型实在是太简单了,但还是讲一讲比较好呢。。。
我们现在手头有的是一堆百度百科词条w的DF(w, c)值,c是整个百科词条。。。原因是。。。方便嘛~(而且人家现成的只有介个了啦~)
我们发现有830W+的词条数目,都存下来显然是不理智、不科学、不魔法的。所以选取一部分作为关键词。
如何选取关键词呢?我选择了DF值在[100, 5000]之间的词。虽然也很不理智、不科学、不魔法,但是比直接存下来理智、科学、魔法多了,恩!
于是就全读进来,然后找到需要的词语,顺便计算下IDF值什么的输出到新的文件里去。
1 #include <cstdio> 2 #include <iostream> 3 #include <iomanip> 4 #include <cmath> 5 #include <string> 6 #include <algorithm> 7 8 using namespace std; 9 typedef double lf; 10 const int cnt_id = 9000005; 11 const lf tot_file = 4500000; 12 const lf eps = 1e-8; 13 14 struct data { 15 int id; 16 lf IDF; 17 string st; 18 19 data() {} 20 data(int _id, lf _IDF, string _st) : id(_id), IDF(_IDF), st(_st) {} 21 22 inline bool operator < (const data &a) const { 23 return IDF > a.IDF; 24 } 25 } a[cnt_id]; 26 inline bool cmp_id(data a, data b) { 27 return a.id < b.id; 28 } 29 30 31 string st; 32 int id, cnt; 33 int St, Ed; 34 lf NUM_max, NUM_min; 35 36 inline lf calc(int x) { 37 return (lf) log((lf) tot_file / (x + eps)); 38 } 39 40 int main() { 41 int i, DF; 42 freopen("data", "r", stdin); 43 freopen("data_new", "w", stdout); 44 ios::sync_with_stdio(true); 45 while (cin >> id >> st >> DF) 46 a[++cnt] = data(id, (lf) calc(DF), st); 47 sort(a + 1, a + cnt + 1); 48 49 NUM_max = calc(100), NUM_min = calc(5000); 50 for (i = 1; i <= cnt; ++i) 51 if (a[i].IDF < NUM_max) break; 52 St = i; 53 for ( ; i <= cnt; ++i) 54 if (a[i].IDF < NUM_min) break; 55 Ed = i; 56 57 sort(a + St, a + Ed, cmp_id); 58 cout << Ed - St << endl; 59 for (i = St; i < Ed; ++i) 60 cout << a[i].id << ' ' << a[i].st << ' ' << setprecision(10) << a[i].IDF << endl; 61 return 0; 62 }
这样子我们就选出来了339,896个数作为关键词,占全部词条的4.1%,数量的减少,可以大幅之后的程序提高效率。