我想从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 :(得分:1)
您不会显示您的真实代码,但您现在拥有的代码至少有一个会导致大量虚假输出的错误。它就在这条线上:
re.findall("\w+\s?[gene]+", a)
此正则表达式与包含gene
的字符串不匹配,正如您明确指出的那样。它匹配(几乎)任何字符串包含字母g
,e
或n
之一。
这可能不是您的真实代码,因为a
是一个列表,您会在此行中收到错误 - 而且您会忽略findall()
的结果!整理你的问题,以反映现实。如果您的问题仍然无法解决,编辑您的问题并至少包含一句话是输出的一部分,但您不希望看到。
答案 1 :(得分: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个单词(可能对第2次出现不区分大小写),请执行以下操作:
if "SLC22A1" in vlow and "metformin" in value.lower():
答案 2 :(得分:0)
我采取了不同的方法:
只要您的文本文件格式正确,这应该可行。