Vielen Dank an alle Forscher, die das Kakenhi-Antragsformular schreiben. Wie Sie wissen, ist die in der Vergangenheit angenommene Forschung in der Kakenhi-Datenbank aufgeführt. Es ist jedoch ziemlich schwierig, alle zu sehen. Lassen Sie uns einen groben Überblick über vergangene Trends bekommen! Deshalb habe ich diesmal versucht, Schlüsselwörter durch Verarbeitung natürlicher Sprache aus den Forschungsergebnissen in der Kakenhi-Datenbank zu extrahieren. Ich verwende das morphologische Analysepaket MeCab und den Begriff Extraktionswerkzeug termextract.
Verwenden Sie Python und Jupyter Notebook.
MeCab Siehe hier, installieren Sie MeCab und mecab-python3 für die morphologische Analyse und legen Sie neologd als Standardwörterbuch fest. Versuchen Sie es nach der Installation mit bash.
bash
echo "Eukaryotisch" | mecab
Wahres Präfix,Nomenverbindung,*,*,*,*,wahr,Ma,Ma
Kernnomen,Allgemeines,*,*,*,*,Nuklear,schreiben,schreiben
Biologisches Substantiv,Allgemeines,*,*,*,*,Organismus,Speichert,Speichert
EOS
Das Standard-ipadic erkennt keine "enuklearen Organismen".
bash
echo "Wissenschaftliches Forschungsstipendium" | mecab
Wissenschaftliche Nomenklatur,Allgemeines,*,*,*,*,Wissenschaft,Kagaku,Kagaku
Forschungsnomenklatur,Verbindung ändern,*,*,*,*,die Studium,Kenkyu,Kenkyu
Ausgaben Nomenklatur,Suffix,Allgemeines,*,*,*,Kosten,Hallo,Hallo
Hilfsnomenklatur,Verbindung ändern,*,*,*,*,Hilfs-,Hojo,Hojo
Gold Nomen,Suffix,Allgemeines,*,*,*,Geld,Verwandtschaft,Verwandtschaft
EOS
Auch das "Scientific Research Grant" hat er nicht anerkannt.
bash
echo "Eukaryotisch" | mecab
Eukaryotische Nomenklatur,Proprietäre Nomenklatur,Allgemeines,*,*,*,Eukaryotisch,Shinkaku rettet,Shinkaku rettet
EOS
neologd hat "enukleare Organismen" erkannt! Wenn dies der Fall ist, können wir ein wenig von der Keyword-Extraktion erwarten?
bash
echo "Wissenschaftliches Forschungsstipendium" | mecab
Wissenschaftliche Nomenklatur,Allgemeines,*,*,*,*,Wissenschaft,Kagaku,Kagaku
Forschungsnomenklatur,Verbindung ändern,*,*,*,*,die Studium,Kenkyu,Kenkyu
Ausgaben Nomenklatur,Suffix,Allgemeines,*,*,*,Kosten,Hallo,Hallo
Subventionsnomen,Proprietäre Nomenklatur,Allgemeines,*,*,*,Subvention,Hojokin,Hojokin
EOS
"Wissenschaftliches Forschungsstipendium" scheint nicht als ein Wort anerkannt zu werden.
mecab-python Versuchen wir es mit MeCab in Python. Ich habe den ersten Satz der folgenden Daten zum Testen ausgeliehen.
python
import sys
import MeCab
tagger = MeCab.Tagger ("mecabrc")
print(tagger.parse ("Eukaryontische Organismen können grob in Uniconta und Biconta unterteilt werden."))
Ausgabeergebnis
Eukaryotische Nomenklatur,Proprietäre Nomenklatur,Allgemeines,*,*,*,Eukaryotisch,Shinkaku rettet,Shinkaku rettet
Ist ein Assistent,Hilfe,*,*,*,*,Ist,C.,Beeindruckend
Uniconta-Nomenklatur,Proprietäre Nomenklatur,Allgemeines,*,*,*,Uniconta,Uniconta,Uniconta
Und Hilfswörter,Parallele Assistenten,*,*,*,*,Wann,Zu,Zu
Biconta-Nomenklatur,Proprietäre Nomenklatur,Allgemeines,*,*,*,Biconta,Biconta,Biconta
Hilfs,Fallassistent,Allgemeines,*,*,*,Zu,D.,D.
Daibetsu Substantiv,Verbindung ändern,*,*,*,*,Grob geteilt,Taibetsu,Taibetsu
Kann verb,Unabhängigkeit,*,*,Ein Schritt,Grundform,es kann,Dekill,Dekill
.. Symbol,Phrase,*,*,*,*,。,。,。
EOS
Ich konnte die Morphologie von Python aus analysieren.
termextract Begriffsextrakt ist ein Paket, das Fachbegriffe extrahiert. Sie müssen die Daten in Form von MeCab-Analyseergebnissen übergeben. Ich habe es unter Bezugnahme auf [hier] installiert (https://qiita.com/EastResident/items/0cdc7c5ac1f0a6b3cf1d).
Wir werden endlich die Kakenhi-Daten verarbeiten. Zuerst dachte ich über das Scraping mit Python nach und recherchierte verschiedene Dinge wie Scraping verboten, aber mir wurde klar, dass ich es mit csv herunterladen konnte. , Ich habe nichts. Ich werde alle Artikel mit dem Suchwort "Cramid Monas" herunterladen. Wenn Sie mit Cramid Monas nicht vertraut sind, lesen Sie bitte hier.
Lesen Sie die Daten mit Pandas und überprüfen Sie sie. Ich habe vergessen, die Codierung anzugeben, aber sie wurde ohne Fehler geladen.
python
import pandas as pd
kaken = pd.read_csv('kaken.nii.ac.jp_2020-10-23_22-31-59.csv')
Überprüfen Sie den ersten Teil der Daten mit kaken.head ()
. Es scheint viel NaN zu geben.
Überprüfen Sie die gesamten Daten mit kaken.info ()
.
Ausgabeergebnis
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 528 entries, 0 to 527
Data columns (total 40 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 Name des Forschungsobjekts 528 nicht-null object
1 Name des Forschungsobjekts(Englisch) 269 non-null object
2 Forschungsgegenstand/Bereichsnummer 528 nicht-null object
3 Forschungszeitraum(Jahr) 528 non-null object
4 Auftraggeber 471 nicht-null object
5 Forschungskoordinator 160 nicht-null object
6 Verbundforscher 31 nicht-null object
7 Mitarbeiter 20 nicht-null object
8 Research Fellow 53 non-null object
9 Foreign Research Fellow 4 non-null object
10 Akzeptierte Forscher 4 nicht-null object
11 Stichwörter 505 nicht-null object
12 Forschungsfelder 380 nicht-null object
13 Prüfungskategorie 102 nicht-null object
14 Forschungsveranstaltungen 528 nicht-null object
15 Forschungsinstitut 528 nicht-null object
16 Anwendungskategorie 212 nicht-null object
17 Gesamtzuteilungsbetrag 526 nicht-null float64
18 Gesamtzuordnung(Direkte Kosten) 526 non-null float64
19 Gesamtzuordnung(Indirekte Ausgaben) 249 non-null float64
20 Zuteilungsbetrag für jedes Jahr 526 nicht-null object
21 Zuteilungsbetrag für jedes Jahr(Direkte Kosten) 526 non-null object
22 Zuteilungsbetrag für jedes Jahr(Indirekte Ausgaben) 526 non-null object
23 Bisherige Leistung(Klassifizierungscode) 46 non-null float64
24 Bisherige Leistung(Einstufung) 46 non-null object
25 Grund 46 nicht-null object
26 Umriss der Forschung zu Beginn der Forschung 14 nicht-null object
27 Forschungsübersicht 323 nicht-null object
28 Forschungsskizze(Englisch) 156 non-null object
29 Zusammenfassung der Forschungsergebnisse 85 nicht-null object
30 Zusammenfassung der Forschungsergebnisse(Englisch) 85 non-null object
31 Zusammenfassung der Forschungsergebnisse 84 nicht-null object
32 Bisherige Leistung(Absatz) 90 non-null object
33 Maßnahmen zur Förderung der künftigen Forschung 94 non-null object
34 Planen Sie die Verwendung von Forschungsmitteln für das nächste Geschäftsjahr 0 non-null float64
35 Grund für den im nächsten Geschäftsjahr verwendeten Betrag 0 nicht-null float64
36 Nutzungsplan für nächstes Jahr 0 nicht-null float64
37 Freies Beschreibungsfeld 0 nicht-null float64
38 Bewertungssymbol 3 nicht-null object
39 Bemerkungen 0 nicht-null float64
dtypes: float64(9), object(31)
memory usage: 165.1+ KB
Es scheint, dass Sätze in "Überblick über die Forschung zu Beginn der Forschung", "Überblick über die Forschung", "Überblick über die Forschungsergebnisse" und "Überblick über die Forschungsergebnisse" enthalten sind. Es gibt auch ein "Schlüsselwort", aber dieses Mal möchte ich das Schlüsselwort aus dem Text extrahieren, damit ich es ignoriere. Wahrscheinlich, weil sich die zu schreibenden Elemente von Jahr zu Jahr geändert haben, gibt es viele NaNs und die Zeilen, die die Sätze enthalten, sind nicht ausgerichtet. Ich beschloss, eine Liste zu erstellen, indem ich nur die Sätze aus dem Datenrahmen extrahierte.
python
column_list = ['Umriss der Forschung zu Beginn der Forschung', 'Forschungszusammenfassung', 'Zusammenfassung der Forschungsergebnisse', 'Überblick über die Forschungsergebnisse']
abstracts = []
for column in column_list:
abstracts.extend(kaken[column].dropna().tolist())
Bereit für die morphologische Analyse. Lassen Sie uns für jedes Element dieser Liste eine morphologische Analyse durchführen.
Unter Bezugnahme auf hier habe ich eine Funktion definiert, die als Ergebnis einer morphologischen Analyse mit MeCab eine Liste von Wörtern zurückgibt. Standardmäßig werden nur Nomenklaturen, Verben und Adjektive extrahiert und Verben und Adjektive in ihrer ursprünglichen Form wiederhergestellt.
python
tagger = MeCab.Tagger('')
tagger.parse('')
def wakati_text(text, word_class = ['Verb', 'Adjektiv', 'Substantiv']):
#Trennen Sie jeden Knoten
node = tagger.parseToNode(text)
terms = []
while node:
#Wort
term = node.surface
#Teil
pos = node.feature.split(',')[0]
#Wenn der Text des Teils den Bedingungen entspricht
if pos in word_class:
if pos == 'Substantiv':
terms.append(term) #Form im Satz
else:
terms.append(node.feature.split(",")[6]) #Setzen Sie den Prototyp ein
node = node.next
return terms
Lassen Sie uns einen Teil der zuvor extrahierten Daten testen.
Es können nur Nomenklaturen, Verben und Adjektive extrahiert werden. ("9 + 2 Struktur" kann nicht extrahiert werden ...)
Wenden Sie die Funktion wakati_text
auf die gesamte Liste abstracts
an, um eine Liste von Nomenklaturen, Verben und Adjektiven zu erhalten.
python
wakati_abstracts = []
for abstract in abstracts:
wakati_abstracts.extend(wakati_text(abstract))
Sie haben jetzt eine Liste mit Nomenklaturen, Verben und Adjektiven.
Zählen Sie die Elemente in der Liste wakati_abstracts
und versuchen Sie, ein Balkendiagramm von der größten Zahl bis zum 50. Platz zu erstellen.
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")
Da das Stoppwort nicht entfernt wurde, werden "do", "koto", "reru", "is", "target" usw. hoch eingestuft. Zusätzlich zum Suchwort "Cramid Monas" werden Wörter, die Cramido Monas verwandten Personen bekannt sind, wie "Gen", "Licht", "Zelle", "Peitsche", "Protein" und "Dynin", in einer Reihe angeordnet. Benötigten Sie keine Verben und Adjektive? Es ist ein Ergebnis, das zu sein scheint.
Ich habe versucht, nur die Nomenklatur nach dem gleichen Verfahren wie oben zu extrahieren.
Setzen Sie einfach das zweite Argument der Funktion wakati_abstract
auf ['noun']
.
python
noun_abstracts = []
for abstract in abstracts:
noun_abstracts.extend(wakati_text(abstract, ['Substantiv']))
Der Code in der Mitte ist der gleiche wie oben, daher werde ich ihn weglassen und das Ergebnis der Visualisierung anzeigen. Ich mache mir Sorgen, dass "koto" an erster Stelle steht und die Zahlen "1", "2" und "3" enthalten sind, aber das Ergebnis ähnelt eher einem Schlüsselwort als zuvor.
Versuchen Sie als Nächstes, technische Begriffe mit termextract zu extrahieren. Ich habe die morphologische Analysemethode unter Bezugnahme auf [hier] ausprobiert (https://qiita.com/EastResident/items/0cdc7c5ac1f0a6b3cf1d).
Das Eingabeformat von termextract ist das Ausgabeergebnis der morphologischen Analyse von MeCab. Analysieren Sie die Liste "Abstracts" mit MeCab und verketten Sie die Analyseergebnisse jedes Elements in ein durch Zeilenumbrüche getrenntes Format.
python
#Pass in Form von Mecab
mecab_abstracts = []
for abstract in abstracts:
mecab_abstracts.append(tagger.parse(abstract))
input_text = '/n'.join(mecab_abstracts)
Der Code ist fast vollständig hier.
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)
#Sortieren und ausgeben in absteigender Reihenfolge der Wichtigkeit
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")
Ich bin nicht sicher, was die Punktzahl bedeutet, aber ich sehe diese Worte. Lassen Sie uns dies auch visualisieren.
Der Code ist der gleiche wie oben, daher werde ich ihn weglassen. Wahrscheinlicher sind Wörter wie "photochemisches System II", "Transformator", "Peitschenbewegung" und "Gengruppe". Ist es nicht in Ordnung, dass "Cramid Monas" und "Green Alga Cramid Monas" und "Dinin" und "Shaft Dinin" unterschiedliche Gegenstände sind?
Schlüsselwörter wurden aus den Suchergebnissen der Kakenhi-Datenbank extrahiert. Im Vergleich zum Ergebnis nur der morphologischen Analyse mit MeCab konnte termextract Wörter extrahieren, die eher Schlüsselwörtern ähneln.
Ich habe auch [GiNZAs einzigartige Ausdrucksextraktion] ausprobiert (https://qiita.com/yuto16/items/1fc1f2b79195a503c681).
python
import spacy
from spacy import displacy
nlp = spacy.load('ja_ginza')
doc = nlp(abstracts[0])
#Zeichnen des Ergebnisses der Eigenausdrucksextraktion
displacy.render(doc, style="ent", jupyter=True)
Es ist kein eindeutiger Ausdruck, daher kann ich nicht anders, als die Ausdrücke zu erhalten, die ich verwenden möchte, z. B. "Uniconta", "Biconta", "Faserhaar" und "Cramid Monas". Und schließlich kann "9 + 2 Struktur" nicht genommen werden.
Recommended Posts