Я хочу извлечь предложения, содержащие название наркотика и гена, из 10000 статей

Я хочу извлечь предложения, содержащие название наркотика и гена, из 10000 статей. и мой код

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, р 0,001)". "В заключение, мы не смогли продемонстрировать поразительные ассоциации изученных полиморфизмов SLC22A1, ACE, AGTR1 и ADD1 с антидиабетическими реакциями на метформин в этом хорошо контролируемом исследовании".

Этот код возвращает много предложений, т. Е. Если одно предложение выше вошло в предложение, которое распечатывается...! Помогите мне сделать код для этого

3 ответа

Вы не показываете свой реальный код, но у кода, который у вас сейчас есть, есть по крайней мере одна ошибка, которая может привести к множеству ложных результатов. Это на этой линии:

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

Это регулярное выражение не соответствует строкам, содержащим gene, как вы четко намеревались. Это соответствует (почти) любая строка содержит одну из букв g, e или же n,

Это не может быть вашим реальным кодом, так как a это список, и вы получите ошибку в этой строке - плюс вы игнорируете результаты findall()! Разберитесь с вопросом, чтобы он отражал реальность. Если ваша проблема все еще не решена, отредактируйте ваш вопрос и включите хотя бы одно предложение, которое является частью вывода, но вы НЕ хотите, чтобы его видели.

Когда вы делаете это:

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():

Я бы выбрал другой подход:

  1. Читайте в текстовом файле
  2. Разделите текстовый файл на предложения. Зайдите на /questions/17364764/python-razbit-tekst-na-predlozheniya/17364800#17364800 чтобы сделать это вручную. Или вы можете использовать модуль ntlk.tokenizer.punkt. (Отредактировано после того, как Алексис указала мне правильное направление в комментариях ниже).
  3. Проверьте, найду ли я ваши ключевые термины в каждом предложении, и напечатайте, если я это сделаю

Пока ваши текстовые файлы хорошо отформатированы, это должно работать.

Другие вопросы по тегам