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 の研究された多型とメトホルミンに対する抗糖尿病反応との顕著な関連性を示すことはできませんでした。」

このコードは、多くの文を返します。つまり、上記の 1 つの単語が文に含まれていれば、それが出力されます...! このコードの作成を手伝ってください

4

3 に答える 3

1

実際のコードは示していませんが、現在のコードには、多くの誤った出力につながる間違いが少なくとも 1 つあります。それはこの行にあります:

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

geneあなたが明確に意図したように、この正規表現は を含む文字列と一致しません。geまたはのいずれかの文字を含む (ほぼ) すべての文字列に一致しますn

aはリストであり、この行でエラーが発生するため、これは実際のコードではありません。さらに、 findall()!の結果を無視します。現実を反映するように質問を整理してください。それでも問題が解決しない場合は、質問を編集して、出力の一部であるが表示したくない文を少なくとも 1 つ含めてください。

于 2016-11-16T09:37:10.943 に答える
0

これを行う場合:

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

"SLC22A1文字列の先頭ではなく文字列でテストして"Metformin"います(2番目の部分はおそらくあなたが望むものではありません)

あなたはおそらくこれを望んでいました:

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

このfindメソッドは戻り値が原因でエラーが発生しやすく、位置を気にしないため、 を使用した方がよいでしょうin

文中の 2 つの単語をテストするには (2 回目の出現では大文字と小文字を区別しない可能性があります)、次のようにします。

if "SLC22A1" in vlow and "metformin" in value.lower():
于 2016-11-16T09:17:18.137 に答える