[PYTHON] Analyse du résumé de PubMed dans le nuage de mots

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.

environnement

Toutes les analyses de cet article ont été mises en œuvre dans Google Colaboratory.

Jusqu'à ce que vous obteniez le résumé du papier

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.

Créer un nuage de mots

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.

wordcloud1.png

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.

Exclure les mots inutiles

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.

wordcloud2.png

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.

finalement

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

Analyse du résumé de PubMed dans le nuage de mots
Visualisez les mots-clés dans les documents avec TF-IDF et Word Cloud
Générez Word Cloud à partir de données de cas d'essai avec python3
Jupyter dans l'IDE Cloud9
Analyse de texte pouvant être effectuée en 5 minutes [Word Cloud]
[Flask & Bootstrap] Visualisez le contenu des paroles avec Word Cloud ~ Lyrics Word Cloud ~