PubMed publie des résumés d'articles, mais il peut être très fastidieux de rechercher manuellement les résumés de centaines ou de milliers de rapports.
Par conséquent, dans cet article, nous utiliserons le nuage de mots pour l'exploration de texte d'un grand nombre d'articles. Avec WordCloud, vous pouvez découvrir quels mots sont couramment utilisés dans vos articles.
Toutes les analyses de cet article ont été mises en œuvre dans Google Colaboratory.
Cette fois, j'analyserai 1000 articles, mais ce serait une perte de temps de les télécharger manuellement un par un, donc je les laisserai télécharger automatiquement par programmation.
Tout d'abord, installez biopython.
!pip install biopython
Ensuite, chargez biopython et enregistrez votre adresse e-mail.
from Bio import Entrez
Entrez.email = "Mon adresse email"
Spécifiez le mot-clé que vous souhaitez rechercher. Les résultats de la recherche pour ces mots-clés sont stockés dans la variable pmids au format liste.
term = "covid-19 age risk"
handle = Entrez.esearch(db="pubmed", term=term, retmax=1000)
record = Entrez.read(handle)
pmids = record["IdList"]
Parmi les résultats de la recherche, seul le PMID était stocké dans pmids. PMID est le numéro d'identification de l'article stocké dans PubMed.
Ensuite, entrez le PMID et créez une fonction pour obtenir le résumé de l'article.
def get_abstract(pmid):
try:
handle = Entrez.efetch(db="pubmed", id=pmid, rettype="medline", retmode="xml")
return " ".join(Entrez.read(handle)["PubmedArticle"][0]["MedlineCitation"]["Article"]["Abstract"]["AbstractText"])
except:
return "emoriiin979"
PubMed stocke également des articles qui ne contiennent pas de résumés, et j'obtiens une erreur en essayant d'obtenir des données clés AbstractText d'eux, donc je lui ai fait afficher mon nom si les résumés n'existent pas.
Cela me permettra de bien fonctionner si je spécifie plus tard de ne pas utiliser mon nom pour l'analyse.
Utilisons maintenant cette fonction pour accéder à l'API PubMed et en obtenir l'essentiel.
from tqdm import tqdm
from time import sleep
text = ""
for i in tqdm(range(len(pmids))):
text += " " + get_abstract(pmids[i])
sleep(0.5)
Cette fois, afin de créer un nuage de mots avec la bibliothèque Word Cloud, les résumés de 994 rapports (6 rapports n'avaient pas de résumé) sont résumés dans une chaîne de caractères.
Puisqu'il y a une pause de 0,5 seconde pour chaque accès à PubMed, il faut environ 20 minutes pour obtenir 1000 rapports.
Maintenant que nous avons les chaînes à utiliser pour l'analyse, il est temps de créer le nuage de mots.
Tout d'abord, téléchargez le dictionnaire utilisé pour charger et analyser la bibliothèque.
import nltk
from nltk import tokenize
from nltk import stem
from nltk.corpus import stopwords
nltk.download("punkt")
nltk.download("wordnet")
nltk.download("stopwords")
Ensuite, la chaîne est décomposée (tokenisée) en mots.
Par exemple, si vous donnez la chaîne "J'aime une pomme.", Elle sera décomposée en ["I", "comme", "une", "pomme", "."].
words = tokenize.word_tokenize(text)
filtered_words = [w for w in words if w not in stopwords.words("english")]
Ici, nous supprimons également les mots qui ne sont pas utilisés dans l'analyse (mots vides).
Ensuite, nous allons lemmaiser les mots (mots-clés). Par exemple, si vous donnez le mot «pommes», il sera converti en «pomme».
lemmatizer = stem.WordNetLemmatizer()
lem_text1 = ""
for word in filtered_words:
lem_text1 += lemmatizer.lemmatize(word) + " "
Ceci termine la normalisation de la liste de mots utilisée pour l'analyse.
Enfin, créez un nuage de mots avec la bibliothèque Word Cloud.
from wordcloud import WordCloud
wc1 = WordCloud(background_color="white", width=600, height=400, min_font_size=15)
wc1.generate(lem_text1)
wc1.to_file("wordcloud1.png ")
Le nuage de mots créé est le suivant.
Dans cette figure, la plus grande taille de police est le mot qui apparaît fréquemment dans le papier.
Puisque "covid-19" est inclus dans le mot-clé de recherche cette fois, la fréquence d'apparition de "COVID" et "CoV" est naturellement élevée.
Il est naturel que des mots tels que "COVID" et "CoV" soient sortis, et comme il s'agit d'informations moins importantes, je voudrais exclure ces mots de l'analyse.
Tout d'abord, sélectionnez les mots dont vous ne pensez pas avoir besoin dans le nuage de mots actuel.
more_stopwords = [
"patient",
"study",
"infection",
"pandemic",
"result",
"coronavirus",
"among",
"outcome",
"data",
"may",
"included"
]
Supprimez ensuite ces mots de filtered_words et recréez le nuage de mots.
lem_text2 = ""
for word in filtered_words:
tmp = lemmatizer.lemmatize(word)
if tmp not in more_stopwords:
if "COVID" not in tmp and "CoV" not in tmp:
lem_text2 += tmp + " "
wc2 = WordCloud(background_color="white", width=600, height=400, min_font_size=15)
wc2.generate(lem_text2)
wc2.to_file("wordcloud2.png ")
Pour "COVID" et "CoV", il existe des fluctuations de notation telles que "COVID-19" et il n'a pas été possible d'exclure des correspondances exactes, de sorte que les correspondances partielles sont exclues individuellement.
Le résultat de l'exclusion de ces mots est le suivant.
Le mot que vous avez sélectionné précédemment semble être exclu dans une certaine mesure.
En répétant ce processus, il semble que nous pourrons éventuellement créer un nuage de mots avec uniquement les mots nécessaires.
Dans cet article, nous avons utilisé biopython et WordCloud pour analyser la fréquence d'utilisation des mots dans le résumé de PubMed.
Quant à l'impression de cette analyse, j'ai senti que la précision de la tokenisation et du lemming de NLTK était un peu mauvaise.
Dans la tokenisation, les virgules (,) et les points (.) Ne pouvaient pas être supprimés, et dans la lemmaisation, les "accompagnements" ne pouvaient pas être convertis en "accompagner" et étaient sortis tels quels, donc améliorez leur précision. Je pense que c'est un problème futur.
En plus du nuage de mots, il semble y avoir d'autres méthodes d'analyse de la fréquence d'apparition des mots, je voudrais donc les étudier et les utiliser également.
c'est tout.
Recommended Posts