0

我想从 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 的研究多态性与对二甲双胍的抗糖尿病反应之间存在显着关联。”

这段代码返回了很多句子,即如果上面的一个词进入了被打印出来的句子......!帮我为此编写代码

4

3 回答 3

1

您没有显示您的真实代码,但您现在拥有的代码至少有一个错误会导致大量虚假输出。它在这条线上:

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

此正则表达式与包含 的字符串不匹配gene,正如您所明确表示的那样。它匹配(几乎)任何包含字母之一的字符串gen

这不可能是你真正的代码,因为a它是一个列表,你会在这一行得到一个错误——而且你忽略了findall()! 整理您的问题,使其反映现实。如果您的问题仍未解决,请编辑您的问题并至少包含一个句子,该句子是输出的一部分,但您不想看到。

于 2016-11-16T09:37:10.943 回答
0

我会采取不同的方法:

  1. 读入文本文件
  2. 将文本文件拆分成句子。查看https://stackoverflow.com/a/28093215/223543以了解执行此操作的手动方法。或者你可以使用 ntlk.tokenizer.punkt 模块。(在亚历克西斯在下面的评论中指出我正确的方向后编辑)。
  3. 检查我是否在每个句子中找到了您的关键术语,如果找到了就打印出来。

只要您的文本文件格式正确,这应该可以工作。

于 2016-11-16T09:48:59.063 回答
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():
于 2016-11-16T09:17:18.137 回答