-
-
python_mmdt:一种基于敏感哈希生成特征向量的python库(一)
-
发表于: 2021-1-12 22:37 5561
-
python_mmdt
是一种基于敏感哈希的特征向量生成工具,可用于文件相似度计算,文件分类、聚类等。核心算法使用C
实现,提高程序执行效率。同时使用python
进行封装,方便研究人员使用。
本篇幅主要介绍涉及的相关基本内容与使用,相关内容的详细说明,后续详细探讨。
重点内容,包括三个方面:
我们的研究对象常常是不同的文件格式,不同的文件大小,如何方便的处理这类格式不同,大小不一的文件呢?方法有很多种,这里我们使用采样的方法。
采样原始定义:
采样是将信号从连续时间域上的模拟信号转换到离散时间域上的离散信号的过程。
下采样定义:
对于一个样值序列间隔几个样值取样一次,这样得到新序列就是原序列的下采样。
通过重采样(本工具中特指下采样),我们让对象数据都处于相同的维度(大小)。这样,就可以比较方便地定义我们自己的局部敏感哈希函数。
python_mmdt
使用Lanczos
采样方法。
局部敏感哈希的基本概念
局部敏感哈希(Locality Sensitive Hashing,LSH)的基本思想类似于一种空间域转换思想,LSH算法基于一个假设,如果两个文本在原有的数据空间是相似的,那么分别经过哈希函数转换以后的它们也具有很高的相似度;相反,如果它们本身是不相似的,那么经过转换后它们应仍不具有相似性。
通过重采样之后的数据,我们假设其满足独立同分布。同时,我们将重采样的数据,平均分成N块,每块之间的数据进行累计求和,和值分布近似服从正态分布,我们取和值高x位(如高第5位)的一个byte做为本块数据的敏感哈希值。
mmdt_hash
示例如:
简单应用如,索引敏感哈希可以转成一个int32的数字,当索引敏感哈希相等时,再比较敏感哈希的距离(如曼哈顿距离,将敏感哈希转成N个unsigned char
类型计算敏感哈希,此时00
和FF
之间的距离可算作1,也可算作255,具体看实现)。
由于特征向量的维度是固定的,因此可以很方便的使用其他数学方法,进行大规模计算。
.whl
从github_release
或者pypi
下载编译好的二进制包安装
安装之后,可以通过命令行,快速计算敏感hash或比较两个文件相似度
用作python库,导入编码使用
拷贝一份当前项目的setup.py
,命名为setup_1.py
。
setup_1.py
进行两种变换:
计算mmdt_hash
等于0.9811928175556364
。
vim
对比图如:
md5
、文件大小
、mmdt_hash
信息图如:
由于敏感哈希采用累计求和的方式,和值近似服从正态分布,所以由此计算出来的相似度,绝大部分会分布在u值附近区间内。在这块区间内的相似度,其实价值很低的。相反的,在这个区间外的,如正态分布的两侧数据,价值就很高了。相似度越高的表示真的越相似,相似度越低的表示真的越不相似。而落在中间取值范围,价值就小很多。
如比较项目中的setup.py
和LICENSE
,相似度0.62
左右,但价值不大:
$ pip install python_mmdt
$ pip install python_mmdt
$ pip install python_mmdt
-
xxx.whl
$ pip install python_mmdt
-
xxx.whl
# calculate mmdt sensitive
$ mmdt
-
hash
$file_path
# calculate file similarity
$ mmdt
-
compare $file_path1 $file_path2
# calculate mmdt sensitive
$ mmdt
-
hash
$file_path
# calculate file similarity
$ mmdt
-
compare $file_path1 $file_path2
# -*- coding: utf-8 -*-
import
unittest
import
os
from
python_mmdt.mmdt.mmdt
import
MMDT
class
Testmmdt(unittest.TestCase):
def
test_process(
self
):
mmdt
=
MMDT()
test_path
=
os.path.dirname(__file__)
test_samples
=
os.path.join(test_path,
"samples"
)
files
=
os.listdir(test_samples)
for
f
in
files:
file_path
=
os.path.join(test_samples, f)
r1
=
mmdt.mmdt_hash(file_path)
print
(r1)
r2
=
mmdt.mmdt_hash_streaming(file_path)
print
(r2)
sim1
=
mmdt.mmdt_compare(file_path, file_path)
print
(sim1)
sim2
=
mmdt.mmdt_compare_hash(r1, r2)
print
(sim2)
# -*- coding: utf-8 -*-
import
unittest
import
os
from
python_mmdt.mmdt.mmdt
import
MMDT
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课