[PYTHON] [Verarbeitung natürlicher Sprache] Extrahieren Sie Schlüsselwörter aus der Kakenhi-Datenbank mit MeCab-ipadic-neologd und termextract

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.

Umgebung

Verwenden Sie Python und Jupyter Notebook.

Betriebssystem usw.

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.

Standardwörterbuch ipadic (MeCab Standard)

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.

Standardwörterbuch neologd

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).

Laden Sie CSV-Daten aus der Kakenhi-Datenbank herunter

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 und Formatieren von Daten mit Pandas

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. 2020-10-24 13.21のイメージ.jpg Ü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())

スクリーンショット 2020-10-24 13.36.21.png Bereit für die morphologische Analyse. Lassen Sie uns für jedes Element dieser Liste eine morphologische Analyse durchführen.

Morphologische Analyse mit MeCab

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. スクリーンショット 2020-10-24 18.52.39.png 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. スクリーンショット 2020-10-24 18.57.10.png

Visualisierung

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")

kaken_bar.png 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.

Nur Extraktion der Nomenklatur

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. kaken_bar_noun.png 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.

Extraktion von Fachbegriffen mit Begriffsextrakt

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).

Datenformung

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)

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

Mit Term Extrakt analysieren

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")

スクリーンショット 2020-10-24 19.22.03.png Ich bin nicht sicher, was die Punktzahl bedeutet, aber ich sehe diese Worte. Lassen Sie uns dies auch visualisieren.

Visualisierung

Der Code ist der gleiche wie oben, daher werde ich ihn weglassen. kaken_bar_termextract.png 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?

Zusammenfassung

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.

Bonus: GiNZA

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)

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

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.

Referenz

Recommended Posts

[Verarbeitung natürlicher Sprache] Extrahieren Sie Schlüsselwörter aus der Kakenhi-Datenbank mit MeCab-ipadic-neologd und termextract
3. Verarbeitung natürlicher Sprache durch Python 2-2. Koexistenznetzwerk [mecab-ipadic-NEologd]
Studieren Sie die Verarbeitung natürlicher Sprache mit Kikagaku
[Verarbeitung natürlicher Sprache] Vorverarbeitung mit Japanisch
Künstliche Sprache Logivan und Verarbeitung natürlicher Sprache (Verarbeitung künstlicher Sprache)
Datenbanktabellen mit CSV extrahieren [ODBC-Verbindung von R und Python]
3. Verarbeitung natürlicher Sprache durch Python 2-1. Netzwerk für das gleichzeitige Auftreten
3. Verarbeitung natürlicher Sprache durch Python 1-1. Word N-Gramm
Ich habe versucht, natürliche Sprache mit Transformatoren zu verarbeiten.
Extrahieren Sie Informationen von Visitenkarten, indem Sie die Vision API und die Natural Language API kombinieren
Ich habe versucht, mit der Bibliothek GiNZA zur Verarbeitung natürlicher Sprache eindeutige Ausdrücke zu extrahieren
[Python] Ich habe mit der Verarbeitung natürlicher Sprache ~ Transformatoren ~ gespielt
Lassen Sie uns die Verarbeitung natürlicher Sprache mit der COTOHA-API genießen
Ich habe versucht, Mr. Hanyu und Mr. Hanyu mit dem Verarbeiter der Verarbeitung natürlicher Sprache × Naive Bayes zu klassifizieren
Erstellen einer Umgebung für die Verarbeitung natürlicher Sprache mit Python
Deep Learning 2 von Grund auf 1.3 Verarbeitung natürlicher Sprache 1.3 Zusammenfassung
Überblick über die Verarbeitung natürlicher Sprache und ihre Datenvorverarbeitung
Python: Verarbeitung natürlicher Sprache
RNN_LSTM2 Verarbeitung natürlicher Sprache
Verwenden Sie die Swagger-Benutzeroberfläche. Wenn Sie einen Swagger-UI-ähnlichen Stil wünschen, kopieren Sie einfach die gesamte Datei unter / dist unter https://github.com/swagger-api/swagger-ui. Danach schreiben Sie einfach hier in index.html die URL der yml-Datei um. Wenn Sie der Meinung sind, dass Sie @ApiModel oder @ApiModelProperty nicht finden können, wurden übrigens anscheinend alle Anmerkungen zur Schemadefinition in @Schema integriert. Emotionsanalyse mit Java, Swagger, OpenAPI, Micronaut Natural Language Processing! Ich habe versucht, die Bewertung anhand des Überprüfungstextes vorherzusagen
Arten der Vorverarbeitung in der Verarbeitung natürlicher Sprache und ihre Leistungsfähigkeit
100 Sprachverarbeitungsklopfen mit Python 2015
Verarbeitung natürlicher Sprache 1 Morphologische Analyse
Verarbeitung natürlicher Sprache 3 Wortkontinuität
Verarbeitung natürlicher Sprache 2 Wortähnlichkeit
Erstellen Sie mit BERT + LightGBM + optuna ganz einfach ein Modell für die Verarbeitung natürlicher Sprache
Ich habe versucht, natürliche Zahlenausdrücke und arithmetische Verarbeitung nur mit Listenverarbeitung
Extrahieren Sie Text aus [python] pdf und lesen Sie Zeichen mit Open-Jtalk vor
Dockerfile mit den notwendigen Bibliotheken für die Verarbeitung natürlicher Sprache mit Python
Fassen Sie mit tf.data.Dataset api zusammen, wie Text (Verarbeitung natürlicher Sprache) vorverarbeitet wird
Fallstudie zur Verarbeitung natürlicher Sprache: Worthäufigkeit in 'Anne mit einem E'
Extrahieren Sie Text aus [python] pdf und lesen Sie Zeichen mit Open-Jtalk vor
Datenbanktabellen mit CSV extrahieren [ODBC-Verbindung von R und Python]
[Verarbeitung natürlicher Sprache] Extrahieren Sie Schlüsselwörter aus der Kakenhi-Datenbank mit MeCab-ipadic-neologd und termextract
Extrahieren Sie japanischen Text aus PDF mit PDFMiner
Extrahieren Sie mit Python Daten von einer Webseite
Extrahieren Sie Bilder und Tabellen mit Python aus PDF, um die Berichtslast zu verringern