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();// 下一行
        }
    }
}

  

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

时间: 2024-10-30 09:10:58

php匹配相似单词的相关文章

Java如何在正则表达式中匹配重复单词?

在Java编程中,如何在正则表达式中匹配重复单词? 以下示例显示了如何使用regex.Matcher类的p.matcher()方法和m.group()方法在正则表达式中搜索重复的单词. package com.yiibai; import java.util.Scanner; import java.io.*; import java.util.regex.*; import java.util.ArrayList; public class SearchingDuplicateWords {

vim的撤销和恢复操作以及匹配当前单词操作

今天顺便看了一下vim的一点命令,记录一下 1.撤销上一次操作和恢复上一次操作: u → undo <C-r> → redo 2.搜索上一个单词和下一个单词 * 和 #: 匹配光标当前所在的单词,移动光标到下一个(或上一个)匹配单词(*是下一个,#是上一个)

Eclipse背景和匹配出现单词的一些设置

Eclipse的背景色和关键词的设置这里就不多说了,只说明设置路径: 背景色:[Window]--->[Preference]-->[General]--->[Editors]--->[Text Editors]: [Line number foreground]是编辑行号的颜色,我的习惯是设置成 R:190,G:214,B:255 [Background color]是编辑背景色,我的习惯是设置成 R:61,G:61,B:61 上面选项中有个[Highlight current

单词匹配二

Word Ladder II 一.看了许久的单词翻译大概知道啥意思了 Given: start ="hit" end ="cog" dict =["hot","dot","dog","lot","log"] 变换一个单词并且在字典中,然后匹配到结尾的单词. 我觉得网上看的那个变换26个字母有点蠢啊. 二.思路 突然发现这样做可不可以.根据终点反推符合的单词,依次反推.

Vim 匹配相同的单词并高亮

将光标移动到要匹配的单词处: "g + d" :高亮显示所有相同的单词 shift + "*" :向下查找相同单词并高亮显示 shift + "#" :向上查找相同单词并高亮显示 命令行模式下输出:"noh" 命令取消高亮显示 原文地址:https://www.cnblogs.com/GyForever1004/p/8449110.html

day6 反射,hashlib模块,正则匹配,冒泡,选择,插入排序

一.反射(自省) 首先通过一个例子来看一下本文中可能用到的对象和相关概念. import sys # 模块,sys指向这个模块对象import inspectdef foo(): pass # 函数,foo指向这个函数对象 class Cat(object): # 类,Cat指向这个类对象 def __init__(self, name='kitty'): self.name = name def sayHi(self): # 实例方法,sayHi指向这个方法对象,使用类或实例.sayHi访问

实用正则表达式匹配和替换

正则表达式非常有用,查找.匹配.处理字符串.替换和转换字符串,输入输出等.而且各种语言都支持,例如.NET正则库,JDK正则包, Perl, JavaScript等各种脚本语言都支持正则表达式.下面整理一些常用的正则表达式. 字符与描述 \ : 将下一个字符标记为一个特殊字符.或一个原义字符.或一个 向后引用.或一个八进制转义符.例如,'n' 匹配字符 "n".'\n' 匹配一个换行符.序列 '\\' 匹配 "\" 而 "\(" 则匹配 &quo

shell 正则表达式与文件名匹配

1) . : 匹配任意单ASCII 字符,可以为字母,或为数字.2) 举例: ..XC..匹配deXC1t.23XCdf等,.w..w..w.匹配rwxrw-rw-行首以^匹配字符串或字符序列1) ^ : 允许在一行的开始匹配字符或单词.2) 举例: ^.01 匹配0011cx4.c01sdf 等,^d 匹配drwxr-xr-x.drw-r--r--等 行尾以$匹配字符串或字符 1) $ : 在行尾匹配字符串或字符,$符号放在匹配单词后.2) 举例: trouble$ 匹配以单词trouble结

Flex的正则表达式匹配速度与手工代码的比较

flex是一个词法分析器生成器,它是编译器和解释器编程人员的常用工具之一.flex的程序主要由一系列带有指令(称为动作代码)的正则表达式组成.在匹配输入时,flex会将所有的正则表达式翻译成确定性有穷自动机,这使得flex等词法分析器生成器生成的词法分析器匹配输入模式的效率非常高.当然,有人指责flex不够灵活,功能有限,很多问题都无法解决,比如Javascript.C++等语言中二义性的问题,实际上很多程序(比如Python的解释器)的词法分析器都是用的手工代码而不是flex自动生成的.这些都