Scala實現精簡版SimHash計算
前面一篇文章介紹了SimHash演算法的基本原理和主要的應用場景。由於SimHash演算法是一種在大規模資料下解決文字相似與否的演算法,這篇文章主要介紹一下自己基於Scala實現的一種精簡版SimHash演算法。
演算法思路:
對於一個文字內容,先使用正則表示式對無意義字元進行過濾,再以滑動切片的方法將文字切成一個字串陣列,其中滑動切片視窗的閾值視情況而定。然後對該字串陣列,進行權重派分。程式碼中給出了字首、字尾和平攤的方案進行派分,權重賦值為1和3(詳細請看程式碼)。然後通過雜湊函式對每個分片字串進行計算,並生成該分片的權重陣列。接下來把所有分片權重陣列累加,再將64位權重陣列大於0的位置1,其餘置0,生成最終的SimHash值。
雜湊值計算,由於生成64位雜湊值,為了方便後面操作,使用位陣列。
def byte2Bools(b: Byte) =
(0 to 7).foldLeft(ArrayBuffer[Boolean]())((bs, i) => bs += isBitSet(b, i)).reverse
def isBitSet(byte: Byte, bit: Int) =
((byte >> bit) & 1) == 1
def hashFuc(st:String):ArrayBuffer[Boolean] ={
var str
=org .apache.commons.codec.digest.DigestUtils.md5Hex(st)
var hashV = new java.math.BigInteger(str,16)
var hashArrByte =hashV.toByteArray()
var hashArrBoolean = ArrayBuffer[Boolean]()
var len = hashArrByte.length
for(i<- 0 to len-1){
var temArr = byte2Bools(hashArrByte(i))
hashArrBoolean ++=temArr
}
hashArrBoolean
}
正則過濾函式,用來給文字去掉意義不大的字元。
def tokenlize(str:String):ArrayBuffer[String]={
var reg = """[\w\u4e00-\u9fcc]+""".r
var s = str.toLowerCase()
var reStr = (reg findAllIn s).mkString("")
var ans = slide(reStr)
ans
}
滑動切片函式,用來將文字切片。
def slide(str:String): ArrayBuffer[String] ={
val slideWidth = 4
var len = str.length
var res = ArrayBuffer[String]()
var a = 0
if(len>=4){
for(a <- 0 to (len - slideWidth)){
var s = str.slice(a,a+slideWidth)
res+=s
}
}else{
res+= str
}
res
}
對切片陣列賦予權重
def weightCul(Type:String,length:Int):ArrayBuffer[Int] = {
var weights = ArrayBuffer[Int]()
val len = length/2 + 1
val a = 1
if(weightType=="pre"){
for(a<- 1 to len){
weights+= 3
}
for(a<- 1 to length-len){
weights+= 1
}
}else{
if(weightType=="suf"){
for (a<- 1 to length-len){
weights+= 1
}
for (a<- 1 to len){
weights+= 3
}
}else{
for (a<- 1 to length){
weights+= 1
}
}
}
weights
}
對文字進行SimHash值計算
def buildByArr(fea:ArrayBuffer[(String, Int)]):String = {
var v = ArrayBuffer[Int]()
val f = 64
for (i<- 1 to f){
v+= 0
}
var len=fea.length
for (j<- 0 to len-1){
var feature = fea(j)
var hashArr = hashFuc(feature._1)
var weight = feature._2
var hLen = hashArr.length
for(a<-0 to f-1){
if ((hashArr(hLen-1-a))){
v(a)+= weight
}else{
v(a)-= weight
}
}
}
var list = new java.math.BigInteger("0")
for(k<- 0 to f-1){
if(v(k)>0){
list = list.setBit(k)
}
}
val simHash = list.toString
SimHash
}
至此,就可以計算出在不同權重方案下SimHash的值。
這種計算方法比較適合較短文字的計算,長文字採用分詞的方式較為有效。
相關推薦
Scala實現精簡版SimHash計算
前面一篇文章介紹了SimHash演算法的基本原理和主要的應用場景。由於SimHash演算法是一種在大規模資料下解決文字相似與否的演算法,這篇文章主要介紹一下自己基於Scala實現的一種精簡版SimHash演算法。 演算法思路: 對於一個文字內容,先使用正則表
過載運算子實現精簡版string類
c語言利用陣列儲存字串,經常在不經意中浪費了大量的空間,使用起來十分的不方便,而且容易出錯,為了解決c語言字串的問題,c++增加了一個string類。本例就是為了說明通過運算子的過載而實現的。 程式碼如下: #include<iostream> using n
精簡版 koa 簡單實現
一、 Application 模組的簡單封裝 首先我們先簡單封裝一個模組 Application 保證服務的正常執行; 初始化一個專案 $ npm init -y ... 複製程式碼 建立檔案 application.js 並並編寫如下程式碼; const http =
Vuex和Redux都使用的Flux設計模式精簡版實現
作者:殷榮檜@騰訊 目錄: 1. 為什麼需要Flux設計模式 2. Flux設計模式是怎麼實現的 本文對應Github地址,如果覺得文章還可以,希望您送上寶貴的Star 老外搞個新東西就喜歡給其取個Cool的名字,什麼Flux,Redux,Meteor。本來英語就不是太好的中國人一看就跑路了,W
Scala入門第十一篇--Akka實現簡易版的spark通訊框架
本次我們介紹使用Akka實現簡易的Spark通訊框架,主要分為: Akka簡介 提出需求 需求分析 程式碼示例 Akka簡介 Akka基於Actor模型,提供了一個用於構建可擴充套件的(Scalable)、彈性的(Resilient)、快速響應的(Resp
wangEditor 修改 “視訊”選單 的實現方式,達到上傳視訊的功能---精簡版
/* menu - video */ // 建構函式 function Video(editor) { this.editor = editor; this.$elem = $('<div class="w-e-menu"><i cl
MVP框架用於實現登入註冊的方法和步驟_精簡版原始碼
下面寫一下登入註冊的步驟 1.先搭建一個MVP的框架 2.然後把登入祖冊融入到MVP框架中 4.再把最基本的佈局寫一下 5.然後寫登入的原始碼 6.最後把註冊的原始碼寫一下 這是最基本的步驟,寫的不是很詳細還望大家多多見諒 第一步先把依賴寫一下,這是最重要的 我把我這個專案的依賴給全部複
Faster-rcnn 計算mAP程式精簡版
由於Faster-rcnn裡的計算mAP程式裡面有很多巢狀,移植到自己的卷積網路框架下很麻煩,所以把這些巢狀都整合起來方便使用,整合之後的程式只包括test_net.py和voc_eval.py 下面是test_net.py import _init_p
Scala實現Pearson皮爾遜相似度計算
皮爾遜相似度是推薦演算法中常見的 計算相似度的方法,其公式如下: 從公式可以看出 該演算法有幾個缺點: 1,如果使用者A對所有item的評分都一樣,那麼將無法計算別人跟A的相似度(分母為0);所以該演算法不適用於 boolean preference型別的推薦 2,如果
vue實現tab切換功能精簡版
clas none nbsp port () lin line emp click <template> <div> <p class="tabs" v-for="(list,index) in lists"
安裝虛擬機精簡版centos7
png vmw url 自己 tail 其他 配置ip 虛擬 tools 相信大家都想在linux系統下開發,但是又希望自己的電腦是win。我與大家一樣,所以今天就試著裝虛擬機centos來區分開發。 首先安裝虛擬機。 一、下載資源 1、虛擬機VMware Workst
模擬實現簡化版List叠代器&嵌入List
元素 sort 可能 節點數 != ring type 部分 分配 1、叠代器(iterators)概念(1)叠代器是一種抽象的設計概念,其定義為:提供一種方法,使他能夠按順序遍歷某個聚合體(容器)所包含的所有元素,但又不需要暴露該容器的內部表現方式。 (2)叠代器是一種行
Scala實現Mapreduce程序4-----數據去重
text tracker rtb () 輸出 pack eric 去重 ray 數據去重,key只輸出一次 scala實現:先groupByKey(),然後SortByKey(),然後輸出keys object Reduplicate { def main(args:
實現簡易版的moment.js
date對象 hour getdate git .get ice ace -m mon github源碼地址: www.baidu.com 作者: 易憐白 項目中使用了時間日期的處理方法,只使用了部分方法,為了不在引入第三方的庫(moment.js),這裏自己封
DIOCP 小白精簡版
接口 我們 original .org 連接 以及 百度 hash codec DIOCP 修改版(YangYxd) 【當前版本】2015.05.27.001 【主要更改】– —————&mdash
使用Chrome Headless 快速實現java版數據的抓取
chrome headless java調webkit 參考《使用Chrome快速實現數據的抓取(一)——概述》和《使用Chrome快速實現數據的抓取(二)——協議》。各協議客戶端實現參考:https://github.com/ChromeDevTools/awesome-chrome-devtoo
CentOS 7 精簡版安裝後聯網問題
ifcfg 內容 har 查看 clas res fab centos uuid 一、首先查看網絡情況:ifconfig 命令 二、打開修改/etc/sysconfig/network-scripts/ifcfg-enp0s3(註意ifcfg-enp0s3這個文件是隨機的不
[置頂][終極精簡版][圖解]Nginx搭建flv mp4流媒體服務器
layer 所有 make 精簡 節點 tran clas 測試 provider 花了我接近3周,歷經了重重問題,今日終於把流媒體服務器搞定,趕緊的寫個博文以免忘記。。。 起初是跟著網上的一些教程來的,但是說的很不全面,一些東西也過時不用了(比如jwplayer老版
Vue初體驗——用Vue實現簡易版TodoList
一個 link this clas 教程 show success gen strong 最近在學習Vue,斷斷續續看完了官方教程的基礎部分,想練一下手熟悉一下基本用法,做了一個簡易版的TodoList 效果: 代碼: HTML: 1 <!DOC
精簡版—憤慨的小鳥
into erp article type 由於 append alt 小遊戲 tracking 首先我們要布局一下。使用sizeclass來布局: 連線過來: @property (weak, nonatomic) IBOutlet