考虑一下这个场景 , 使用网络爬虫高速爬取大量的网页内容 , 如果想把这些网页进行实时聚类 , 并从中提取每个网页聚类的主题 . 我们应该怎么样去做
对于普通或常见的聚类算法 , 比如 K-means, 或 Hierarchical 聚类 , 无法适用于这个常见 , 对于这些聚类算法无法进行 incremental 聚类 , 即在聚类开始前必须知道整个数据集 , 而这个场景中的数据集是随着爬虫不断增多的 . 而且这些聚类算法的 performance 不够高 , 比如对于 K-means 需要不断的 partition 以达到比较好的聚类效果 . 所以向来聚类算法在我的印象中是低效的 , 而面对这样一个需要实时数据递增处理的场景 , 我们需要一种 one-shot 的高效算法 , 接收到网页内容 , 迅速判断其类别 , 而不用后面不断地 revisit 或 recluster.
首先介绍下面这个聚类方法
Leader-Follower Clustering (LFC)
The algorithm can be described as follows:
If distance between input and the nearest cluster above threshold, then create new cluster for the input.
Or else, add input to the cluster and update cluster center.
其实这个聚类方法再简单不过了 , 我是先想到这个方法 , 然后才发现这个方法有这么个看上去蛮牛比的名字 .
有了这个方法 , 当新网页来的时候 , 和所有老的网页形成的聚类算下相似度 , 相似就归到这类 , 不相似就创建新类
这个过程当中有个经典问题 , KNN 问题 (K-Nearest Neighbor) .
面 对海量数据 , 而且是高维数据 ( 对于文本 feature 一般是选取文本中的 keywords, 文本中的 keywords 一般是很多的 ), KNN 问题很难达到线性 search 的 , 即一般是比较低效的 . 这样也没办法达到我们的要求 , 我们需要新的方法来解决这个 KNN 问题
当然该牛人出场了 , 他提出了一种算法
Locality Sensitive Hash(LSH)
这个算法的效果是 , 你可以把高维向量 hash 成一串 n-bit 的数字 , 当两个向量 cosin 夹角越小的时候 ( 即他们越相似 ), 那么他们 hash 成的这两串数字就越相近