2016-11-14 3 views
0

Je veux extraire des phrases contenant un nom de médicament et de gène à partir de 10 000 articles. et mon code estJe veux extraire des phrases contenant un médicament et un nom de gène à partir de 10 000 articles

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) 

Je veux extraire des phrases qui ont le gène et le nom du médicament dans le corps de l'article. Par exemple "La metformine a diminué logarithmiquement converti SLC22A1 excrétion (de 1.5860.47 à 1.0060.52, p¼0.001)." "En conclusion, nous ne pouvions pas démontrer des associations frappantes des polymorphismes étudiés de SLC22A1, ACE, AGTR1 et ADD1 avec des réponses antidiabétiques à la metformine dans cette étude bien contrôlée."

Ce code renvoie beaucoup de phrases, c'est-à-dire si un mot de dessus est entré dans la phrase qui est imprimée ...! Aidez-moi faire le code pour cette

+0

S'il vous plaît décrire décrire exactement ce qui ne va pas. Que devrait-il se passer et que se passe-t-il à la place? – lenz

+1

Avec l'instruction 'print (tmp)', vous imprimez tout ce que vous lisez, quelles que soient vos recherches. Si votre problème est que vous avez plus de lignes 'Result' dans la sortie que vous le souhaitez, alors clarifiez votre question. – alexis

+0

'si value.find (" SLC22A1 ")! = -1 et value.find (" Metformin ")' que voulez-vous faire ici? vérifier si "SLC22A1" et "Metformin" sont dans la valeur? parce que si c'est ça, alors c'est faux. –

Répondre

0

Lorsque vous faites ceci:

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

Vous testez pour "SLC22A1 dans la chaîne et "Metformin" pas au début de la chaîne (la deuxième partie est probablement pas ce vous voulez)

vous avez probablement voulu ceci:

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

cette méthode find i s risque d'erreur en raison de sa valeur de retour et vous ne vous souciez pas de la position, de sorte que vous seriez mieux avec in.

Pour tester 2 mots dans une phrase (peut-être insensible à la casse pour l'occurrence 2) comme cela:

if "SLC22A1" in vlow and "metformin" in value.lower(): 
+0

Puis-je essayer d'autres options comme l'expression régulière, etc? –

1

vous ne montrez pas votre code réel, mais le code que vous avez a maintenant au moins une erreur qui conduirait à beaucoup de sortie faux. Il est sur cette ligne:

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

Cette expression rationnelle ne correspond pas à des chaînes contenant gene, comme vous clairement l'intention. Il correspond (presque) à n'importe quelle chaîne contient l'une des lettres g, e ou n.

Ceci ne peut pas être votre vrai code, puisque a est une liste et vous obtiendriez une erreur sur cette ligne - plus vous ignorez les résultats du findall()! Triez votre question pour qu'elle reflète la réalité. Si votre problème n'est toujours pas résolu, éditez votre question et inclure au moins une phrase indiquant que fait partie du produit mais que vous ne voulez pas voir.

+0

Oui, c'est une erreur. S'il vous plaît aidez-moi à faire des déclarations correctes pour régler le problème. Comme vous avez compris ce que je veux dire. Donc, d'autres approches que vous me suggéreriez? –

+1

Si vous ne pouvez même pas copier-coller et relire votre propre code, quel genre d'aide attendez-vous de moi? Obtenez votre question dans l'ordre et quelqu'un peut essayer de vous aider. Personne ici n'aime deviner ce que les questionneurs sont en train de faire. – alexis

0

je prendrais une approche différente:

  1. Lire dans le fichier texte
  2. de Split le fichier texte en phrases. Découvrez https://stackoverflow.com/a/28093215/223543 pour une approche roulée à la main pour ce faire. Ou vous pouvez utiliser le module ntlk.tokenizer.punkt. (Edité après Alexis m'a indiqué dans la bonne direction dans les commentaires ci-dessous).
  3. Vérifiez si je trouve vos termes clés dans chaque phrase et imprimez si je le fais.

Tant que vos fichiers texte sont bien formatés, cela devrait fonctionner.

+0

L'OP utilise déjà le nltk, qui fournit la division des phrases. Qu'est-ce qui est "brillant" à propos du piratage de votre propre solution inférieure? – alexis

+0

Vous avez raison. J'ai environ deux semaines pour apprendre toutes les bibliothèques Python. Il suffit de lire le module nltk.tokenize.punkt. –

+0

Content que vous ayez fait la correction, mais votre "réponse" indique simplement à l'OP de faire ce qu'elle est en train de faire. La prochaine fois, assurez-vous que vous pouvez réellement résoudre le problème avant d'écrire une réponse. Sinon, ce n'est pas une réponse. – alexis