2

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

博文:

"...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. 获取原文并替换数据库中匹配的单词。

但问题是,我正在处理我的数据库中大约 100 万个单词。我为此使用 PHP 和 MySQL,据我所知 PHP 可能不是文本处理的最佳工具。

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

我试图找到另一种工具或方法来处理这个问题,我发现了很多东西,但我认为这些都不是适合这项工作的工具。我找到了mysql全文搜索,搜索lucene,sphinx,solr。如果我错了,请纠正我,但我认为它们不是这种搜索的正确工具。

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

需要考虑的事项:

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

谢谢

4

1 回答 1

1

不要担心这个问题的性能。

您可以随时:

  • 在数据库中使用索引
  • 对停用词数据库或输出文本使用缓存(例如 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);
于 2012-06-27T15:46:54.570 回答