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

时间:2011-01-28 12:22:36

标签: php javascript tags stop-words

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

  

“要求    - 使用Linux,Apache 2的LAMP环境的工作知识,   MySQL 5和PHP 5,    - 了解Web 2.0标准    - JSON舒适    - 亲身体验使用Frameworks,Zend,OOP的经验    - 跨浏览器Javascripting,JQuery等    - 版本控制软件的知识,如子版本将   优选“。

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

如何在PHP / Javascript等中进行操作?一个headstart真的很有帮助。

4 个答案:

答案 0 :(得分:18)

一种非常天真的方法是从文本中删除常见的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执行相同的操作,并且可能更清晰(尽管对于客户端来说可能会很慢。)

答案 1 :(得分:5)

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

看起来像最专业的人表现得非常糟糕:viewer.opencalais.com

其他好的人(不确定他们写的是什么语言)

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

答案 2 :(得分:2)

这不容易做到,因为它需要某种类型的模糊逻辑。您应该使用Yahoo Term提取器YQL

检查出来:link

答案 3 :(得分:0)

根据您是否要显示客户关键字/标签或是否要从文本块中提取关键字/标签,然后使用它们进行进一步计算。

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

如果您可以提供更多详细信息,我可以推荐javascript客户端实现。如果你想要一般“知道”关键词,那么某种聪明的解决方案是必要的

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