php自带函数 similar_text 可以计算两个字符串的相似度.这里不做详细说明
这里主要记录使用phpanalysis分词后使用余弦定理定理计算两个字符串相似度
phpanalysis分词使用相对简单
1,下载phpanalysis 链接https://download.csdn.net/download/yu_yi_yu/87473855
2,新建一个计算相似度类方便调用-textSimilar.class.php
代码如下
<?php
/*
* 求两个文本的相似度(余弦定理)
* 使用
* $obj = new textSimilar();
* $p = $obj->get_similar_percent($str1, $str2);
*/
require ROOT . '/title/WordAnalysis/phpanalysis.class.php';//这里改成自己WordAnalysis所在目录
class textSimilar {
# 计算两个字符串的余弦相似度
function get_similar_percent($str1, $str2) {
$str1_arr = $this->get_str_arr($str1);
$str2_arr = $this->get_str_arr($str2);
//dd($str1_arr, $str2_arr);
$res_arr = [];
foreach ($str1_arr as $word) {
if (!isset($res_arr[$word])) {
$res_arr[$word] = ['A' => 1, 'B' => 0];
}
else {
$res_arr[$word]['A'] += 1;
}
}
foreach ($str2_arr as $word2) {
if (!isset($res_arr[$word2])) {
$res_arr[$word2] = ['A' => 0, 'B' => 1];
}
else {
$res_arr[$word2]['B'] += 1;
}
}
$x = 0;
$y1 = 0;
$y2 = 0;
foreach ($res_arr as $v) {
$x += $v['A'] * $v['B'];
$y1 += $v['A'] * $v['A'];
$y2 += $v['B'] * $v['B'];
}
return ($y1 == 0 || $y2 == 0) ? -1 : ($x / (sqrt($y1) * sqrt($y2))) * 100;
}
/**
* 分词
*/
private function get_str_arr($text) {
$text_arr = [];
$obj = new PhpAnalysis('utf-8', 'utf-8', false);
$obj->LoadDict();
$obj->SetSource($text);
$obj->StartAnalysis(false);
$result = $obj->GetFinallyResult();
$result = explode(' ', $result);
foreach ($result as $value) {
if (!empty($value)) {
$text_arr[] = $value;
}
}
return $text_arr;
}
}
3,使用代码
require './WordAnalysis/textSimilar.class.php';
$obj = new textSimilar();
$n= $obj->get_similar_percent('中文分词及提取关键字','中文分词并提取关键字记录');