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