2010-09-24 93 views
3

是否有一个简单的技巧来隔离大量文本中的第一个句子? (也许使用正则表达式。)从文本字符串中提取第一个句子

搜索第一个完全停止“。”不起作用,如“美国”等缩略词。会把事情搞砸。

(有可能是没有正确答案。)

回答

0

使用纯文本字符串的theres不存在保证的方式来做到这一点,但使用一些屏蔽的字符串,例如,如果你的字符串有\ n在每年年底行或句子,你可以使用它来确定行结束,除了你必须猜测它。

1

通常情况下,您会查找不遵循大写字母的第一个句号。但是这不适用于一些缩写。

没有不可思议的解决方案......您可以列出所有缩写词,并在完全停止时忽略它们。

7

不,没有简单的窍门。要做到这一点,你需要对文本进行语法分析。没人能做到这一点。至少还没有。至少不是100%的时间。主要是因为它也需要对文本进行语义分析。你看,与在学校教语法的语言学家认为相反,构成一个句子的语句很难总结出一套计算机可以在不理解文本的情况下遵循的规则。

花费接下来的几年来查找计算语言学。也许届时会有捷径?

但你可以关闭。

我可能会尝试寻找第一个句点,问号或感叹号后面跟空格。

/^(.*?)[.?!]\s/ 

(该(.*?)是一个非贪婪正则表达式,以确保你确实只能找到的第一句话。

+0

如果该句子包含首字母缩写词,例如U.S.A.中句子,则该正则表达式将失败。 :) – pauldoo 2010-09-24 16:06:22

+0

@pauldoo,你是对的。我只是对着前两个标点符号(\\ s')进行防范:( – 2010-09-28 07:04:40

5

你会为此付出代价正在做的?如果是这样瑟亚马逊的Mechanical Turk该养殖场任务每个更新至少要花0.01美元,至少它可以打败两年计算语言学;-)

1

就像之前说过的那样,没有简单的解决方案。

正则表达式的更强化版本可能是:/^(.*?(?<!\b\w)[.?!])\s+[A-Z0-9]/。它不停止在中期缩写词(但也不是,如果它们在句子结尾......),则下一句句子必须以大写字母或数字开头。......

如果你知道你不想让你的正则表达式停止的首字母缩略词列表,你migth添加它们,如:/^(.*?(?<!\b\w|U\.S\.A|eg)[.?!])\s+[A-Z0-9]/

如果你知道你要使用什么语言,可能会有一些自然语言分析(NLP)工具包 - 但这超出了这个问题的范围。

0

你能假定缩写词在句点之间没有空格吗?如果是的话,这将起作用:

string.split('. ').first 

例如,

s = "Lorem ipsum dolor sit amet, U.S.A adipiscing elit. Phasellus nulla magna, suscipit dapibus bibendum sit amet." 
s.split('. ').first 

=> "Lorem ipsum dolor sit amet, U.S.A adipiscing elit" 

请注意,它会剥去尾随时间段。

+0

在你的例子中,你将最后一个时间段留在“USA”中,所以这并不能解决问题。标点符号,它会在“美国”之后切断,而不是一路走向“精英”。 – Matt 2016-09-01 20:32:17

2

它不能保证的方式来完成,但是这将让你相当接近具有相对简单的表达:

/(^.*?[a-z]{2,}[.!?])\s+\W*[A-Z]/ 

在行(^)的起点开始,它不贪婪外观对于以至少两个小写字母([a-z]{2,})和句号,问号或感叹号([.!?])结尾且后跟一个或多个空格(\s+),零个或多个非单词字符的任意数量的任意字符(.*?)例如左括号(\W*)和大写字母([A-Z])。

这将避免过早截断由于首字母缩写,假设他们:

  • 是大写,如“U.S.A.”
  • 是小写,但是是单个字母,如“例如”或“即”
  • 或后面跟着小写字母,如“此缩写代表缩写”。

一个缺点是,如果句子以大写字母缩写或缩写缩写形式结尾,它就不会停止,但因为简单和有效,这似乎是公平的折衷。