2014-01-23 3 views
5

Я признаю, что я не искал экстенсивно в базе данных SO. Я пробовал читать натуральный пакет npm, но, похоже, не предоставил эту функцию. Я хотел бы знать, возможно ли, что это требование ниже?Извлечение Важные слова из предложения с использованием узла

У меня есть база данных со списком всех городов страны. У меня также есть рейтинг этих городов (лучшее место для жизни, худшее место для жизни, лучший рейтинг города, рейтинг городов с рейтингом и т. Д.). Теперь из пользовательского интерфейса я хочу, чтобы пользователь вводил бесплатный текст, и оттуда я мог бы искать мою базу данных.

Для например Лучшее место, чтобы жить в Калифорнии или местах вблизи Калифорнии или мест в Калифорнии

Из приведенного выше предложения, я хочу, чтобы извлечь только существительные (может быть), так как это будет название города или страну, которую я могу найти.

Затем экстракт «лучший» означает, что я могу сортировать это определенный порядок и т.д ...

Любые предложения или направления, чтобы искать?

У меня рискнуть, что вопрос будет отмечен как «спорный». Но причина, по которой я опубликовал, - это получить какое-то направление.

+0

Выбрал один из ответов ниже? – Chev

ответ

8

[Я столкнулся с этим вопросом, ища некоторые варианты использования, чтобы проверить модуль, над которым я работаю. Очевидно, вопрос немного старый, но поскольку мой модуль решает вопрос, который, как я думал, я мог бы добавить некоторую информацию здесь для будущих поисковиков.]

Вы должны иметь возможность делать то, что хотите, с помощью Punk chunker. Недавно я выпустил один для Node, который был смоделирован на chunkers, предоставленном библиотеками NLTK (Python) и Standford NLP (Java) (методыи TokensRegex(), повторно).

Модуль обрабатывает строки, которые уже содержат части-из-речи, поэтому сначала вам нужно запустить текст через части, в речи Tagger, такие как 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 ./. 

Вы можете также соответствовать словам, последовательности слов и тегов, использовать предпросмотр, группа последовательности вместе, чтобы создать куски (а затем матч на них), и другие подобные вещи.

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, который поможет вам в этом.

Затем вы можете сохранить ваши строки в базу данных, как это:

Лучшее место, чтобы жить в [городе] Калифорнии [/ города] или места рядом [город] California [/ город] или места в [ город] California [/ город].

или

Меня зовут [первый] Alex [/ первая] [последняя] Ford [/ последний].

Если вы позволяете типа целые фразы пользователя текста, а затем вы пытаетесь выяснить, какие части этих предложений есть данные, которые вы должны использовать в своем приложении, то вы делаете вещи очень излишне строги к себе ,Вы должны либо попросить их ввести важные части данных в свои собственные текстовые поля, либо вы должны предоставить пользователю язык форматирования, такой как вышеупомянутый синтаксис BBCode, чтобы они могли идентифицировать важные биты для вас. Мне кажется, что задача выяснения того, какие части строки важны, будет для вас огромной.

+0

Я не хочу контролировать текст, который может ввести пользователь. В этом случае у меня уже есть экраны с определенными выпадающими меню и текстовыми полями и кнопками поиска. Я пытаюсь понять, чего хочет пользователь (в моем домене), а затем перейти к правильному хранилищу данных, чтобы выполнить поиск. – Vaya

+0

Тогда удачи. Как я уже сказал, вам понадобится база данных словарей с метаданными речевого использования. Я не вижу другого пути. – Chev

1

Возможно, вам не обязательно определять, что такое существительное. Поскольку у вас уже есть список названий городов и стран, которые может обрабатывать ваша система, вам просто нужно проверить, содержит ли вход пользователя одно из этих имен.

+0

На самом деле это было первое, что я пробовал, но я пытаюсь работать с Geo. Поэтому SFO не нужно присутствовать в моей базе данных, но я могу иметь геокод из нескольких мест в Калифорнии. – Vaya

+1

@ Vaya Я не понимаю, что вы имеете в виду, но ясно, что в этом случае ваш вопрос не описывает, что вам нужно. Мой ответ касается того, что вы на самом деле просили. – Thomas

Смежные вопросы