聚类和相似度
1、[找到一种自动索引检索他感兴趣文章的方法]
- 1、如何衡量文章之间的相似度(需要一种度量手段)
- 2、怎样在全部的文章中搜索出下一篇要推荐的文章
2、如何表示一篇文档
- 词袋模型(忽略文档中单词的顺序信息)仅仅计算每个单词在文档中出现次数
- 如何表示:用一个向量,定义词汇表(单词索引,单词统计向量)
3、如何度量一篇文档的相似度
- 将两篇文档的单词统计向量 进行点乘(对应位置相乘再加和)
- 问题所在:如果两倍长的文章,则对应相似度就是原来四倍,显然不符合模型目的要求
- 解决办法:归一化这个向量:计算向量的范数(计算向量中元素的平方的综合,然后取平方根)可以将不同长度的文章,置于平等地位,然后检索中使用归一化的向量
4、文档中的关键词
- 关键词 文章中出现频率很高又和文章相关的单词(局部常见)(全局罕见):在词语库中又不太常见的
即权衡局部常见率和全局罕见率 - 生僻词 在词语库不常见的,但对一篇文章很重要
- 常见词 the is…
5、TF-IDF方法:权衡局部常见率和全局罕见率的一种方法,或词频-逆向文件频率法
加1的目的是避免除于0
1、词频 2、逆向文件频率法来减小这个数的权重
需要考虑语料库中的所有文档
6、如何检索文档:最近邻域搜索
- 定义一个距离量来衡量相似度
- 输出为最相似的文档,一个一个进行遍历比较,留下最优选择
(一个简单变体叫K-近邻搜索)
- 输出为一个相关文章的集合,最相关的k个不同的文章,建立一个优先队列来存放找到的K个最相关的文档
7、对所有主题文章进行分类,聚类,(标签)
-
多元分类问题(监督学习)
将待标签的文章,放入已经标签好的文章分类中,预测是什么类型的文章
-
聚类:(无监督学习)
输入:字数向量 输出:对语料库中的每一个文件添加某个集群标签
我们运行不需要任何(给定的)标签,我们只用到观测量本身,并试图揭示这些观测量的一些结构
8、如何定义一个聚类
1、集群中心、集群形状
2、只看集群中心(只需要测试观测点到集群中心的距离)
9、聚类算法
- 只看测试观测点到集群中心的距离
K-means algorithm
- 从最终得到K个集群的假设出发;(提前给出最终集群的数量)我们会看每个集群的平均值,只考虑集群中心,以此来将数据点分到不同的集群中
如何初始化集群中心的位置
1、把所以的数据点分到离它最近的集群中心(做这些判定的方法叫沃罗诺伊镶嵌算法)随机的
2、根据数据点的分配问题不断的更新集群中心的位置
10、聚类案例
- 图像搜索聚类案例
- 癫痫病人,根据发病记录,识别出癫痫的不同类型
- 亚马逊上产品推荐(标签),相关联,族群
- 组织网页搜索
- 社区集合,相似社区的实际问题,实现信息共享,预测犯罪率
文档修复
1、数据获取
import graphlab
#导入一些文本数据(维基百科关于人物的页面)
people = graghlab.SFrame('people_wiki.gl/')
people.head()
- 查看有多少条记录
len(people)
#结果59071
- 浏览数据集并查看它包含的文本
#特定一个人的信息
obama = people[people['name']=='Barack Obama']
obama['text']
2、获取关于奥巴马文章的单词统计
obama[‘word_count’] = graphlab.text_analytics.count_words(obama[‘text’])
print obama[‘word_count’]
3、给单词计数排序(在python中是一个字典)
键是各个单词,计数为单词出现的次数
obama_word_count_table = obama[['word_count']].stack('word_count',new_column_name = ['word','count'])
#stack()函数把SFrame里面字典的一列取出,和另外几列放在一起
obama_word_count_table.head() #得到的结果并没有进行排序
#根据计数进行排序
obama_word_count_table.sort('count',ascending = False)#降序
结果显示为:
4、整个文章的TF/IDF
- 计算整个文集中,各个单词的数量
people['word_count']=graphlab.text_analytics.count_words(people['text'])
people.head()
- 计算TF/IDF
tfidf = graphlab.graphlab.text_analytics.tf_idf(people['word_count'])
tfidf
- 得到一个TF/IDF字典,将TF/IDF列加入到任务的元表格中
people['tfidf'] = tfidf['docs']
- 检查奥巴马这篇文章的tf/idf
obama = people[people['name']=='Barack Obama']
obama[['tfidf']].stack('tfidf',new_column_name = ['word','tfidf']).sort('tfidf',ascending=False)
#收集到奥巴马的tfidf信息,分开存储到word和tfidf两列中,并降序排列
5、手动计算几个人之间的距离,展示这个距离是什么样的,给一个TF/IDF 的整体印象
- 取奥巴马为例
clinton = people[people['name']=='Bill Clinton']
beckham = people[people['name']=='David beckham']
- 相比于贝克汉姆来讲,克林顿是不是更近呢
有很多方法来度量相似度以及两个向量之间的距离,或者两个文件之间的差别
#使用距离矩阵 cosine数值越高,两个文章的相似度越高
graphlab.distance.cosine(obama['tfidf'][0],clinton['tfidf'][0])
#在这里我们想要的是距离,实验希望值越小越好
#加0的目的:我们要的是这张表的第0行,这张表仅有一个对象
#结果为0.83
graphlab.distance.cosine(obama['tfidf'][0],beckham['tfidf'][0])
#结果为0.97
6、如何才能自动找出一篇文章与其他文章之间的距离呢
- 如何将最近邻算法模型运用到文章检索上
- 使用nearest_neighbors离线模型,用单词create来创建哪一个最近邻模型
knn_model = graphlab.nearest_neighbors.create(people,features=['tdidf'],lable='name')
7、在文章上应用最近邻居模型,利用query()函数
knn_model.query(obama)
8、文章检索的其他例子
swift = people[people['name']=='Taylor Swift']
knn_model.query(swift)
arnold = people[people['name']=='Arnold Schwarzenegger']
knn_model.query(arnold)