使用节点从句子中提取重要的单词

我承认我没有在SO数据库中进行大量的search。 我尝试阅读自然的NPM包,但似乎并没有提供的function。 我想知道下面的要求是否有可能?

我有一个数据库,有一个国家的所有城市的名单。 我也有这些城市的评级(最好的地方住,最差的地方,最好的评级城市,更恶劣的城市等)。 现在从用户界面,我想让用户input自由文本,从那里我应该能够search我的数据库。

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

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

然后提取'最好'意味着我可以sorting是一个特定的顺序等…

任何build议或指示寻找?

我冒险有机会将这个问题标记为“有争议的”。 但是我发布的原因是为了得到一些方向。

[我遇到了这个问题,同时寻找一些用例来testing我正在使用的模块。 显然这个问题有点老了,但是由于我的模块解决了这个问题,所以我想不妨在这里为未来的search者添加一些信息。

你应该能够做一个POS chunker你想要的。 我最近为Node发布了一个针对NLTK(Python)和Standford NLP(Java)库( chunk()TokensRegex()方法chunk() TokensRegex()

该模块处理已经包含词性的string,因此首先需要通过词性标注器来运行文本,例如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 ./. 

你也可以匹配单词,单词和标签序列,使用前瞻,组合序列一起创build块(然后匹配那些),和其他这样的事情。

你可能不需要确定什么是名词。 既然你已经有一个你的系统可以处理的城市名和国家名的列表,你只需要检查用户input是否包含这些名字中的一个。

那么首先,你需要find一种方法来识别名词。 没有核心节点模块或任何可以为你做这个的。 您需要遍历string中的所有单词,然后将它们与某种字典数据库进行比较,以便查找每个单词并检查它是否是名词。

我发现这个API看起来很有希望。 你查询一个单词的API,它发回你一个像这样的数据blob:

 <?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成员,它告诉你“一致”这个词是一个形容词。


另一个(也是更好的)选项,如果你能够控制被存储的文本,就是在保存之前使用某种标记语言来标识string的重要部分。 就像BBCode 。 我甚至find了一个BBCode节点模块 ,可以帮助你做到这一点。

然后你可以像这样保存你的string到数据库中:

在[city] California [/ city]或者[city] California [city]或者California [city]的地方居住的最佳地点。

要么

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

如果你让用户input文本的整个句子,然后你想弄清楚这些句子的哪些部分是数据,你应该在你的应用程序中使用,那么你是在做非常不必要的事情自己的事情。 你应该要求他们把重要的数据input到他们自己的文本框中,或者你应该给用户一个格式化的语言,比如前面提到的BBCode语法,这样他们就可以为你识别重要的数据。 找出一个string的哪个部分是重要的,对我来说将是一个巨大的工作。