[PYTHON] [Traitement du langage naturel] Extraire les mots-clés de la base de données Kakenhi avec MeCab-ipadic-neologd et termextract

Merci à tous les chercheurs qui rédigent le formulaire de candidature Kakenhi. Comme vous le savez, les recherches adoptées dans le passé sont répertoriées dans la Base de données Kakenhi. Cependant, il est assez difficile de tous les voir. Ayons une idée approximative des tendances passées! Donc, cette fois, j'ai essayé d'extraire des mots-clés par traitement du langage naturel à partir du plan de recherche dans la base de données Kakenhi. J'utilise le package d'analyse morphologique MeCab et le terme outil d'extraction termextract.

Environnement

Utilisez Python et Jupyter Notebook.

OS etc.

MeCab Reportez-vous à here, installez MeCab et mecab-python3 pour l'analyse morphologique et définissez neologd comme dictionnaire standard. Une fois installé, essayez-le avec bash.

Dictionnaire standard ipadic (MeCab par défaut)

bash


echo "Eucaryote" | mecab
Vrai préfixe,Connexion de nom,*,*,*,*,vrai,Ma,Ma
Nucléaire,Général,*,*,*,*,Nucléaire,écrire,écrire
Nom biologique,Général,*,*,*,*,Organisme,Sauvegarde,Sauvegarde
EOS

L'ipadic par défaut ne reconnaît pas les "organismes énucléaires".

bash


echo "Bourse de recherche scientifique" | mecab
Nomenclature scientifique,Général,*,*,*,*,Science,Kagaku,Kagaku
Nomenclature de recherche,Changer de connexion,*,*,*,*,l'étude,Kenkyu,Kenkyu
Nomenclature des dépenses,suffixe,Général,*,*,*,Dépenses,salut,salut
Nomenclature auxiliaire,Changer de connexion,*,*,*,*,auxiliaire,Hojo,Hojo
Or substantif,suffixe,Général,*,*,*,Argent,Parents,Parents
EOS

Il n'a pas non plus reconnu la «bourse de recherche scientifique».

Dictionnaire standard neologd

bash


echo "Eucaryote" | mecab
Nomenclature eucaryote,Nomenclature propriétaire,Général,*,*,*,Eucaryote,Shinkaku enregistre,Shinkaku enregistre
EOS

neologd a reconnu des "organismes énucléaires"! Si tel est le cas, pouvons-nous attendre un peu de l'extraction de mots-clés?

bash


echo "Bourse de recherche scientifique" | mecab
Nomenclature scientifique,Général,*,*,*,*,Science,Kagaku,Kagaku
Nomenclature de recherche,Changer de connexion,*,*,*,*,l'étude,Kenkyu,Kenkyu
Nomenclature des dépenses,suffixe,Général,*,*,*,Dépenses,salut,salut
Subvention substantif,Nomenclature propriétaire,Général,*,*,*,Subvention,Hojokin,Hojokin
EOS

«Bourse de recherche scientifique» ne semble pas être reconnue comme un mot.

mecab-python Essayons MeCab en Python. J'ai emprunté la première phrase des données ci-dessous pour les tester.

python


import sys
import MeCab
tagger = MeCab.Tagger ("mecabrc")
print(tagger.parse ("Les organismes eucaryotes peuvent être largement divisés en uniconta et biconta."))

Résultat de sortie


Nomenclature eucaryote,Nomenclature propriétaire,Général,*,*,*,Eucaryote,Shinkaku enregistre,Shinkaku enregistre
Est un assistant,Assistance,*,*,*,*,Est,C,sensationnel
Nomenclature Uniconta,Nomenclature propriétaire,Général,*,*,*,Uniconta,Uniconta,Uniconta
Et des mots auxiliaires,Assistants parallèles,*,*,*,*,Quand,À,À
Nomenclature Biconta,Nomenclature propriétaire,Général,*,*,*,Biconta,Biconta,Biconta
Auxiliaire,Assistant de cas,Général,*,*,*,À,ré,ré
Daibetsu substantif,Changer de connexion,*,*,*,*,À peu près divisé,Taibetsu,Taibetsu
Verbe can,Indépendance,*,*,Un pas,Forme basique,ça peut,Dekill,Dekill
.. symbole,Phrase,*,*,*,*,。,。,。
EOS

J'ai pu analyser la morphologie de Python.

termextract term extract est un package qui extrait les termes techniques. Vous devez transmettre les données sous la forme de résultats d'analyse MeCab. Je l'ai installé en faisant référence à ici.

Télécharger les données csv de la base de données Kakenhi

Nous allons enfin gérer les données Kakenhi. Au début, je pensais au scraping avec Python, et je recherchais diverses choses comme Scraping interdit, mais j'ai réalisé que je pouvais le télécharger avec csv. , Je n'ai rien compris. Je téléchargerai tous les éléments avec le mot de recherche "Cramid Monas". Si vous n'êtes pas familier avec Cramid Monas, veuillez consulter ici.

Lecture et formatage des données avec les pandas

Lisez les données avec les pandas et vérifiez-les. J'ai oublié de spécifier le codage, mais il pourrait être lu sans aucune erreur.

python


import pandas as pd
kaken = pd.read_csv('kaken.nii.ac.jp_2020-10-23_22-31-59.csv')

Vérifiez la première partie des données avec kaken.head () ''. Il semble y avoir beaucoup de NaN. ![2020-10-24 13.21のイメージ.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/820036/884fa51a-df9b-202f-aca0-3d64bc92413a.jpeg) Vérifiez toutes les données avec kaken.info () ''.

Résultat de sortie


<class 'pandas.core.frame.DataFrame'>
RangeIndex: 528 entries, 0 to 527
Data columns (total 40 columns):
 #   Column            Non-Null Count  Dtype  
---  ------            --------------  -----  
0 Nom du sujet de recherche 528 non-null    object 
1 Nom du sujet de recherche(Anglais)        269 non-null    object 
2 Sujet de recherche/Numéro de zone 528 non-null    object 
3 Période de recherche(année)         528 non-null    object 
4 Principal 471 non-null    object 
5 Coordinateur de recherche 160 non-null    object 
6 Chercheurs collaboratifs 31 non-null     object 
7 collaborateurs 20 non-null     object 
8 Chercheur 53 non-null     object 
9 Chercheur étranger 4 non-null      object 
10 Chercheurs acceptés 4 non-null      object 
11 mots clés 505 non-null    object 
12 Domaines de recherche 380 non-null    object 
13 Catégorie d'examen 102 non-null    object 
14 événements de recherche 528 non-null    object 
15 institut de recherche 528 non-null    object 
16 Catégorie d'application 212 non-null    object 
17 Montant total de l'allocation 526 non-null    float64
18 Allocation totale(Dépenses directes)       526 non-null    float64
19 Allocation totale(Dépenses indirectes)       249 non-null    float64
20 Montant de l'allocation pour chaque année 526 non-null    object 
21 Montant de l'allocation pour chaque année(Dépenses directes)     526 non-null    object 
22 Montant de l'allocation pour chaque année(Dépenses indirectes)     526 non-null    object 
23 Réalisation à ce jour(Code de classification)  46 non-null     float64
24 Réalisation à ce jour(Classification)     46 non-null     object 
25 Raison 46 non-null     object 
26 Aperçu de la recherche au début de la recherche 14 non-null     object 
27 Plan de recherche 323 non-null    object 
28 Plan de recherche(Anglais)         156 non-null    object 
29 Résumé des résultats de la recherche 85 non-null     object 
30 Résumé des résultats de la recherche(Anglais)      85 non-null     object 
31 Résumé des résultats de la recherche 84 non-null     object 
32 Réalisation à ce jour(Paragraphe)     90 non-null     object 
33 Mesures pour promouvoir la recherche future 94 non-null     object 
34 Prévoir d'utiliser les fonds de recherche pour le prochain exercice 0 non-null      float64
35 Raison du montant utilisé au cours du prochain exercice 0 non-null      float64
36 Plan d'utilisation pour l'année prochaine 0 non-null      float64
37 Champ de description libre 0 non-null      float64
38 Symbole d'évaluation 3 non-null      object 
39 Remarques 0 non-null      float64
dtypes: float64(9), object(31)
memory usage: 165.1+ KB

Il semble que des phrases soient incluses dans «Résumé de la recherche au début de la recherche», «Résumé de la recherche», «Résumé des résultats de la recherche» et «Résumé des résultats de la recherche». Il y a aussi un "mot-clé", mais cette fois je veux extraire le mot-clé du texte, donc je vais l'ignorer. Probablement en raison du fait que les éléments à écrire ont changé d'année en année, il y a beaucoup de NaN et les lignes contenant les phrases ne sont pas alignées. J'ai décidé de faire une liste en extrayant uniquement les phrases de la base de données.

python


column_list = ['Aperçu de la recherche au début de la recherche', 'résumé de la recherche', 'Résumé des résultats de la recherche', 'Aperçu des résultats de la recherche']
abstracts = []

for column in column_list:
    abstracts.extend(kaken[column].dropna().tolist())

スクリーンショット 2020-10-24 13.36.21.png Prêt pour l'analyse morphologique. Effectuons une analyse morphologique sur chaque élément de cette liste.

Analyse morphologique avec MeCab

En référence à ici , j'ai défini une fonction qui renvoie une liste de mots à la suite d'une analyse morphologique avec MeCab. Par défaut, seuls la nomenclature, les verbes et les adjectifs sont extraits, et les verbes et adjectifs sont restaurés dans leur forme d'origine.

python


tagger = MeCab.Tagger('')
tagger.parse('')

def wakati_text(text, word_class = ['verbe', 'adjectif', 'nom']):
    #Séparez chaque nœud
    node = tagger.parseToNode(text)
    terms = []
    
    while node:
        #mot
        term = node.surface
        
        #Partie
        pos = node.feature.split(',')[0]

        #Si les paroles de la partie correspondent aux conditions
        if pos in word_class:
            if pos == 'nom':
                terms.append(term) #Forme dans la phrase
            else:
                terms.append(node.feature.split(",")[6]) #Mettre dans le prototype

        node = node.next

    return terms

Testons en utilisant une partie des données extraites précédemment. スクリーンショット 2020-10-24 18.52.39.png Seules la nomenclature, les verbes et les adjectifs peuvent être extraits. ("9 + 2 structure" ne peut pas être extrait ...) Appliquez la fonction wakati_text à la liste entière `ʻabstracts`` pour obtenir une liste de nomenclatures, verbes et adjectifs.

python


wakati_abstracts = []

for abstract in abstracts:
        wakati_abstracts.extend(wakati_text(abstract))

Vous avez maintenant une liste de nomenclature, de verbes et d'adjectifs. スクリーンショット 2020-10-24 18.57.10.png

Visualisation

Comptez les éléments de la liste `` wakati_abstracts '' et essayez de faire un graphique à barres du plus grand nombre à la 50e place.

python


import collections
import matplotlib.pyplot as plt
import matplotlib as mpl

words, counts = zip(*collections.Counter(wakati_abstracts).most_common())

mpl.rcParams['font.family'] = 'Noto Sans JP Regular'
plt.figure(figsize=[12, 6])
plt.bar(words[0:50], counts[0:50])
plt.xticks(rotation =90)
plt.ylabel('freq')
plt.savefig('kaken_bar.png', dpi=200, bbox_inches="tight")

kaken_bar.png Puisque le mot d'arrêt n'a pas été supprimé, «do», «koto», «reru», «is», «target», etc. sont classés en haut. En plus du mot de recherche «Cramid Monas», des mots familiers aux personnes apparentées à Cramido Monas tels que «gène», «lumière», «cellule», «fouet», «protéine» et «dynine» sont alignés. N'avez-vous pas besoin de verbes et d'adjectifs? C'est un résultat qui semble être.

Extraction de nomenclature uniquement

J'ai essayé d'extraire uniquement la nomenclature par la même procédure que ci-dessus. Définissez simplement le deuxième argument de la fonction wakati_abstract sur ['nom'].

python


noun_abstracts = []

for abstract in abstracts:
        noun_abstracts.extend(wakati_text(abstract, ['nom']))

Le code au milieu est le même que ci-dessus, je vais donc l'omettre et afficher le résultat de la visualisation. kaken_bar_noun.png Je crains que "koto" soit en premier lieu et que les nombres "1", "2" et "3" soient inclus, mais le résultat ressemble un peu plus à un mot-clé qu'auparavant.

Extraction de termes techniques à l'aide d'extrait de termes

Ensuite, essayez d'extraire les termes techniques à l'aide de termextract. J'ai essayé la méthode d'analyse morphologique en référence à ici.

Mise en forme des données

Le format d'entrée de termextract est le résultat de sortie de l'analyse morphologique MeCab. Analysez la liste des «résumés» avec MeCab et concaténez les résultats de l'analyse de chaque élément dans un format séparé par des sauts de ligne.

python


#Passer sous forme de mecab
mecab_abstracts = []

for abstract in abstracts:
        mecab_abstracts.append(tagger.parse(abstract))

input_text = '/n'.join(mecab_abstracts)

スクリーンショット 2020-10-24 19.17.59.png

Analyser avec un extrait de terme

Le code est presque entièrement ici.

python


import termextract.mecab
import termextract.core

word_list = []
value_list = []

frequency = termextract.mecab.cmp_noun_dict(input_text)
LR = termextract.core.score_lr(frequency,
         ignore_words=termextract.mecab.IGNORE_WORDS,
         lr_mode=1, average_rate=1
     )
term_imp = termextract.core.term_importance(frequency, LR)

#Tri et sortie par ordre décroissant d'importance
data_collection = collections.Counter(term_imp)
for cmp_noun, value in data_collection.most_common():
    word = termextract.core.modify_agglutinative_lang(cmp_noun)
    word_list.append(word)
    value_list.append(value)
    print(word, value, sep="\t")

スクリーンショット 2020-10-24 19.22.03.png Je ne sais pas ce que signifie le score, mais je vois ces mots. Visualisons cela également.

Visualisation

Le code est le même que ci-dessus, je vais donc l'omettre. kaken_bar_termextract.png Des mots plus vraisemblables tels que «système photochimique II», «transformateur», «mouvement de fouet» et «groupe de gènes» sont pris. N'est-il pas normal que "Cramid Monas" et "Green Alga Cramid Monas" et "Dinin" et "Shaft Dinin" soient des éléments différents?

Résumé

Les mots clés ont été extraits des résultats de recherche de la base de données Kakenhi. Par rapport au résultat d'une analyse morphologique uniquement avec MeCab, termextract a pu extraire des mots qui ressemblent plus à des mots-clés.

Bonus: GiNZA

J'ai également essayé l'extraction d'expression unique de GiNZA.

python


import spacy
from spacy import displacy

nlp = spacy.load('ja_ginza')
doc = nlp(abstracts[0]) 

#Dessin du résultat de l'extraction d'expressions propres
displacy.render(doc, style="ent", jupyter=True)

スクリーンショット 2020-10-24 20.21.44.png

Ce n'est pas une expression unique, donc je ne peux pas m'empêcher de trouver les expressions que je veux prendre, telles que «Uniconta», «Biconta», «Fiber hair» et «Cramid Monas». Et après tout "9 + 2 structure" ne peut pas être prise.

référence

Recommended Posts

[Traitement du langage naturel] Extraire les mots-clés de la base de données Kakenhi avec MeCab-ipadic-neologd et termextract
3. Traitement du langage naturel par Python 2-2. Réseau de co-occurrence [mecab-ipadic-NEologd]
Étudiez le traitement du langage naturel avec Kikagaku
[Traitement du langage naturel] Prétraitement avec le japonais
Logivan du langage artificiel et traitement du langage naturel (traitement du langage artificiel)
Extraire des tables de base de données avec CSV [connexion ODBC de R et python]
3. Traitement du langage naturel par Python 2-1. Réseau de co-occurrence
3. Traitement du langage naturel par Python 1-1. Word N-gram
J'ai essayé le traitement du langage naturel avec des transformateurs.
Extraire des informations de cartes de visite en combinant l'API Vision et l'API Natural Language
J'ai essayé d'extraire des expressions uniques avec la bibliothèque de traitement du langage naturel GiNZA
[Python] J'ai joué avec le traitement du langage naturel ~ transformers ~
Profitons du traitement du langage naturel à l'aide de l'API COTOHA
J'ai essayé de classer M. Hanyu et M. Hanyu avec le traitement du langage naturel × classificateur Naive Bayes
Créer un environnement pour le traitement du langage naturel avec Python
Deep Learning 2 from scratch 1.3 Traitement du langage naturel 1.3 Résumé
Vue d'ensemble du traitement du langage naturel et de son prétraitement des données
Python: traitement du langage naturel
RNN_LSTM2 Traitement du langage naturel
Analyse des émotions avec traitement du langage naturel! J'ai essayé de prédire l'évaluation à partir du texte de l'avis
Types de prétraitement dans le traitement du langage naturel et leur puissance
100 coups de traitement du langage avec Python 2015
Traitement du langage naturel 1 Analyse morphologique
Traitement du langage naturel 3 Continuité des mots
Traitement du langage naturel 2 similitude de mots
Créez facilement un modèle de traitement du langage naturel avec BERT + LightGBM + optuna
J'ai essayé l'expression des nombres naturels et le traitement arithmétique uniquement avec le traitement de liste
Extraire le texte du pdf [python] et lire les caractères à haute voix avec Open-Jtalk
Dockerfile avec les bibliothèques nécessaires pour le traitement du langage naturel avec python
Résumez comment prétraiter le texte (traitement du langage naturel) avec l'api tf.data.Dataset
Étude de cas sur le traitement du langage naturel: Fréquence des mots dans'Anne avec un E '
Extraire le texte du pdf [python] et lire les caractères à haute voix avec Open-Jtalk
Extraire des tables de base de données avec CSV [connexion ODBC de R et python]
[Traitement du langage naturel] Extraire les mots-clés de la base de données Kakenhi avec MeCab-ipadic-neologd et termextract
Extraire des images des ensembles de données Cifar et CUCUMBER-9
Extraire du texte japonais d'un PDF avec PDFMiner
Extraire des données d'une page Web avec Python
Extraire des images et des tableaux de pdf avec python pour réduire la charge de reporting