Skip navigation

Category Archives: Uncategorized

(add-to-list 'gnus-secondary-select-methods '(nnfolder "archive"))
(setq nnfolder-directory "~/.emacs.d/mail/archive")
;; where to store sentmail
(setq gnus-message-archive-method
      '(nnfolder "archive"
                 (nnfolder-inhibit-expiry t)
                 (nnfolder-active-file "~/.emacs.d/mail/archive/active")
                 (nnfolder-directory "~/.emacs.d/mail/archive")))

gnus-message-archive-method 是用来设置已发送邮件存储位置的。同样的目 录再加入到 gnus-secondary-select-methods 里面,让“已发件”文件夹能在 Group列表里显示。

问题简述

相似度比较基于空间向量模型(Vector Space Model)。将两段文本用向量A、B表示,计算AB夹角的余弦值用以表示相似度。

具体步骤如下:

  1. 提取两段文本中所有词(事先需用空格分割好)。
  2. 计算每个词在两段文本中分别出现的次数(用BSD tree.h里的RBTREE保存)
  3. 用词频做为A、B的分量。
  4. 使用余弦公式计算AB夹角的余弦值。

举例

T1 = 我 爱 北京 天安门
T2 = 我 爱 北京 立交桥

提取所有的词

W = 我 爱 北京 天安门 立交桥

计算每个词分别出现的次数

CA = 我:1 爱:1 北京:1 天安门:1 立交桥:0
CB = 我:1 爱:1 北京:1 天安门:0 立交桥:1

分别计算向量AB

设S为总词数即T1,T2中总共出现词的数量

S = 4 + 4 = 8
A = (1/8, 1/8, 1/8, 1/8, 0/8)
B = (1/8, 1/8, 1/8, 0/8, 1/8)

应用余弦定理计算向量夹角

cos{\theta} = \frac{AB}{|A||B|} = \frac{a_1 b_1 + a_2 b_2 + .. + a_n b_n}{\sqrt{(a_1^2+a_2^2+..+a_n^2)}\sqrt{(b_1^2+b_2^2+..+b_n^2)}}

代码

https://github.com/jianingy/postgres-toys/tree/master/pg_trgm_sml


“今有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二,问物几何?” 这道《孙子算经》中的例题是小学或者初中数学竞赛里常见的同余问题。想当年自己解这类问题多是凑数凑出来的,而并不得其法。因此也经常焦头烂额。昨天看到 POJ 1006 ,突然又心血来潮想探寻一下这类问题是否有标准的解法。

浏览于Wikipedia之中,发现了几篇很好的文章:

Modular Arithmetic
Linear Congruence Theorem
Chinese Remainder Theorem

这里以“POJ 1006”:http://acm.pku.edu.cn/JudgeOnline/problem?id=1006 为例演示一下这个计算过程:

“三人同行七十稀,五树梅花廿一枝,七子团圆正半月,除百零五便得知”

推导过程见附件

#include <stdio.h>

int main()
{
        int x, p, e, i ,d, k, n = 0, r[1024];

        do {
                scanf("%d%d%d%d", &p, &e, &i, &d);
                if (p == -1 && e == -1 && i == -1 && d == -1) break;
                p = p % 23;
                e = e % 28;
                i = i % 33;
                /* x = 21252 * k - 504504 * p + 503217 * e + 1288 * i; */
                x = (21252  + 5544 * p + 14421 * e + 1288 * i - d) % 21252;
                r[n++] = (x == 0)?21252:x;
        } while (1);

        for (i = 0; i < n; i++) {
                printf("Case %d: the next triple peak occurs in %d days.\n", i + 1, r[i]);
        }
}