使用Node从句子中提取重要单词

时间:2014-01-23 22:54:35

标签: node.js nlp

我承认我没有在SO数据库中进行过广泛搜索。我尝试阅读自然的npm包,但似乎没有提供该功能。我想知道以下要求是否有可能?

我有一个包含某个国家/地区所有城市列表的数据库。我也有这些城市的评级(最好的居住地,最差的居住地,最好的城市,更受好评的城市等)。现在从用户界面,我想让用户输入自由文本,从那里我应该能够搜索我的数据库。

例如,在加利福尼亚居住的最佳地点 或加州附近的地方 或加利福尼亚州的地方

从上面的句子中,我只想提取名词(可能是),因为这将是我可以搜索的城市或国家的名称。

然后提取'最佳'意味着我可以排序是一个特定的订单等...

是否有任何建议或指示?

我冒险将这个问题标记为“有争议的”。但我发布的原因是为了获得一些指导。

3 个答案:

答案 0 :(得分:9)

[我在寻找一些用例来测试我正在研究的模块时遇到了这个问题。显然这个问题有点老了,但是由于我的模块解决了这个问题,我想我也可以在这里为未来的搜索者添加一些信息。]

你应该能够用POS chunker做你想做的事。我最近发布了一个用于Node的模型,该模型是由NLTK(Python)和Standford NLP(Java)库(分别为chunk()TokensRegex()方法)提供的分块建模的。

该模块处理已包含词性的字符串,因此首先您需要通过词性标注器运行文本,例如pos

var pos = require('pos');

var words = new pos.Lexer().lex('Best place to live in California');
var tags = new pos.Tagger()
  .tag(words)
  .map(function(tag){return tag[0] + '/' + tag[1];})
  .join(' ');

这会给你:

Best/JJS place/NN to/TO live/VB in/IN California/NNP ./.

现在,您可以使用pos-chunker查找所有专有名词:

var chunker = require('pos-chunker');

var places = chunker.chunk(tags, '[{ tag: NNP }]');

这会给你:

Best/JJS place/NN to/TO live/VB in/IN {California/NNP} ./.

同样地,你可以提取动词来理解人们想要做什么('生活'游泳'游戏'吃'等等):

var verbs = chunker.chunk(tags, '[{ tag: VB }]');

哪会产生:

Best/JJS place/NN to/TO {live/VB} in/IN California/NNP ./.

您还可以匹配单词,单词和标签序列,使用前瞻,将序列组合在一起以创建块(然后匹配这些块),以及其他类似的东西。

答案 1 :(得分:1)

您可能不必识别什么是名词。由于您已经拥有系统可以处理的城市和国家/地区名称列表,因此您只需检查用户输入是否包含其中一个名称。

答案 2 :(得分:0)

首先,你需要找到一种识别名词的方法。没有核心节点模块或任何可以为您执行此操作的内容。你需要循环遍历字符串中的所有单词,然后将它们与某种字典数据库进行比较,这样你就可以找到每个单词并检查它是否是名词。

我发现this api看起来很有前途。您在API中查询单词,然后它会向您发回一串数据:

<?xml version="1.0" encoding="UTF-8"?>
<results>
    <result>
        <term>consistent, uniform</term>
        <definition>the same throughout in structure or composition</definition>
        <partofspeech>adj</partofspeech>
        <example>bituminous coal is often treated as a consistent and homogeneous product</example>
    </result>
</results>

你可以看到它包含一个partofspeech成员,告诉你“一致”这个词是一个形容词。


如果您可以控制存储的文本,则另一个(也是更好的)选项是使用某种标记语言来识别字符串的重要部分,然后再保存它。像BBCode这样的东西。我甚至找到了BBCode node module来帮助你做到这一点。

然后您可以将字符串保存到数据库中,如下所示:

  

居住在[城市]加利福尼亚[/ city]或[城市]加利福尼亚[/ city]附近或[城市]加利福尼亚州[/ city]的最佳居住地。

  

我的名字是[第一名] Alex [/ first] [last] Ford [/ last]。

如果你让用户输入完整的文字句子然后你试图弄清楚这些句子的哪些部分是你应该在你的应用程序中使用的数据,那么你就会对自己造成非常不必要的困难。您应该要求他们将重要的数据输入到他们自己的文本框中,或者您应该为用户提供格式化语言,例如前面提到的BBCode语法,以便他们可以为您识别重要的位。我认为找出一个字符串的哪个部分很重要的工作对你来说将是一个巨大的工作。