php匹配相似单词

Posted kangjianrong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php匹配相似单词相关的知识,希望对你有一定的参考价值。

最近在使用一款app背单词的时候,会在某个单词下面,列出与之相类似的单词。于是我在想这个功能是如何做的,自己使用php版本,做了个简单的例子。

大致思路如下:

1、生成英文单词库,并将单词放置redis里(当然放数据库也可以)

2、得到用户单词,生成与之相类似的单词

首先我们看第一步,我的做法是,从网上找一个很大的文本,big.txt。这个文本包含了几万个单词,然后利用正则,将里面的单词,拿出来并存到redis库里面。

但问题是,我们在使用php读取大文件时,并还要利用正则去匹配单词的话,这个动作是非常消耗内存的,于是我的做法是,一行一行的去读取文本,并把这行

里面的单词,在取出来,存到库里。

核心代码如下:

public function word($perLine){		
	preg_match_all(‘/[a-z]+/i‘,$perLine,$matches);
	if($matches[0]){
		foreach ($matches[0] as $key => $value) {
			$word = strtolower($value);
			if($this -> redisObj->exists($word)){
				$this -> redisObj->incr($word);

			}else{

				$this -> redisObj->set($word, 1);
			}
		}
	}
}

/** 
 * 返回文件从X行到Y行的内容(支持php5、php4)  
 * @param string $filename 文件名
 * @param int $startLine 开始的行数
 * @param int $endLine 结束的行数
 * @return string
 */
public function getFileLines($filename, $startLine = 1, $endLine=50, $method=‘rb‘) {
    $content = array();
    $count = $endLine - $startLine;  
    // 判断php版本(因为要用到SplFileObject,PHP>=5.1.0)
    if(version_compare(PHP_VERSION, ‘5.1.0‘, ‘>=‘)){
        $fp = new SplFileObject($filename, $method);
        $fp->seek($startLine-1);// 转到第N行, seek方法参数从0开始计数
        for($i = 0; $i <= $count; ++$i) {
            $lineContent=$fp->current();// current()获取当前行内容
            $this -> word($lineContent);
            $fp->next();// 下一行
        }
    }
} 

  

这个程序代码,可能要执行比较长的时间,根据个人电脑而定,反正我的电脑执行了差不多有个把小时。好吧,总之这样,我们自己就制作了个词库,虽然并没有包含所有单词,不过至少测试是可以的啦。

 

以上是关于php匹配相似单词的主要内容,如果未能解决你的问题,请参考以下文章

PHP 代码片段

如何从TfidfVectorizer计算余弦相似度?

如何搜索与其他单词相似的单词?

utf-8中的php正则表达式单词边界匹配

如何使用 WordNet 路径算法计算两个字符串中单词的语义相似度

21个常用代码片段