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

我在Rails中有一个字符串,例如“这是一个Twitter消息。#Tossstoy的战争与和平。我喜欢这本书!”,我想解析文本并仅提取某些短语,如“战争与和平”利奥托尔斯泰“。

这是使用正则表达式并在“#books”到“。”之间解除文本的问题吗?

如果消息没有结构,例如:“这是一条Twitter消息,那么Leo Tolstoy的战争与和平我喜欢这本书!” 或者“这是Twitter的消息。我喜欢Leo Tolstoy #books的战争与和平书”如何在不知道事前口语的情况下可靠地拉出“战争与和平由Leo Tolstoy”。

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

至少,你会说我想做什么? 它将帮助我在Google上搜索解决方案。 我尝试了几次“解析”搜索没有运气。

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

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

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

有没有办法让我用正则表达式做if-then? 就像是:

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

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

别的[match。(/#books。* /)]

如果您提供正则表达式,请使用rubular.com通过永久链接发布您的解决方案

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

从第一个例子中得出标题(“这是一个Twitter消息。#Totostoy的战争与和平。我喜欢这本书!”)你可以简单地说:

"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不在最后,它将为你提供最后的10个单词

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

我认为你需要的是自然语言处理 。 这是一个非常大的领域,有许多技术和应用。 特别是Ruby,您可能需要查看Ruby Linguistics项目。

祝你好运,解析和处理自然语言并不是一件容易的事。