2016-11-14 62 views
0

我想從10,000篇文章中提取含有藥物和基因名稱的句子。 和我的代碼是我想從10,000篇文章中提取含有藥物和基因名稱的句子

import re 
import glob 
import fnmatch 
import nltk 
from nltk.tokenize import sent_tokenize, word_tokenize 


flist= glob.glob ("C:/Users/Emma Belladona/Desktop/drug working/*.txt") 
print (flist) 
for txt in flist: 
    #print (txt) 
    fr = open (txt, "r") 
    tmp = fr.read().strip() 
    a = (sent_tokenize(tmp)) 
    b = (word_tokenize(tmp)) 
    for c, value in enumerate(a, 1): 
     if value.find("SLC22A1") != -1 and value.find("Metformin"): 
      print ("Result", value) 
      re.findall("\w+\s?[gene]+", a) 
     else: 
      if value.find("Metformin") != -1 and value.find("SLC22A1"): 
       print ("Results", value) 
     if value.find("SLC29B2") != -1 and value.find("Metformin"): 
      print ("Result", value) 

我想提取具有從文章的整個身體基因和藥名的句子。例如「二甲雙胍降低對數轉換的SLC22A1排泄(從1.5860.47降至1.0060.52,p = 0.001)」。 「最後,我們無法證實SLC22A1,ACE,AGTR1和ADD1的研究多態性與這項控制良好的研究中二甲雙胍的抗糖尿病反應的顯着相關性。」

該代碼返回很多句子,即如果上面的一個單詞出現在打印出的句子中......! 幫我做的代碼,這

+0

請描述確切說明發生了什麼問題。會發生什麼,以及會發生什麼? – lenz

+1

使用「print(tmp)」語句,可以打印您讀入的所有內容 - 無論您進行何種搜索。如果你的問題是你的輸出中有更多Result Result行,那麼請澄清你的問題。 – alexis

+0

'if value.find(「SLC22A1」)!= -1和value.find(「Metformin」)'你想在這裏做什麼?檢查「SLC22A1」和「二甲雙胍」是否在值中?因爲如果是這樣,那就錯了。 –

回答

0

當你這樣做:

if value.find("SLC22A1") != -1 and value.find("Metformin"): 

你不是在字符串的開頭的字符串中"SLC22A1"Metformin"測試(第二部分可能不是什麼你想要的)

你可能想要這個:

if value.find("SLC22A1") != -1 and value.find("Metformin") != -1: 

find方法我由於它的返回值而容易出錯,並且你不關心這個位置,所以你最好用in

要在一個句子(可能是不區分大小寫的第二個出現)測試2個字這樣做:

if "SLC22A1" in vlow and "metformin" in value.lower(): 
+0

我可以嘗試其他選項,如正則表達式等嗎? –

1

你不顯示你真正的代碼,但你的代碼現在已經在至少會導致大量虛假輸出的錯誤。這是在這條線:

re.findall("\w+\s?[gene]+", a) 

這個規則表達式不匹配包含gene字符串,你顯然意。它匹配(幾乎)任何字符串包含字母g,en中的一個。

這不能是你的真實代碼,因爲a是一個列表,你會得到這條線上的錯誤 - 再加上你忽略了findall()的結果!整理你的問題,以便它反映現實。如果你的問題仍然沒有解決,編輯你的問題並至少包括一個句子,是輸出的一部分,但你不想看到。

+0

是的,這是一個錯誤。請幫我解決問題。正如你明白我的意思是要提取什麼。那麼你會建議我的其他方法? –

+1

如果你甚至不能複製粘貼和校對你自己的代碼,你對我有什麼樣的幫助?按順序排列你的問題,有人可以嘗試幫助你。這裏沒有人喜歡猜測問題實際上是什麼。 – alexis

0

我會採取不同的方法:

  1. 閱讀文本文件
  2. 斯普利特文本文件轉換成句子。檢查出https://stackoverflow.com/a/28093215/223543手動方法來做到這一點。或者你可以使用ntlk.tokenizer.punkt模塊。 (Alexis在下面的評論中指出我正確的方向後編輯)。
  3. 檢查我是否在每個句子中找到了你的關鍵詞,如果有,我會打印出來。

只要你的文本文件格式良好,這應該工作。

+0

OP已經使用了nltk,它提供了句子拆分。有什麼「輝煌」的黑客你自己的劣質解決方案? – alexis

+0

你說得對。我大約兩週時間學習所有的Python庫。請閱讀nltk.tokenize.punkt模塊。 –

+0

很高興你做了更正,但你的「答案」只是告訴OP做她已經做的事情。下一次,確保你在寫答案之前真正解決問題。否則,這不是一個答案。 – alexis

相關問題