mysql文章相似度計算 文章相似度計算

2021-10-17 17:45:46 字數 3857 閱讀 5607

文章內容相似度計算幾種方式及優缺點

php 內建方法 similar_text

similar_text 是php內建的字串相似度對比函式,是使用方式最便捷的一種,但是因為它的時間複雜度是 o(n**3),處理時間會隨著內容長度增加,若比較5000字以上的文章,或者比較文章的量級比較大不建議使用,只是單篇文章對單篇文章可以使用。

通過分詞進行余弦相似度對比

解決方案是首先進行文章分詞可以用結巴或者迅搜分詞服務進行文章分詞,然後將需要對比的文章分詞結果存入redis,在有新文章進行對比的時候從redis將所有文章的分詞結果從記憶體中取出來然後進行相似度對比,逐詞進行相似度計算。相似度計算的準確性很高,但是對比的文章量非常大的時候,處理時間還是會很長,5000文章的相似度計算需要近30s

主要計算**:

class textsimilarity

* [排除的詞語]

* @var array

private $_excludearr = array('的', '了', '和', '呢', '啊', '哦', '恩', '嗯', '吧');

* [詞語分布陣列]

* @var array

private $_words = array();

* [分詞後的陣列一]

* @var array

private $_seglist1 = array();

* [分詞後的陣列二]

* @var array

private $_seglist2 = array();

private static $test1 = array();

private static $test2 = array();

* [分詞兩段文字]

* @param [type] $text1 [description]

* @param [type] $text2 [description]

public function __construct($text1, $text2)

$this->_seglist1 = is_array( $text1 ) ? $text1 : $this->segment( $text1 );

$this->_seglist2 = is_array( $text2 ) ? $text2 : $this->segment( $text2 );

* [外部呼叫]

* @return [type] [description]

public function run()

$this->analyse();

$rate = $this->handle();

return $rate ? $rate : 'errors';

* [分析兩段文字]

private function analyse()

//t1

foreach ($this->_seglist1 as $v) else else {

$this->_words[$v][1] += 1;

* [處理相似度]

* @return [type] [description]

private function handle()

$sum = $sumt1 = $sumt2 = 0;

foreach ($this->_words as $word) {

$sum += $word[0] * $word[1];

$sumt1 += pow($word[0], 2);

$sumt2 += pow($word[1], 2);

$rate = $sum / (sqrt($sumt1 * $sumt2));

return $rate;

* [分詞 【

* @param [type] $text [description]

* @return [type] [description]

* @description 分詞只是乙個簡單的例子,你可以使用任意的分詞服務

private function segment( $text )

$outtext = array();

$xs = new xs('demo'); // 必須先建立乙個 xs 例項,否則會丟擲異常

$tokenizer = new xstokenizerscws; // 直接建立例項

$tokenizer->setignore();

//處理

$outtext = $tokenizer->setmulti(1)->getresult($text);

$outtext = array_column( $outtext, 'word');

$res = $xs->getscwsserver();

$res->close();

return $outtext;

simhash

主要計算**:

class simhash

protected static $length = 256;

protected static $search = array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');

protected static $replace = array('0000','0001','0010','0011','0100','0101','0110','0111','1000','1001','1010','1011','1100','1101','1110','1111');

* [排除的詞語]

* @var array

private static $_excludearr = array('的', '了', '和', '呢', '啊', '哦', '恩', '嗯', '吧','你','我',' ');

public static function get(array &$set)

$boxes = array_fill(0, self::$length, 0);

if (is_int(key($set)))

$dict = array_count_values($set);

else

$dict = &$set;

foreach ($dict as $element => $weight) {

if ( in_array($element, self::$_excludearr )){

continue;

$hash = hash('sha256', $element);

$hash = str_replace(self::$search, self::$replace, $hash);

$hash = substr($hash, 0, self::$length);

$hash = str_pad($hash, self::$length, '0', str_pad_left);

for ( $i=0; $i < self::$length; $i++ ) {

$boxes[$i] += ($hash[$i] == '1') ? $weight : -$weight;

$s = '';

foreach ($boxes as $box) {

if ($box > 0)

$s .= '1';

else

$s .= '0';

return $s;

public static function hd($h1, $h2)

$dist = 0;

for ($i=0;$i<:>

if ( $h1[$i] != $h2[$i] )

$dist++;

return (self::$length - $dist) / self::$length;

標題相似度演算法 乙個簡單的計算文章相似度功能!

在做文章系統的時候,很多時候需要為這篇文章推薦最相近的文章。通過這樣進行匹配,查詢出來的結果是包含 茶 和 功效 的所有文章。在顯示上,第一篇排在第二篇的上面。那麼,如何做到最匹配的文章呢?words 茶,功效 otitle 用靈芝泡茶的功效 otitletwo 泡茶的功效與作用 echo strp...

SimHash演算法 文章相似度匹配

jieba分詞 seg jieba.cut content 去除停用詞永祥 jieba.analyse.set stop words stopwords.txt 得到前20個分詞和tf idf權值 keywords jieba.analyse.extract tags join seg topk 2...

余弦相似性 找出相似文章

為了找出相似的文章,需要用到 余弦相似性 cosine similiarity 下面,我舉乙個例子來說明,什麼是 余弦相似性 為了簡單起見,我們先從句子著手。句子a 我喜歡看電視,不喜歡看電影。句子b 我不喜歡看電視,也不喜歡看電影。請問怎樣才能計算上面兩句話的相似程度?基本思路是 如果這兩句話的用...