1. 程式人生 > >Scala實現精簡版SimHash計算

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