源码见github:https://github.com/smallsmallcase/lsHash

和LSH算法类似,朴素贝叶斯算法也能实现相近的分类功能,朴素贝叶斯算法给新浪新闻分类的代码见:https://github.com/smallsmallcase/machinelearning2-bayes

1.LSH算法简介:

我们将这样的一族hash函数 H={h:S→U} 称为是(r1,r2,p1,p2)敏感的,如果对于任意H中的函数h,满足以下2个条件:
如果d(O1,O2)<r1,那么Pr[h(O1)=h(O2)]≥p1
如果d(O1,O2)>r2,那么Pr[h(O1)=h(O2)]≤p2
其中,O1,O2∈S,表示两个具有多维属性的数据对象,d(O1,O2)为2个对象的相异程度,也就是1 - 相似度。其实上面的这两个条件说得直白一点,就是当足够相似时,映射为同一hash值的概率足够大;而足够不相似时,映射为同一hash值的概率足够小。

2.项目简介:

paper文件夹中存放的是我在中国论文网爬到的论文,用的是scrapy库。
test.txt是选自其中的一篇,并且添加了一些其他论文中的文字。
lshash是我安装的第三方库
main.py是代码实现

3.用到的库:

lshash,jieba

4.解析代码:

# @Time    : 2017/10/19 10:09
# @Author  : Jalin Hu
# @File    : main.py
# @Software: PyCharm
import os
import jieba
import collections
import random
from lshash.lshash import LSHash'''函数说明:获取词汇集合
Parameters:foldpath - 论文文件夹路径
Returns:datalist_dict - 词集字典(名字:词集)'''def textprocess(foldpath):datalist = []classlist = []# datalist_dict = {}vocabset = collections.defaultdict(int)filelist = os.listdir(foldpath)  # 获取paper文件夹下面所有的文件名for file in filelist:with open(os.path.join(foldpath, file), 'r', encoding='utf-8') as f:sequence = f.read()key = file.strip('.txt').strip('[').strip(']').strip(r"\\'")datalist.append(jieba.lcut(sequence, cut_all=False))classlist.append(key)print(key, ':**************ok')for content in datalist:for word in content:vocabset[word] += 1all_word_sorted = sorted(vocabset.items(), key=lambda e: e[1], reverse=True)all_word_list, all_word_nums = zip(*all_word_sorted)return datalist, classlist, list(all_word_list)# # return datalist, classlist# data_class_list = list(zip(datalist, classlist))# # print(data_class_list)# random.shuffle(data_class_list)# index = int(len(data_class_list) * testsize) + 1  # 训练集和测试集区分的索引# traindatalist, trainclasslist = zip(*(data_class_list[index:]))  # 训练集解压缩# testdatalist, testclasslist = zip(*(data_class_list[:index]))  # 测试集解压缩## # 统计训练集词频# allworddict = collections.defaultdict(int)  # 创建默认字典# for word_list in traindatalist:#     for word in word_list:#         allworddict[word] += 1## # 根据键的值倒序排列# all_word_sorted = sorted(allworddict.items(), key=lambda e: e[1], reverse=True)# all_word_list, all_word_nums = zip(*all_word_sorted)# all_word_list = list(all_word_list)# return all_word_list, traindatalist, trainclasslist, testdatalist, testclasslist'''函数说明:读取文件里的内容,并去重
Parameters:words_file - 文件路径
Returns:words_set - 读取的内容的set集合'''def make_word_set(word_file):word_set = set()with open(word_file, 'r', encoding='utf-8') as f:for line in f.readlines():word = line.strip()if len(word) > 0:word_set.add(word)return word_set'''函数说明:文本特征选取
Parameters:all_words_list - 训练集所有文本列表deleteN - 删除词频最高的deleteN个词stopwords_set - 指定的结束语
Returns:feature_words - 特征集'''def word_dict(vocabset, deleteN, stopwords_set):feature_words = []for i in range(deleteN, len(vocabset), 1):if not vocabset[i].isdigit() and vocabset[i] not in stopwords_set and 1 < len(vocabset[i]) < 5:feature_words.append(vocabset[i])return feature_words'''函数说明:向量化
Parameters:vocablist - 所有特征集inputset - 输入的词集
Returns:returnvec - 向量'''def bagof_word2vec(vocablist, inputset):returnvec = [0] * len(vocablist)for word in inputset:if word in vocablist:returnvec[vocablist.index(word)] += 1else:print('word:', word, 'is not in the list_vec')return returnvecif __name__ == '__main__':datalist, classlist, vocabset = textprocess('./paper')  # 获取每篇论文的词集stop_word_file = './stopwords_cn.txt'stop_word_set = make_word_set(stop_word_file)feature_words = word_dict(vocabset, 0, stop_word_set)trainMat = []lsh = LSHash(hash_size=10, input_dim=len(feature_words))for postinDoc in datalist:trainMat_vec = bagof_word2vec(feature_words, postinDoc)  # 训练集向量化trainMat.append(trainMat_vec)lsh.index(trainMat_vec)testfile = './test.txt'testlist = []with open(testfile, 'r', encoding='utf-8') as f:sequence = f.read()testlist.append(jieba.lcut(sequence, cut_all=False))testvect = bagof_word2vec(feature_words, testlist[0])re = lsh.query(testvect, num_results=1)print(list(re[0][0]))print(trainMat.index(list(re[0][0])))print('最相似的论文是:', classlist[trainMat.index(list(re[0][0]))])

LSH(局部敏感哈希算法)实现文本的相似性比对相关推荐

  1. R语言实现︱局部敏感哈希算法(LSH)解决文本机械相似性的问题(一,基本原理)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 私认为,文本的相似性可以分为两类:一类是机械相 ...

  2. 【期外】 (一)关于LSH :局部敏感哈希算法

    LSH是我同学的名字,平时我会亲切的称呼他为离骚,老师好,左移(leftshift),小骚骚之类的,最近他又多了一个新的外号:局部敏感哈希(Locally sensitive hashing). 好了 ...

  3. 局部敏感哈希算法(Locality Sensitive Hashing)

    from:https://www.cnblogs.com/maybe2030/p/4953039.html 阅读目录 1. 基本思想 2. 局部敏感哈希LSH 3. 文档相似度计算 局部敏感哈希(Lo ...

  4. 大规模异常滥用检测:基于局部敏感哈希算法——来自Uber Engineering的实践

    uber全球用户每天会产生500万条行程,保证数据的准确性至关重要.如果所有的数据都得到有效利用,t通过元数据和聚合的数据可以快速检测平台上的滥用行为,如垃圾邮件.虚假账户和付款欺诈等.放大正确的数据 ...

  5. KD树和LSH局部敏感哈希

    文档结构 文档表示 距离度量 KD树 原理 构建 查询 复杂度 KD树的KNN KD树的逼近KNN 不适用高维数据 LSH LSH潜在的问题 LSH算法 复杂度 概率逼近 多表 文档结构 文档表示 词 ...

  6. minHash(最小哈希)和LSH(局部敏感哈希)

    在数据挖掘中,有一个比较基本的问题,就是比较两个集合的相似度.关于这个问题,最笨的方法就是用一个两重循环来遍历这两个集合中的所有元素,进而统计这两个集合中相同元素的个数.但是,当这两个集合里的元素数量 ...

  7. 最近邻和K近邻及其优化算法LSH(局部敏感哈希,Locality Sensitive Hashing) Kd-Tree

    引言 在处理大量高维数据时,如何快速地找到最相似的数据是一个比较难的问题.如果是低维的小量数据,线性查找(Linear Search)就可以解决,但面对海量的高维数据集如果采用线性查找将会非常耗时.因 ...

  8. 如何使用局部敏感哈希(LSH)算法进行特征降维?

    这篇博客只关注局部敏感哈希的降维过程,也不涉及理论证明. 1. 局部敏感哈希算法 1.1 算法简介   传统的哈希(Hashing)算法通过映射函数将记录的存储位置与记录的关键字关联起来,实现记录的快 ...

  9. LSH︱python实现局部敏感哈希——LSHash(二)

    关于局部敏感哈希算法,之前用R语言实现过,但是由于在R中效能太低,于是放弃用LSH来做相似性检索.学了Python发现很多模块都能实现,而且通过随机投影森林让查询数据更快,觉得可以试试大规模应用在数据 ...

最新文章

  1. Centos6.4 + PHP5.5.11 + Mysql5.6.16 + Tnginx2.02 + Memcached1.4.17 + Redis2.2
  2. 【IBM研究院】2020年人工智能发展五大预测
  3. 学习NGUI前的准备NGUI的相关信息
  4. 拦截PHP各种异常和错误,发生致命错误时进行报警,万事防患于未然
  5. java j集合_JNotes/Java-集合篇(2)集合之List.md at master · harryjudy2240/JNotes · GitHub...
  6. js的object的key需要引号吗_今天你用书名号了吗?
  7. 分析flv文件的信息
  8. 经典DL论文研读(part3)--Improving neural networks by preventing co-adaptation of feature detectors
  9. java浮点数存储方式_Java浮点数内存存储
  10. 玩转oracle 11g(3):配置监听
  11. IOS之NSValue整理
  12. 苹果mac视频编辑和制作软件:Premiere Pro
  13. mysql分组取每组前几条记录_[转] mysql分组取每组前几条记要(排名)
  14. php tp框架文档,Thinkphp 框架基础之入口文件功能、定义与用法分析
  15. 福昕PDF编辑器中文版(FoxitPDFEditor)绿色版
  16. Access2016学习4
  17. 2022年信息安全工程师考试知识点:网络安全需求分析与基本设计
  18. 【Pr】视频剪辑学习记录——导出
  19. 基于JAVA彩票在线购买系统计算机毕业设计源码+系统+lw文档+部署
  20. 浅谈To B与To C的区别

热门文章

  1. 手机WAPI功能检测常见问题分析(系列连载三):预共享密钥功能
  2. opencv 去除玻璃蒙版_在opencv python中混合渐变蒙版
  3. 一款超级好用的鼠标手势软件Mouselnc
  4. 如何拖动末端使机器人运动仿真-使用Peter机器人工具箱
  5. 设置wifi默认country_code
  6. 【Unity2D好项目分享】用全是好活制作横版卷轴射击游戏④制作敌人管理器以及播数显示和音效以及场景加载器
  7. HTML基础实战-图像音频标签以及标题、段落、换行、图片标签的运用(文章为刺客信条:英灵殿)
  8. 信息检索(IR)—信息检索模型(一)
  9. 程序员的圣诞礼物:计算机寓言之秋
  10. 【面试题】聊聊 js 异步解决方案