根据simhash局部敏感性计算相似度 package com.xxx.wdvec;import java.util.Map;import java.util.Vector;import java.util.HashMap;import java.util.Comparator;import java.util.Collections;import java.io.FileReader;import java.io.Buffer
package com.xxx.wdvec; import java.util.Map; import java.util.Vector; import java.util.HashMap; import java.util.Comparator; import java.util.Collections; import java.io.FileReader; import java.io.BufferedReader; import java.math.BigInteger; import java.security.MessageDigest; /** * Copyright ©2017 gonglibin * 根据simhash局部敏感性计算相似度 * @author gonglibin * 2017.08.14 */ public class XxSHash { public static class XxPair { public Long md5; public String key; public Double val; public XxPair() {} public XxPair(Long m, String k, Double v) {md5 = m; key = k; val = v;} } private static final int XX_BITS = 0X40; private static final Long[] XX_MASK = { 0X8000000000000000L, 0X4000000000000000L, 0X2000000000000000L, 0X1000000000000000L, 0X0800000000000000L, 0X0400000000000000L, 0X0200000000000000L, 0X0100000000000000L, 0X0080000000000000L, 0X0040000000000000L, 0X0020000000000000L, 0X0010000000000000L, 0X0008000000000000L, 0X0004000000000000L, 0X0002000000000000L, 0X0001000000000000L, 0X0000800000000000L, 0X0000400000000000L, 0X0000200000000000L, 0X0000100000000000L, 0X0000080000000000L, 0X0000040000000000L, 0X0000020000000000L, 0X0000010000000000L, 0X0000008000000000L, 0X0000004000000000L, 0X0000002000000000L, 0X0000001000000000L, 0X0000000800000000L, 0X0000000400000000L, 0X0000000200000000L, 0X0000000100000000L, 0X0000000080000000L, 0X0000000040000000L, 0X0000000020000000L, 0X0000000010000000L, 0X0000000008000000L, 0X0000000004000000L, 0X0000000002000000L, 0X0000000001000000L, 0X0000000000800000L, 0X0000000000400000L, 0X0000000000200000L, 0X0000000000100000L, 0X0000000000080000L, 0X0000000000040000L, 0X0000000000020000L, 0X0000000000010000L, 0X0000000000008000L, 0X0000000000004000L, 0X0000000000002000L, 0X0000000000001000L, 0X0000000000000800L, 0X0000000000000400L, 0X0000000000000200L, 0X0000000000000100L, 0X0000000000000080L, 0X0000000000000040L, 0X0000000000000020L, 0X0000000000000010L, 0X0000000000000008L, 0X0000000000000004L, 0X0000000000000002L, 0X0000000000000001L }; private static final String XX_FIDF = "./dat/sougou.idf"; private static final String XX_DOC1 = "茫茫 太 空 人类 迈出 的 每 都 充满 了 智慧 和 勇气 我国 即将 进行 的 载人 交会 对接 也 将 面临 着 探索 太空 过程 中 必然 要 经历 的 考验 中国 载人 航天 工程 办公室 新闻 发言人 武平 昨天 表示 神 舟 成功 突破 了 自动 交会 对接 后 将 通过 这次 神舟九号 实现 手 控 交会 对接 全面 掌握 这项 技术 对 实现 中国 载人 航天 走 战略 的 阶段 目标 具有 决定性 意义 也 将 为 后续 工程 发展 奠定 一定 基础 毋庸置疑 载人 航天 是 高风险 的 事 此次 任务 至少 在 大 关键 节点 上 经受 着 考验 节点 夏季 发射 天公 能否 作 美 选择 发射 在 我国 载人 航天 历次 发射 中 尚 属 我们 从神舟 以来 完成 的 历次 发射 都 选择 在 春 秋 冬季 唯独 没有 在 夏季 酒泉 卫星 发射 中心 主任 崔吉俊 说 高温 和 雷电 是 夏季 发射 面临 的 最 大 挑战 据 介绍 在 可能 干扰 载人 航天 发射 的 气象 条件 中 雷电 影响 最 大 气象 资料 显示 酒泉 卫星 发射场 地区 在 秋 冬季 基本 没有 雷电 夏季 雷电 发生 频率 约 每月 虽然 发生 频率 不 高 但 可能 造成 灾难 性 后果 为 此 近 预报员 正 在 全力以赴 对 神 发射 窗口 天气 情况 进行 准确 预报 节点 手动 交会 对接 能否 再 创 奇迹 在 神 舟 与 天宫 的 交会 对接 中 仅 用 了 就 完成 原定 的 任务 我国 载人 航天 工程 首任 总 设计师 王永志 用 奇迹 来 评价 这次 任务 有关 人士 指出 神舟九号 与 天宫 手动 交会 对接 过程 比较 复杂 人工 控制 高速 运转 的 航天器 难度 大 风险 高 要求 航天员 必须 具备 稳定 的 心理 素质 灵活 的 协调 性 以及 超 强 的 认知 处置 协同 能力 为了 防止 突发 情况 的 出现 这次 手动 交会 对接 将 安排 在 航天器 飞越 我国 上空 的 白天 时间 进行 节点 人 长期 驻留 天宫 是否 宜 居 这次 任务 中 将 有 男 女 航天员 在 天宫 进行 超过 的 驻留 人数 之 时间 之 长 创造 了 我国 载人 航天 工程 实施 以来 的 新 纪录 也 对 天宫 是否 宜 居 提出 了 挑战 天宫 是 我国 空间 实验室 的 雏形 也 是 我国 当前 个头 最 大 的 载人 航天器 拥有 的 实验舱 可 供 航天员 在 太空 工作 和 生活 如果 把 神 舟 飞船 比作 是 室 厅 那 天宫 就 是 别墅 我国 航天员 杨利伟 曾 形象 地 说 节点 中继 卫星 正式 使用 天 链 能否 畅通 载人 交会 对接 重点 在 安全 难点 在 测控 在 这次 任务 中 我国 自主 研制 的 天 链 星 星 将 正式 投入 使用 我国 载人 航天 测控 通信网 的 覆盖率 由 以前 的 提升 到 了 意味着 我们 可以 把 所有 的 重要 活动 安排 在 这些 弧 段 里 完成 不仅 可以 更 好 地 确保 航天员 的 安全 而且 可 使 关心 他们 的 人们 能够 更 了解 他们 的 实时 状态 节点 神女 下凡 能否 安全 着陆 当 女 男 航天员 乘坐 飞船 返回 舱 在 降落伞 的 牵引 下 缓缓 降落 时 将 定格 成神舟 与 天宫 载人 交会 对接 任务 成功 的 标志 然而 神女 下凡 并 不 轻松 在 飞船 再 次 进入 大气层 时 返回 舱 和 大 气 的 高速 摩擦 将 使 飞船 表面 达到 上 的 高温 同时 还 会 出现 黑 障 现象 使 飞船 与 地面 失去 无线电 联系 由于 急剧 减速 航天员 将 承受 于 地球 引力 的 过载 即便 经过 降落伞 和 反 推 发动机 的 缓冲 返回 舱 着陆 速度 也 会 达到 每 秒 到 为了 确保 航天员 安全 着陆 场 系统 对 快速 定位 快速 到达 精心 处置 返回 舱 等 环节 进行 了 改进 增加 了 医疗 救护 直升机 并 在 搜 救 直升机 上装 备 了 通信 吊 舱 确保 图像 和 语音 的 传输 更加 清晰 新闻 链 接 大 特点 难点 据 介绍 与 无 人 交会 对接 任务 相比 这次 载人 交会 对接 任务 具有 方面 的 特点 难点 是 实施 航天员 手 控 交会 对接 对 航天员 操作 的 精 准 性 和 灵敏 性 等 都 提出 了 更 高 要求 是 航天员 访问 在 轨 飞行器 也 就 是 天宫 我国 航天员 在 太空 中 住 进 神 舟 飞船 以外 的 地方 这 是 头 还 意味着 实现 地面 向 在 轨 飞行器 的 人员 和 物资 运输 与 补给 是 女 航天员 太空 飞行 验证 中国 女 航天员 选拔 训练 医学 监督 和 保障 以及 新 研制 的 女 航天员 乘员 飞行 装备 等 方面 是 航天员 在 轨 飞行 时间 较 长 大约 期间 将 开展 的 航天 医学 实验 和 空间站 部分 单项 技术 试验"; private static final String XX_DOC2 = "茫茫 太 空 人类 迈出 的 每 都 充满 了 智商 和 勇敢 美国 即将 进行 的 载人 交会 对接 也 将 面临 着 探索 宇宙 过程 中 必然 要 经历 的 考验 中国 载人 航空 项目 办公室 新闻 发言人 武平 昨天 表示 神 舟 成功 突破 了 自动 交会 对接 后 将 通过 这次 神舟九号 实现 手 控 交会 对接 全面 掌握 这项 技术 对 实现 中国 载人 航天 走 战略 的 阶段 目标 具有 决定性 意义 也 将 为 后续 工程 发展 奠定 一定 基础 毋庸置疑 载人 航天 是 高风险 的 事 此次 任务 至少 在 大 关键 节点 上 经受 着 考验 节点 夏季 发射 天公 能否 作 美 选择 发射 在 我国 载人 航天 历次 发射 中 尚 属 我们 从神舟 以来 完成 的 历次 发射 都 选择 在 春 秋 冬季 唯独 没有 在 夏季 酒泉 卫星 发射 中心 主任 崔吉俊 说 高温 和 雷电 是 夏季 发射 面临 的 最 大 挑战 据 介绍 在 可能 干扰 载人 航天 发射 的 气象 条件 中 雷电 影响 最 大 气象 资料 显示 酒泉 卫星 发射场 地区 在 秋 冬季 基本 没有 雷电 夏季 雷电 发生 频率 约 每月 虽然 发生 频率 不 高 但 可能 造成 灾难 性 后果 为 此 近 预报员 正 在 全力以赴 对 神 发射 窗口 天气 情况 进行 准确 预报 节点 手动 交会 对接 能否 再 创 奇迹 在 神 舟 与 天宫 的 交会 对接 中 仅 用 了 就 完成 原定 的 任务 我国 载人 航天 工程 首任 总 设计师 王永志 用 奇迹 来 评价 这次 任务 有关 人士 指出 神舟九号 与 天宫 手动 交会 对接 过程 比较 复杂 人工 控制 高速 运转 的 航天器 难度 大 风险 高 要求 航天员 必须 具备 稳定 的 心理 素质 灵活 的 协调 性 以及 超 强 的 认知 处置 协同 能力 为了 防止 突发 情况 的 出现 这次 手动 交会 对接 将 安排 在 航天器 飞越 我国 上空 的 白天 时间 进行 节点 人 长期 驻留 天宫 是否 宜 居 这次 任务 中 将 有 男 女 航天员 在 天宫 进行 超过 的 驻留 人数 之 时间 之 长 创造 了 我国 载人 航天 工程 实施 以来 的 新 纪录 也 对 天宫 是否 宜 居 提出 了 挑战 天宫 是 我国 空间 实验室 的 雏形 也 是 我国 当前 个头 最 大 的 载人 航天器 拥有 的 实验舱 可 供 航天员 在 太空 工作 和 生活 如果 把 神 舟 飞船 比作 是 室 厅 那 天宫 就 是 别墅 我国 航天员 杨利伟 曾 形象 地 说 节点 中继 卫星 正式 使用 天 链 能否 畅通 载人 交会 对接 重点 在 安全 难点 在 测控 在 这次 任务 中 我国 自主 研制 的 天 链 星 星 将 正式 投入 使用 我国 载人 航天 测控 通信网 的 覆盖率 由 以前 的 提升 到 了 意味着 我们 可以 把 所有 的 重要 活动 安排 在 这些 弧 段 里 完成 不仅 可以 更 好 地 确保 航天员 的 安全 而且 可 使 关心 他们 的 人们 能够 更 了解 他们 的 实时 状态 节点 神女 下凡 能否 安全 着陆 当 女 男 航天员 乘坐 飞船 返回 舱 在 降落伞 的 牵引 下 缓缓 降落 时 将 定格 成神舟 与 天宫 载人 交会 对接 任务 成功 的 标志 然而 神女 下凡 并 不 轻松 在 飞船 再 次 进入 大气层 时 返回 舱 和 大 气 的 高速 摩擦 将 使 飞船 表面 达到 上 的 高温 同时 还 会 出现 黑 障 现象 使 飞船 与 地面 失去 无线电 联系 由于 急剧 减速 航天员 将 承受 于 地球 引力 的 过载 即便 经过 降落伞 和 反 推 发动机 的 缓冲 返回 舱 着陆 速度 也 会 达到 每 秒 到 为了 确保 航天员 安全 着陆 场 系统 对 快速 定位 快速 到达 精心 处置 返回 舱 等 环节 进行 了 改进 增加 了 医疗 救护 直升机 并 在 搜 救 直升机 上装 备 了 通信 吊 舱 确保 图像 和 语音 的 传输 更加 清晰 新闻 链 接 大 特点 难点 据 介绍 与 无 人 交会 对接 任务 相比 这次 载人 交会 对接 任务 具有 方面 的 特点 难点 是 实施 航天员 手 控 交会 对接 对 航天员 操作 的 精 准 性 和 灵敏 性 等 都 提出 了 更 高 要求 是 航天员 访问 在 轨 飞行器 也 就 是 天宫 我国 航天员 在 太空 中 住 进 神 舟 飞船 以外 的 地方 这 是 头 还 意味着 实现 地面 向 在 轨 飞行器 的 人员 和 物资 运输 与 补给 是 女 航天员 太空 飞行 验证 中国 女 航天员 选拔 训练 医学 监督 和 保障 以及 新 研制 的 女 航天员 乘员 飞行 装备 等 方面 是 航天员 在 轨 飞行 时间 较 长 大约 期间 将 开展 的 航天 医学 实验 和 空间站 部分 单项 技术 试验"; public static void main(String[] args) throws Exception { Vectorvec1 = new Vector<>(); Vector vec2 = new Vector<>(); Map idf = new HashMap<>(); XxSHashInitTfIdf(idf); XxSHashVector(idf, vec1, XX_DOC1); XxSHashVector(idf, vec2, XX_DOC2); Long sm1 = XxSHashGetSimHash(vec1); Long sm2 = XxSHashGetSimHash(vec2); XxSHashSimHashPrint(sm1); XxSHashSimHashPrint(sm2); Long ham = sm1 ^ sm2; XxSHashSimHashPrint(ham); XxSHashHamDistance(ham); } private static void XxSHashInitTfIdf(Map c) throws Exception { String buf = new String(); BufferedReader br = new BufferedReader(new FileReader(XX_FIDF)); while (null != (buf = br.readLine())) { String[] arr = buf.split("\t"); c.put(arr[0], new Double(arr[1])); } br.close(); } @SuppressWarnings("null") private static void XxSHashVector(Map c, Vector v, String s) throws Exception { Double val = null; String wds[] = null; Map doc = new HashMap<>(); MessageDigest md5 = MessageDigest.getInstance("MD5"); for (String w : (wds = s.split(" "))) { doc.put(w, null != (val = doc.get(w)) ? val + 1 : 1); } for (Map.Entry e : doc.entrySet()) { if (null != (val = c.get(e.getKey()))) { md5.update(e.getKey().getBytes()); e.setValue(e.getValue() / wds.length * val); v.add(new XxPair(XxSHashMd5Long(new BigInteger(1, md5.digest()).toString(16).toLowerCase()), e.getKey(), e.getValue())); } } Collections.sort(v, new Comparator () { public int compare(XxPair n, XxPair m) { return m.val.compareTo(n.val); } }); XxSHashVecPrint(v); } private static void XxSHashVecPrint(Vector v) { for (int idx = 0; idx < v.size(); ++ idx) { System.out.print(v.get(idx).key + ": [" + v.get(idx).val + "], "); } System.out.println(); } private static long XxSHashMd5Long(String s) { long rst = 0; byte[] md5 = s.getBytes(); for (int idx = 0; idx < md5.length; idx ++) { rst <<= 4; byte val = (byte) (md5[idx] - 48); if (val > 9) { val = (byte) (val - 39); } rst += val; } return rst; } private static Long XxSHashGetSimHash(Vector v) { Long sim = 0L; for (int bit = 0; bit < XX_BITS; bit ++) { Integer wgt = 0; for (int idx = 0; idx < v.size(); idx ++) { if (0 != (v.get(idx).md5 & XX_MASK[bit])) { wgt += (int) (v.get(idx).val * 100); } else { wgt -= (int) (v.get(idx).val * 100); } } sim |= wgt > 0 ? XX_MASK[bit] : 0; } return sim; } private static void XxSHashSimHashPrint(Long s) { for (int idx = 0; idx < XX_MASK.length; ++ idx) { if (0 != (s & XX_MASK[idx])) { System.out.print(1); } else { System.out.print(0); } } System.out.println(); } private static void XxSHashHamDistance(Long s) { int num = 0; while (0 != s) { s &= s -1; num += 1; } System.out.println("HamDistance: " + num); } }