从Rails中的字符串解析/提取文本?

时间:2011-06-25 00:30:47

标签: ruby-on-rails parsing text text-parsing string-parsing

我在Rails中有一个字符串,例如“这是Twitter的消息。#Book War& Peace by Leo Tolstoy。我喜欢这本书!”,我想解析文本,只提取某些短语,如“战争与和平托尔斯泰”。

这是使用正则表达式并将“#books”之间的文本提升为“。”的问题吗?

如果消息没有结构,例如: “这是Twitter消息#books War& Peace by Leo Tolstoy我喜欢这本书!”要么 “这是Twitter的消息。我喜欢Leo Tolstoy #books的战争与和平书” 如何在不知道事前的短语的情况下,可靠地拉出“战争与和平由Leo Tolstoy”这句话。

有没有可以帮助我做到这一点的宝石,方法等?

至少,你怎么称呼我要做的事情?它将帮助我在Google上搜索解决方案。我已经尝试过几次“解析”搜索而没有运气。

---编辑--- 基于@rogeliog建议,我将添加以下内容:

我可以忍受#books之后的垃圾文本,但之前没有。我试过“匹配。(/#books。* /)” - 结果在这里:www.rubular.com/r/gM7oSZxF5M

但是如何捕获结果#6? (例如,当某人将#books放在句末时)?

我有办法用正则表达式做if-then吗?类似的东西:

  

如果[#books在消息的末尾],

     

然后[取#books之前的最后10个字],

     

其他[匹配。(/#books。* /)]

如果您提供正则表达式,请使用rubular.com

通过永久链接发布您的解决方案

2 个答案:

答案 0 :(得分:2)

我认为你需要的是Natural Language Processing。这是一个非常大的领域,有许多技术和应用。特别是Ruby,您可能希望查看Ruby Linguistics项目。

祝你好运,解析和处理自然语言并非易事。

答案 1 :(得分:0)

我认为您正在尝试解析一些非常复杂的变体。你有一个包含所有书名的数据库吗?这将有助于分配。

从第一个例子中获取标题(“这是一条Twitter消息。#Book War& Peace by Leo Tolstoy。我喜欢这本书!”)你可以简单地说:

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

这将回归:“托尔斯泰的战争与和平”。

如果您想根据#books是否结束而执行if else语句,您可以:

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

如果#books在最后,那将会给你前书中的最后10个单词,如果#books不在最后那么它将会出现在#books之后

我真的没有更好的主意,希望对你有用,让我知道:)。