Разбор/извлечение текста из строки в Rails?

У меня есть строка в Rails, например. «Это сообщение в Твиттере. #книги «Война и мир» Льва Толстого. Я люблю эту книгу!», и я хочу разобрать текст и извлечь только определенные фразы, например «Война и мир Льва Толстого».

Это вопрос использования Regex и переноса текста между «#books» на «.»?

Что, если в сообщении нет структуры, например: «Это сообщение в Твиттере #книги «Война и мир» Льва Толстого, я люблю эту книгу!» или "Это твиттер-сообщение. Я люблю книгу Льва Толстого "Война и мир" #книги" Как я могу надежно вытянуть фразу "Война и мир Льва Толстого", не зная фразы ex ante.

Существуют ли какие-либо драгоценные камни, методы и т. д., которые могут помочь мне в этом?

По крайней мере, как бы вы назвали то, что я пытаюсь сделать? Это поможет мне найти решение в Google. Я пробовал несколько поисков по "разбору" без везения.

--- отредактировать --- на основе предложения @rogeliog я добавлю следующее:

Я могу жить с мусорным текстом, который идет после #books, но не перед ним. Я попробовал "match.(/#books.*/)" -- результаты здесь: www.rubular.com/ r/gM7oSZxF5M.

Но как я могу получить результат № 6? (например, когда кто-то ставит #books в конце предложения)?

Есть ли способ сделать if-then с регулярным выражением? Что-то типа:

если [#books находится в конце сообщения],

затем [возьмите последние 10 слов перед #books],

иначе [соответствие.(/#books.*/)]

Если вы предлагаете регулярное выражение, опубликуйте свое решение по постоянной ссылке на rubular.com.


person MorningHacker    schedule 25.06.2011    source источник
comment
Кажется, это называется Data Mining.   -  person bassneck    schedule 25.06.2011


Ответы (2)


Я думаю, что вы пытаетесь разобрать какие-то довольно сложные варианты. У вас есть БД со всеми названиями книг? Это поможет выделить.

Чтобы получить заголовок из первого примера («Это сообщение в Твиттере. #книги «Война и мир» Льва Толстого. Я люблю эту книгу!»), вы можете просто:

"This is a Twitter message. #books War & Peace by Leo Tolstoy. I love this book".match(/#book.*\./).to_s.gsub("#books",'')

Вот вернется: «Война и мир» Льва Толстого».

Если вы хотите сделать оператор if else в зависимости от того, находится ли #books в конце или нет, вы можете:

if text.match(/#books$/)
  puts text.match(/([^\s]*\s){10}(#books$)/).to_s
else
  puts text.match(/#books.*/).to_s.gsub("#books",'')
end

Это даст вам последние 10 слов, предшествующих книгам, если #books находится в конце, и что бы это ни было после #books, если оно не в конце.

У меня действительно нет лучшей идеи, надеюсь, что это сработает для вас, дайте мне знать :)

person rogeliog    schedule 25.06.2011
comment
Хороший. Этого может быть достаточно, чтобы получить то, что я хочу. Позвольте мне попробовать, и я вернусь к вам. - person MorningHacker; 25.06.2011
comment
Ваше предложение довольно хорошее. Я могу жить с мусорным текстом, который идет после #books, но не перед ним. Поэтому я выбрал match.(/#books.*/) -- посмотрите результаты: [ссылка] (rubular.com/r/gM7oSZxF5M). Как я могу получить результат № 6? (например, когда кто-то помещает #books в конце предложения) Могу ли я как-нибудь сделать if-then с регулярным выражением? Что-то вроде: если [#books находится в конце сообщения], то [возьмите последние 10 слов, предшествующих #books], иначе [соответствует.(/#books.*/)]. Пожалуйста, разместите свое решение по постоянной ссылке, используя rubular.com - person MorningHacker; 25.06.2011
comment
Здравствуйте, это постоянная ссылка rubular для получения последних 10 слов, предшествующих #books, когда #books стоит в конце, ссылка, я также поделился с вами кодом входа в систему, я не знаю, есть ли лучший способ решить эту проблему, если да, пожалуйста, дайте мне знать :) - person rogeliog; 25.06.2011

Я думаю, вам понадобится обработка естественного языка. Это очень большая область и имеет много методов и приложений. В частности, в отношении Ruby вам может быть интересен проект Ruby Linguistics.

Удачи вам, синтаксический анализ и обработка естественного языка — непростая задача.

person cbley    schedule 25.06.2011
comment
Спасибо вам за ссылки. Я посмотрю и посмотрю, с чем я столкнулся. - person MorningHacker; 25.06.2011