找一些句子

时间:2009-11-11 11:41:20

标签: ruby regex nlp

我想找到一些在某些文字中找到一些(让它是两个)句子的好方法。什么会更好 - 使用正则表达式或拆分方法?你的想法?

根据Jeremy Stein的要求 - 有一些例子

示例:

输入:

  

首先要做的是创建Comment模型。我们将以正常方式创建它,但只有一个小差异。如果我们只是为文章创建注释,我们在模型中有一个名为article_id的整数字段来存储外键,但在这种情况下,我们需要更抽象的东西。

前两句:

  

首先要做的是创建Comment模型。我们将以正常方式创建它,但只有一个小差异。

输入:

  

先生。 T是一个卑鄙的家伙。我不想和他打架。

前两句:

  

先生。 T是一个卑鄙的家伙。我不想和他打架。

输入:

  

D.C.狙击手被执行死刑是在弗吉尼亚监狱进行的致命注射。死亡发生在晚上9点11分。 ET。

前两句:

  

D.C.狙击手被执行死刑是在弗吉尼亚监狱进行的致命注射。死亡发生在晚上9点11分。 ET。

输入:

  

在她的总结发言中,反对的律师说“......在这个和其他许多情况下,两个错误都不会成为正确的。”陪审团似乎同意。

前两句:

  

在她的总结发言中,反对的律师说“......在这个和其他许多情况下,两个错误都不会成为正确的。”陪审团似乎同意。

伙计们,正如你所看到的那样 - 从文本中确定两个句子并不容易。 :(

7 个答案:

答案 0 :(得分:4)

正如您所注意到的,句子标记化比最初看起来有点刺耳。所以你也可以利用现有的解决方案。 Punkt句子标记化算法在NLP中很流行,并且在Python Natural Language Toolkit中有一个很好的实现,它们描述了here的使用。他们还描述了另一种方法here

可能还有其他实现,或者您也可以阅读描述Punkt算法的原始paper:Kiss,Tibor和Strunk,Jan(2006):无监督多语言句子边界检测。计算语言学32:485-525。

您还可以阅读有关句子标记here的另一个Stack Overflow问题。

答案 1 :(得分:3)

 your_string = "First sentence. Second sentence. Third sentence"
 sentences = your_string.split(".")
 => ["First sentence", " Second sentence", " Third sentence"]

无需使简单的代码复杂化。

编辑:现在你已经澄清了真正的输入比你最初的例子更复杂,你应该忽略这个答案,因为它不考虑边缘情况。初步了解NLP应该会向您展示您正在进入的内容。

我过去看到的一些边缘案例有点复杂:

  • 日期:某些地区使用dd.mm.yyyy
  • 行情:当他叹气时 - “无论如何,做吧。现在。顺便说一下......”。这就足够了。
  • 单位:他的行程是138公里。在高速公路上行驶时。

如果您打算解析这些文本,则应远离分割或正则表达式。

答案 2 :(得分:1)

irb(main):005:0> a = "The first sentence. The second sentence. And the third"
irb(main):006:0> a.split(".")[0...2]
=> ["The first sentence", " The second sentence"]
irb(main):007:0>
编辑:这是你如何处理“这是一个句子......还有另一个。而另一个......”案例:

irb(main):001:0> a = "This is the first sentence ....... And the second. Let's not forget the third"
=> "This is the first sentence ....... And the second. Let's not forget the thir
d"
irb(main):002:0> a.split(/\.+/)
=> ["This is the first sentence ", " And the second", " Let's not forget the thi    rd"]

您可以应用相同的范围运算符...来提取前2个。

答案 3 :(得分:1)

这通常会匹配句子。

/\S(?:(?![.?!]+\s).)*[.?!]+(?=\s|$)/m

对于两个句子的例子,请参加前两场比赛。

答案 4 :(得分:1)

您可以在sentence boundary detection维基百科页面上找到提示和软件链接。

答案 5 :(得分:0)

如果您知道要搜索的句子,Regex应该很好地搜索

((YOUR SENTENCE HERE)|(YOUR OTHER SENTENCE)){1}
拆分可能会耗费相当多的内存,因为它还可以保存你不需要的东西(整个文本不是你的句子)因为正则表达式只保存你搜索的句子(当然,如果它找到它的话) )

答案 6 :(得分:0)

如果您要将一段文本分割成句子,那么您要做的就是确定哪些标记可以分隔句子。一般来说,这是!?.(但是如果你关心的只是你处理的文本的.,那么就这样)。< / p>

既然这些可以出现在引号内,或者作为缩写的一部分,你想要做的是找到这些标点符号的每一个出现并运行某种机器学习分类器来确定该出现是否开始一个新句子,或者是否它做了别的事。这涉及训练数据和正确构造的分类器。并且它不会100%准确,因为可能没有办法100%准确。

我建议在文献中查找句子分割技术,并查看各种自然语言处理工具包。我还没有真正找到Ruby,但我碰巧喜欢OpenNLP(使用Java)。