我知道这听起来很容易。我想过使用第一个点(。)作为基准,但是当缩写和简短形式出现时,我变得无助。
e.g。 -
Sir Winston Leonard Spencer-Churchill,KG,OM,CH,TD,PC,DL,FRS, 提问。 RA(1874年11月30日 - 1965年1月24日)是英国政治家 以及他在英国期间领导英国而闻名的政治家 第二次世界大战。他被广泛认为是伟大的人物之一 战时领导人曾两次担任总理。一位着名的政治家 和演说家,丘吉尔也是英国军队的一名军官 历史学家,作家和艺术家。
这里,第一个点是Hon。,但我希望完整的第一行在第二次世界大战结束。
人们有可能吗?
答案 0 :(得分:8)
如果您使用nltk
,则可以添加缩写,如下所示:
>>> import nltk
>>> sent_detector = nltk.data.load('tokenizers/punkt/english.pickle')
>>> sent_detector._params.abbrev_types.add('hon')
>>> sent_detector.tokenize(your_text)
['Sir Winston Leonard Spencer-Churchill, KG, OM, CH, TD, PC, DL, FRS, Hon. RA
(30 November 1874 \xe2\x80\x93 24 January 1965) was a British politician and
statesman known for his leadership of the United Kingdom during the Second
World War.',
'He is widely regarded as one of the great wartime leaders and served as Prime
Minister twice.',
'A noted statesman and orator, Churchill was also an officer in the British Army,
a historian, a writer, and an artist.']
这种方法基于Kiss & Strunk 2006,它报告Punkt的F分数(精确度和召回的调和平均值)介于91%和99%之间,具体取决于测试语料库。
Kiss,Tibor和Jan Strunk。 “无监督多语种句” 边界检测“。计算语言学,(32)485-525。
答案 1 :(得分:1)
这通常是不可能的。缩写,数值(“$ 23.45”,“32.5度”),语录(“他说:'哈!你永远不会[...]'”)或带标点符号的名字(例如“恐慌!在迪斯科舞厅”)括号中的整个从属条款基本上都是他们自己的句子(“厨师(也是一位出色的画家!)[...]”)意味着你不能只用点和感叹号/问号来分割文本或使用任何其他“简单”的方法。
基本上,为了解决一般情况,你需要一个自然语言解析器(在这种情况下你可能最好使用prolog而不是python),语法可以处理所有这些特殊情况。如果你可以将问题减少到不那么普通的问题,例如只需要处理缩写和引用,你就可以使用某种东西 - 但是你仍然需要任何类型的解析器或状态机,因为正则表达式对于这些东西来说不够强大。
答案 2 :(得分:1)
你有没有看过自然语言工具包,nltk?它似乎有一个句子标记器可用。 http://nltk.googlecode.com/svn/trunk/doc/api/nltk.tokenize-module.html
答案 3 :(得分:0)
维基百科上的第一句话几乎总是说出is, was, are or were
的内容。因此,一个可能的解决方案是不会结束句子,直到达到一个连接动词(is,was,are,)。当然,这不会100%准确地工作,但这是一个可能的解决方案:
def get_first_sentence(my_string):
linking_verbs = set(['was', 'is', 'are', 'were'])
split_string = my_string.split(' ')
first_sentence = []
linked_verb_booly = False
for ele in split_string:
first_sentence.append(ele)
if ele in linking_verbs:
linked_verb_booly = True
if '.' in ele and linked_verb_booly == True:
break
return ' '.join(first_sentence)
示例1:
Sir Winston Leonard Spencer-Churchill,KG,OM,CH,TD,PC,DL,FRS, 提问。 RA(1874年11月30日 - 1965年1月24日)是英国政治家 以及他在英国期间领导英国而闻名的政治家 第二次世界大战。他被广泛认为是伟大的人物之一 战时领导人曾两次担任总理。一位着名的政治家 和演说家,丘吉尔也是英国军队的一名军官 历史学家,作家和艺术家。
my_string_1 = 'Sir Winston Leonard Spencer-Churchill, KG, OM, CH, TD, PC, DL, FRS, Hon. RA (30 November 1874 – 24 January 1965) was a British politician and statesman known for his leadership of the United Kingdom during the Second World War. He is widely regarded as one of the great wartime leaders and served as Prime Minister twice. A noted statesman and orator, Churchill was also an officer in the British Army, a historian, a writer, and an artist.'
first_sentence_1 = get_first_sentence(my_string_1)
结果:
>>> first_sentence_1
'Sir Winston Leonard Spencer-Churchill, KG, OM, CH, TD, PC, DL, FRS, Hon. RA (30 November 1874 \xe2\x80\x93 24 January 1965) was a British politician and statesman known for his leadership of the United Kingdom during the Second World War.'
示例2:
Python是一种通用的高级编程语言[11] 设计理念强调代码可读性。据说它的语法 要清楚[12]并富有表现力。[13] Python有一个庞大而全面的 标准库。[14]
结果:
>>> first_sentence_2
'Python is a general-purpose, high-level programming language[11] whose design philosophy emphasizes code readability.'
示例3:
中国(Listeni /tʃaɪnə/;中文:中国;拼音:Zhōngguó;另见姓名 中华人民共和国(中华人民共和国)正式签署 世界上人口最多的国家,人口超过13亿。 占地面积约960万平方公里,东亚 国家是世界上陆地面积第二大的国家,[13]和 总面积的第三或第四大,取决于的定义 总面积。[14]
my_string_3 = "China (Listeni/ˈtʃaɪnə/; Chinese: 中国; pinyin: Zhōngguó; see also Names of China), officially the People's Republic of China (PRC), is the world's most-populous country, with a population of over 1.3 billion. Covering approximately 9.6 million square kilometres, the East Asian state is the world's second-largest country by land area,[13] and the third- or fourth-largest in total area, depending on the definition of total area.[14]"
first_sentence_3 = get_first_sentence(my_string_3)
结果:
>>> first_sentence_3
"China (Listeni/\xcb\x88t\xca\x83a\xc9\xaan\xc9\x99/; Chinese: \xe4\xb8\xad\xe5\x9b\xbd; pinyin: Zh\xc5\x8dnggu\xc3\xb3; see also Names of China), officially the People's Republic of China (PRC), is the world's most-populous country, with a population of over 1.3"
你可以看到最后一个例子中的限制,其中句子被切断为早期,因为'。'在1.3。
此外,使用正则表达式可能更好。
只是一个想法。
答案 4 :(得分:0)
虽然这里的很多人都有优点,但自然语言处理实际上是一项非常困难的任务,并且已经进行了大量的研究,结果非常不可靠。但是,那里有解决方案。很多人都提到了自然语言工具包,它是现存最强大的自然语言处理工具之一。事实上,NLTK确实有一个准备好构建的句子标记器,虽然它并不完美,但它非常好。它被称为PunktSentenceTokenizer,它可以很好地过滤缩写。它有更多俚语演讲的麻烦,但对于像你一样的小说而言,它的作用非常好。可以在此处找到文档:http://nltk.googlecode.com/svn/trunk/doc/api/nltk.tokenize.punkt.PunktSentenceTokenizer-class.html
from nltk import tokenize
def print_sentences(text):
test = tokenize.punkt.PunktSentenceTokenizer()
return test.sentences_from_text(text)
可悲的是,它实际上并不适用于您提出的示例,但它确实有一个非常详细的查找,并且它捕获了很多缩写。我认为这个例子中的很多项目都是“Hon。”也是一个专有名词,字典可能会看到它。可以在nltk中自定义配置字典以捕获这种特殊情况,但是在fraxel的答案中,简单的标记化器不会捕获许多其他缩写,或价格符号或其他此类常见情况,punkt tokenizer将捕获。
答案 5 :(得分:-1)
如果你坚持一个句点,只有当一个句子后面跟着一个空格或一个新行,你才能做出类似的句子:
s="Sir Winston Leonard Spencer-Churchill, KG, OM, CH, TD, PC, DL, FRS, Hon. RA (30 November 1874 – 24 January 1965) was a British politician and statesman known for his leadership of the United Kingdom during the Second World War. He is widely regarded as one of the great wartime leaders and served as Prime Minister twice. A noted statesman and orator, Churchill was also an officer in the British Army, a historian, a writer, and an artist."
sentence_delimiters = ['. ', '.\n', '? ', '?\n', '! ', '!\n']
pos = [s.find(delimiter) for delimiter in sentence_delimiters]
pos = min([p for p in pos if p >= 0])
print s[:pos]