从文本块中提取相关标签/关键字

Posted

技术标签:

【中文标题】从文本块中提取相关标签/关键字【英文标题】:Extract Relevant Tag/Keywords from Text block 【发布时间】:2011-06-17 05:19:53 【问题描述】:

我想要一个特定的实现,以便用户提供如下文本块:

"要求 - 工作知识,使用 Linux、Apache 2 的 LAMP 环境, mysql 5 和 php 5, - 了解 Web 2.0 标准 - 使用 JSON 很舒服 - 使用框架、Zend、OOP 的实践经验 - 跨浏览器 javascripting、JQuery 等。 - 版本控制软件的知识,如子版本将是 更可取。”

我要做的是自动选择相关关键字并创建标签/关键字,因此对于上面的一段文本,相关标签应该是:mysql、php、json、jquery、版本控制、oop、web2。 0、javascript

我怎样才能在 PHP/Javascript 等中进行呢?抢先一步会很有帮助。

【问题讨论】:

【参考方案1】:

一个非常幼稚的方法是从文本中删除常见的stopwords,留下更有意义的词,如“标准”、“JSON”等。然而,你仍然会得到很多噪音,所以你可以考虑像OpenCalais 这样的服务可以对您的文本进行相当复杂的分析。

更新:

好的,我之前回答中的链接指向了实现,但是您要求提供一个,所以这里是一个简单的:

function stopWords($text, $stopwords) 

  // Remove line breaks and spaces from stopwords
    $stopwords = array_map(function($x)return trim(strtolower($x));, $stopwords);

  // Replace all non-word chars with comma
  $pattern = '/[0-9\W]/';
  $text = preg_replace($pattern, ',', $text);

  // Create an array from $text
  $text_array = explode(",",$text);

  // remove whitespace and lowercase words in $text
  $text_array = array_map(function($x)return trim(strtolower($x));, $text_array);

  foreach ($text_array as $term) 
    if (!in_array($term, $stopwords)) 
      $keywords[] = $term;
    
  ;

  return array_filter($keywords);


$stopwords = file('stop_words.txt');
$text = "Requirements - Working knowledge, on LAMP Environment using Linux, Apache 2, MySQL 5 and PHP 5, - Knowledge of Web 2.0 Standards - Comfortable with JSON - Hands on Experience on working with Frameworks, Zend, OOPs - Cross Browser Javascripting, JQuery etc. - Knowledge of Version Control Software such as sub-version will be preferable.";

print_r(stopWords($text, $stopwords));

你可以在这个Gist中看到这个,以及stop_word.txt的内容。

在您的示例文本上运行上述代码会生成以下数组:

Array
(
    [0] => requirements
    [4] => linux
    [6] => apache
    [10] => mysql
    [13] => php
    [25] => json
    [28] => frameworks
    [30] => zend
    [34] => browser
    [35] => javascripting
    [37] => jquery
    [38] => etc
    [42] => software
    [43] => preferable
)

所以,就像我说的那样,这有点幼稚,可以使用更多优化(而且速度很慢),但它确实会从您的文本中提取更相关的关键字。您还需要对停用词进行一些微调。捕获像Web 2.0 这样的术语将非常困难,所以我认为你最好使用像 OpenCalais 这样的严肃服务,它可以理解文本并返回实体和参考列表。 DocumentCloud 依靠这项服务从文档中收集信息。

此外,对于客户端实现,您可以使用 JavaScript 做几乎相同的事情,而且可能更简洁(尽管客户端可能会很慢。)

【讨论】:

谢谢达伦。它确实很天真,但非常详尽,你能推荐一个实现吗,即使用 preg_replace 之类的东西或一些有效的匹配脚本? 太棒了!感谢您的实施。 这能回答你的问题吗? 他的作业是我感兴趣的。你的回答很好。打开加莱看起来不​​错,但只有英文!投票了 4u【参考方案2】:

今天早上我对这些进行了快速回顾,令我惊讶的是,在我的测试短语中表现最好的一个是用 PHP 编写的

http://code.fivefilters.org/term-extraction 演示:http://fivefilters.org/term-extraction/

看起来最专业的表演非常小:viewer.opencalais.com

其他没问题的(不确定它们是用什么语言编写的)

www.nactem.ac.uk/software/termine/#form www.alchemyapi.com/api/keyword/

【讨论】:

不幸的是,该代码的链接不再有效,而且该代码似乎已付费。我设法发现它基于 Topia 术语提取器的 PHP 端口:bitbucket.org/fivefilters/term-extraction/src/master【参考方案3】:

这并不容易,因为它需要某种类型的模糊逻辑。你应该使用 Yahoo Term extractor YQL

查看:link

【讨论】:

感谢您的链接,我正在寻找这样的东西。我尝试了 YQL,但不知何故它无法识别很多术语。发现这个名为 Zemanta 的网站不错,我打算同时使用这两个网站并合并我的结果。 这是我 5 年来在互联网上发现的最棒的东西......谢谢 链接失效了,看来雅虎取消了这个功能。【参考方案4】:

取决于您是要显示客户端关键字/标签,还是要从文本块中提取关键字/标签,然后对它们进行进一步计算。

如果您只需要显示它们,那么客户端处理就可以了。如果您需要它们进行进一步计算,请使用服务器端处理。

如果您可以提供更多详细信息,我可以推荐一个 javascript 客户端实现。如果您想笼统地“了解”关键字,则需要某种巧妙的解决方案

如果您有关键字列表,则可以使用regular expressions 提取数据

【讨论】:

感谢您的回复。你能推荐一个客户端实现吗?我想要的是,当用户填写一段文本时,它应该从中提取相关标签。

以上是关于从文本块中提取相关标签/关键字的主要内容,如果未能解决你的问题,请参考以下文章

3 中文文本中的关键字提取

从文本内容生成标签

从文本中提取关键字

怎么根据文章 tag 关键字提取相关的文章 帝国cms

PHP函数从文本字符串中提取关键字

PHP PHP函数从一串文本中提取关键字