计算词频,即分词后计算文章的总词数和每个词的出现次数,词数较多可取TOPk
//$tf = 词出现次数 / 总词数 |
计算IDF,语料可使用百度/Google结果数:
//$idf = log( 总文档数 / 包含词的文档数, 2); $idf = log( $total_document_count / $documents_with_term , 2); |
计算TF-IDF,值越大分类能力越强:
$tfidf = $tf * $idf |
首先使用TF-IDF算法提取两篇文章的关键词,并合并成一个集合,
如关键词较多可使用堆取TOPK关键词。
然后计算每篇文章对于这个集合中的词的词频,即单词数/总词数,然后生成各自词频向量。
PHP计算相似度示例代码如下:
<?php
function
similarity(
array
$vec1
,
array
$vec2
) {
return
dotProduct(
$vec1
,
$vec2
) / (absVector(
$vec1
) * absVector(
$vec2
));
}
function
dotProduct(
array
$vec1
,
array
$vec2
) {
$result
= 0;
foreach
(
array_keys
(
$vec1
)
as
$key1
) {
foreach
(
array_keys
(
$vec2
)
as
$key2
) {
if
(
$key1
===
$key2
)
$result
+=
$vec1
[
$key1
] *
$vec2
[
$key2
];
}
}
return
$result
;
}
function
absVector(
array
$vec
) {
$result
= 0;
foreach
(
array_values
(
$vec
)
as
$value
) {
$result
+=
$value
*
$value
;
}
return
sqrt(
$result
);
}
//文章词频向量
$v1
=
array
(
'我们'
=> 5,
'设计'
=> 2,
'一个'
=> 1,
'算法'
=>0,
'任意'
=> 0,
'相似'
=> 1);
$v2
=
array
(
'我们'
=> 5,
'设计'
=> 0,
'一个'
=> 3,
'算法'
=>0,
'任意'
=> 0,
'相似'
=> 1);
//计算相似度,值越大相似程度越高
$result1
= similarity(
$v1
,
$v2
);
var_dump(
$result1
);