Разбор / извлечение текста из строки в Rails? - PullRequest
1 голос
/ 25 июня 2011

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

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

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

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

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

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

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

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

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

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

затем [взять последние 10 слов, предшествующих #books],

else[match. (/ # books. * /)]

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

Ответы [ 2 ]

2 голосов
/ 25 июня 2011

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

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

0 голосов
/ 25 июня 2011

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

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

"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, если это не в конце

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

...