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.
Utilisez Python et Jupyter Notebook.
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.
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».
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.
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.
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())
Prêt pour l'analyse morphologique. Effectuons une analyse morphologique sur chaque élément de cette liste.
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.
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.
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")
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.
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. 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.
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.
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)
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")
Je ne sais pas ce que signifie le score, mais je vois ces mots. Visualisons cela également.
Le code est le même que ci-dessus, je vais donc l'omettre. 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?
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.
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)
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.
Recommended Posts