1

我在 Rails 中有一个字符串,例如“这是一条 Twitter 消息。#books War & Peace by Leo Tolstoy。我喜欢这本书!”,我想解析文本并仅提取某些短语,例如“War & Peace by列夫·托尔斯泰”。

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

如果消息没有结构怎么办,例如:“这是列夫·托尔斯泰 (Leo Tolstoy) 的 Twitter 消息#books War & Peace,我喜欢这本书!” 或“这是一条 Twitter 消息。我喜欢 Leo Tolstoy #books 的《战争与和平》一书”我如何在事先不知道短语的情况下可靠地提取“Leo Tolstoy 的战争与和平”这个短语。

是否有任何宝石、方法等可以帮助我做到这一点?

至少,你会怎么称呼我正在尝试做的事情?它将帮助我在 Google 上搜索解决方案。我已经尝试了一些关于“解析”的搜索,但没有成功。

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

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

但是我怎样才能捕捉到结果 #6?(例如,当有人将#books 放在句末时)?

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

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

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

否则 [匹配。(/#books.*/)]

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

4

2 回答 2

2

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

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

于 2011-06-25T00:44:55.383 回答
0

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

要从第一个示例中获取标题(“这是一条 Twitter 消息。#books 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 之后的任何内容

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

于 2011-06-25T00:46:46.567 回答