从文本块中提取相关标签/关键字
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 提取数据
【讨论】:
感谢您的回复。你能推荐一个客户端实现吗?我想要的是,当用户填写一段文本时,它应该从中提取相关标签。以上是关于从文本块中提取相关标签/关键字的主要内容,如果未能解决你的问题,请参考以下文章