Rumah > php教程 > php手册 > php文章相似度计算similar_text()函数升级

php文章相似度计算similar_text()函数升级

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Lepaskan: 2016-05-25 16:44:06
asal
1577 orang telah melayarinya

有时我们希望调用相关文章时肯定调用相似度高的我先是使用了php的similar_text()函数,但是测试两个相同的标题得出结果只有40%左右啊,下面看实例.

php默认有个函数similar_text()用于计算字符串之间的相似度,该函数也可以计算两个字符串的相似度(以百分比计),不过这个函数感觉对中文计算很不准确比如:

echo similar_text("吉林禽业公司火灾已致112人遇难","吉林宝源丰禽业公司火灾已致112人遇难"); 

这两个新闻标题其实都是一样的,如果使用similar_text()相似对结果为:42,即只相似42%,所以这个感觉很不靠谱,今天刚好收集到一段PHP代码也是用于比较两个字符串的相似度,直接贴出代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

<?php 

    class LCS {

        var $str1;

        var $str2;

        var $c = array();

        /*返回串一和串二的最长公共子序列

    */

        function getLCS($str1, $str2, $len1 = 0, $len2 = 0) {

            $this->str1 = $str1;

            $this->str2 = $str2;

            if ($len1 == 0) $len1 = strlen($str1);

            if ($len2 == 0) $len2 = strlen($str2);

            $this->initC($len1, $len2);

            return $this->printLCS($this->c, $len1 - 1, $len2 - 1);

        }

        /*返回两个串的相似度

    */

        function getSimilar($str1, $str2) {

            $len1 = strlen($str1);

            $len2 = strlen($str2);

            $len = strlen($this->getLCS($str1, $str2, $len1, $len2));

            return $len * 2 / ($len1 + $len2);

        }

        function initC($len1, $len2) {

            for ($i = 0; $i < $len1; $i++) $this->c[$i][0] = 0;

            for ($j = 0; $j < $len2; $j++) $this->c[0][$j] = 0;

            for ($i = 1; $i < $len1; $i++) {

                for ($j = 1; $j < $len2; $j++) {

                    if ($this->str1[$i] == $this->str2[$j]) {

                        $this->c[$i][$j] = $this->c[$i - 1][$j - 1] + 1;

                    } else if ($this->c[$i - 1][$j] >= $this->c[$i][$j - 1]) {

                        $this->c[$i][$j] = $this->c[$i - 1][$j];

                    } else {

                        $this->c[$i][$j] = $this->c[$i][$j - 1];

                    }

                }

            }

        }

        function printLCS($c, $i, $j) {

            if ($i == 0 || $j == 0) {

                if ($this->str1[$i] == $this->str2[$j]) return $this->str2[$j];

                else return "";

            }

            if ($this->str1[$i] == $this->str2[$j]) {

                return $this->printLCS($this->c, $i - 1, $j - 1).$this->str2[$j];

            } else if ($this->c[$i - 1][$j] >= $this->c[$i][$j - 1]) {

                return $this->printLCS($this->c, $i - 1, $j);

            } else {

                return $this->printLCS($this->c, $i, $j - 1);

            }

        }

    }

      

    $lcs = new LCS();

    //返回最长公共子序列

    $lcs->getLCS("hello word","hello china");

    //返回相似度

    echo $lcs->getSimilar("吉林禽业公司火灾已致112人遇难","吉林宝源丰禽业公司火灾已致112人遇难");

Salin selepas log masuk

同样输出结果为:0.90322580645161,明显准确的多,还有一种办法就是利用分词系统我们把标题分词,然后再进行会更准确一些.

教程网址:

欢迎收藏∩_∩但请保留本文链接。

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Cadangan popular
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan