2010-08-05 71 views
4

我必須切斷一個unicode字符串,它實際上是一個文章(包含句子)我想在python中的第X個句子後剪掉這篇文章字符串。Python在第X個句子後切斷了一個字符串

句子結尾的一個很好的指示是它以句號(「。」)結尾,單詞以大寫字母開頭。如

myarticle == "Hi, this is my first sentence. And this is my second. Yet this is my third." 

這怎麼能實現?

感謝

+0

小心那些談論利文斯頓博士,皮博迪先生,李梅教授或奧利裏夫人的句子。 – PaulMcG 2010-08-05 07:05:14

+0

還要注意以句子結尾的句子嗎?要麼 ! – 2010-08-05 07:47:56

+0

或使用省略號的句子... – Nobody 2010-08-05 08:35:30

回答

15

考慮下載Natural Language Toolkit(NLTK)。然後,您可以創建不會像「美國」這樣的句子中斷的句子。或者無法分割以「?!」結尾的句子。

>>> import nltk 
>>> paragraph = u"Hi, this is my first sentence. And this is my second. Yet this is my third." 
>>> sentences = nltk.sent_tokenize(paragraph) 
[u"Hi, this is my first sentence.", u"And this is my second.", u"Yet this is my third."] 

您的代碼變得更具可讀性。要訪問第二句,請使用您習慣的符號。 「」

>>> sentences[1] 
u"And this is my second." 
+0

+1,爲不打破「美國」的額外獎勵。 – EOL 2010-08-05 07:59:35

+0

看起來不錯,但我無法從nltk導入tokenize_sents。我需要什麼庫? 關於。 – Hellnar 2010-08-05 08:30:09

+0

@Hellnar對此抱歉,從記憶我有不正確的功能。再試一次'nltk.sent_tokenize()' – 2010-08-05 08:34:28

0

試試這個:

'.'.join(re.split('\.(?=\s*[A-Z])', myarticle)[:2]) + '.' 

它削減你的字符串中的第二句之後([2])。

但是還是有一些問題(一如果你處理自然語言):最值得注意的是它只會識別以'A-Z'開頭的句子。這可能適用於英語,但不適用於其他語言。

+0

+1,但僅僅是因爲我不能投票+2 :)。正則表達式非常強大。 – luc 2010-08-05 07:20:58

+0

「第一句話,第二句話」失敗...... – EOL 2010-08-05 08:02:03

+0

@EOL:這是否只是最後的'。'。 ?我不認爲它值得-1。我認爲它仍然是一個很好的一線解決方案,即使其他更長的解決方案可能更好 – luc 2010-08-05 08:53:35

1

如果有可能比通常的其它標點符號,你應該試試這個:

re.split('\W(?=[A-Z])',ss) 

這將返回語句列表。當然,它沒有正確對待保羅提到的案件。

+0

這不適用於像「WWF打破這種情況」。 – EOL 2010-08-05 08:01:37

2

這裏是一個更強大的解決方案:

myarticle = """This is a sentence. 
    And another one. 
    And a 3rd one.""" 

N = 3 # 3 sentences 

print ''.join(sentence+'.' for sentence in re.split('\.(?=\s*(?:[A-Z]|$))', myarticle, maxsplit=N)[:-1]) 

該解決方案擁有超過提到的其他一些可能性的一些優勢面前:它的工作原理

  1. 即使恰好有N句子你的文字。其他答案在最後會產生雙重.。這是通過考慮最後一句沒有大寫字母,而是以文字結尾($)這一事實來避免的。

  2. 即使文本中的句子數少於N,也可以使用。

  3. 分割的數量受maxsplit參數限制爲re.split(),這限制了分割的次數,因此非常有效。

希望這有助於!

相關問題