从文本中获取特殊单词

时间:2012-06-27 15:39:14

标签: php mysql search text words

我正在尝试创建一个服务,用户将在其中输入一些文本数据,如博客文章或类似内容 我的服务将在其文本中替换一些“特殊单词”以获取链接。例如:

博客文章:

"...Pink Floyd were an English rock band that achieved international 
success with their progressive and psychedelic rock music..."

输出类似于:

"...<a href="http://www.xxx.com?q=pink%20floyd">Pink Floyd</a> 
were an English <a href="http://www.xxx.com?q=rock%20band">rock band</a>
that achieved international success with their 
progressive and psychedelic rock 
<a href="http://www.xxx.com?q=music">music<a/>..."

类似维基百科的内容!

通用算法似乎很简单:

  1. 从文本中删除特殊字符。
  2. 剥离标签。
  3. 小写全文。
  4. 删除停用词。
  5. 请向数据库咨询剩余的字样。
  6. 获取原始文本并替换数据库中匹配的单词。
  7. 但问题是,我在数据库中处理大约100万字。 我正在使用PHP和MySQL,据我所知,PHP可能不是文本处理的最佳工具。

    我担心性能,取决于流量和请求的数量,这个algol可能非常慢......

    我试图找到另外的工具或方法来解决这个问题,我发现了很多东西,但我认为当时没有一个是 适合工作的正确工具。 我发现mysql全文搜索,搜索lucene,sphinx,solr。如果我错了,请纠正我,但我认为他们不适合这种工具 搜索范围。

    有人可以建议我如何正确处理这个问题。

    需要考虑的事项:

      
        
    1. 不幸的是,文字是葡萄牙语“pt-br”,我认为这将是一个问题。
    2.   
    3. 它需要获得完整的术语,在上面的例子中它将不得不采取“摇滚乐队”而不是分裂成“摇滚乐”和“乐队”。
    4.   
    5. 我对其他编程语言没有更深入的了解,但如果是这种情况,我也会对其他技术开放!
    6.   

    感谢

1 个答案:

答案 0 :(得分:1)

不要担心此问题的表现。

你可以随时:

  • 在db
  • 中使用索引
  • 对停用词数据库或输出文本
  • 使用缓存(例如memcached)
  • 使用sphinx(搜索引擎,与MySQL配合使用)
  • 将格式化文本保存在数据库中(如果不明确扩展停用词数据库,则为最佳解决方案)

也是在db:

中搜索停用词的代码示例
...
$words = strip_tags($origin);
$words = strtolower($words);
// strip anything (symbols, numbers, etc), keep only words
...
$words = explode(' ', $words);
$found = DB::query(Database::SELECT, "SELECT url, word FROM `stop_words` WHERE word IN (".implode(',',$words).")")->execute()->as_array(); // Kohana framework Database module
$patterns = array();
$replacement = array();
foreach($found AS $row)
{
  $patterns[] = '/('.$row['word'].')/i';
  $replacement[] = '<a href="'.$row['url'].'">$1</a>';
}
$origin = preg_replace($patterns, $replacement, $origin);