2015-12-08 84 views
1

我有段落的數據框,我已將(*可以)分成單詞標記和句子標記,並期望找到所有在出現短語:「貢獻」或「捐獻給」的任何情況下的名詞短語。使用正則表達式在發生特定短語後找到段落中的所有名詞短語

還是真的某種形式的,所以:

"Contributions are welcome to be made to the charity of your choice." 

---> would return: "the charity of your choice" 

"blah blah blah donations, in honor of Firstname Lastname, can be made to ABC Foundation" 

---> would return: "ABC Foundation" 

我創建了一個正則表達式的變通,抓住正確的短語時約90%。 ..見下圖:

text = nltk.Text(nltk.word_tokenize(x)) 
donation = TokenSearcher(text).findall(r"<\.> <.*>{,15}? <donat.*|contrib.*> <.*>*? <to> (<.*>+?) <\.|\,|\;> ") 
donation = [' '.join(tokens) for tokens in donation] 
return donation 

我想清理正則表達式來擺脫「{15}」要求因爲它缺少一些我需要的值。不過,我並沒有用「貪婪」的表情來打磨,也不能讓它正常工作。

所以這句話:

While she lived a full life , had many achievements and made many 
**contributions** , FirstName is remembered by most for her cheerful smile , 
colorful track suits , and beautiful necklaces hand made by daughter FirstName . 
FirstName always cherished her annual visit home for Thanksgiving to visit 
brother FirstName LastName 

將返回:「參觀哥姓」由於捐款先前提及,即使單詞「到」一詞後以及15分後的話。

+0

「即使'to'這個詞在15個單詞之後出現。」好。這就是''*'*確實*。它明確地匹配*任意數量的字符。* – Draco18s

+0

我認爲在它後面的「{,15}」最多可以限制15個字。 –

+0

發生在「contrib。*」匹配之前。 – Draco18s

回答

1

看起來您正在努力如何將您的搜索標準限制爲單個句子。因此,只需使用NLTK將您的文本分解爲句子(它可以做得比只看週期好得多),並且問題消失。

sents = nltk.sent_tokenize(x) # `x` is a single string, as in your example 
recipients = [] 
for sent in sents: 
    m = re.search(r"\b(contrib|donat).*?\bto\b([^.,;]*)", sent) 
    if m: 
     recipients.append(m.group(2).strip()) 

爲今後的工作,我也建議你使用比Text一個更好的工具,其意在簡單的互動探索。如果你想要對自己的文本做更多的事情,那麼nltk的PlaintextCorpusReader就是你的朋友。

+0

謝謝@Ben,這部分是必不可少的(也是標準的;當我輸入這個答案時,我放棄了它) – alexis

+0

所以這個效果很好,但是當我做sent_tokenize,在「Dr.」之後的結尾句子,和「聖」和「Mt.」因此,喬治敦大學Giuseppe Giaccone博士的研究可以用「代替鮮花,紀念捐贈」這樣的詞彙來回報「Dr博士的研究」。您是否知道縮寫問題是否存在任何類型的工作,或者用不同的方式來標記可將這些問題捕獲爲一個總令牌的句子? –

+0

現在呢?我嘗試了這個確切的句子,句子標記器處理了「博士」正確地說不是句子結束。縮寫恰恰是句子標記器旨在處理的事物。當然,*你的*基於正則表達式的NP提取在下一個時期停止(它提取'[^。,;] *'),所以儘管句子已經完成,但只提取「名詞短語」直到下一個標點符號。爲了獲得更好的性能,請使用POS標記和/或NP chunker替換您的regexp方法(請參閱nltk書的[第7章](http://www.nltk.org/book/ch07.html))。 – alexis

1
(?:contrib|donat|gifts)(?=[^\.]+\bto\b[^\.]+).*to\s([^\.]+) 

Example 如果工作和做什麼,你需要然後讓我知道,我會解釋我的正則表達式。

+0

對不起,我不能回答如何將它應用到你的程序代碼中,並告訴你正在嘗試使用的函數是否支持所有使用的表達式。 – zolo

+0

所以我得到這個實現,但得到一個「錯誤:沒有重複」,我GOOGLE了,看起來像它的Python正則表達式實現中的錯誤,但我不確定究竟是什麼造成它。 –

+0

反斜槓不能在字符範圍內作爲逃逸(並且不需要)工作。 '[^ \。]'除了一段時間或反斜槓之外都匹配所有內容._ – alexis

相關問題