[PYTHON] Ich habe eine Emotionsradarkarte von Aozora Bunkos Arbeit erstellt

Überblick

Einführung

Dies ist der Artikel zum 14. Tag von "Fujitsu Cloud Technologies Adventskalender 2019". Gestern war @ 213s Geschichte des Hindernisses, das dieses Jahr aufgetreten ist ..

Hat Herr 213 den Freitag des 13. überlebt? Ich bin neugierig.

Hauptthema

Die Leute wollen plötzlich ein Buch lesen, aber je nach Stimmung zu diesem Zeitpunkt kann der Inhalt hell oder dunkel sein, und die Tendenz des Buches, das Sie lesen möchten, ändert sich.

Ich habe jedoch keine Zeit, die Zusammenfassung und den Inhalt im Buchladen ** abzurufen, und er ist im Internet kostenlos für die Öffentlichkeit zugänglich Aozora Bunko. Es gibt keine Zusammenfassung in /), daher können Sie nicht verstehen, um welche Art von Arbeit es sich handelt, es sei denn, Sie lesen sie.

Machen wir es dann so, dass Sie den Inhalt des Buches auf einen Blick verstehen können **, ohne den Inhalt zu überprüfen.

Was ich gemacht habe

Damit die Menschheit den Inhalt auf einen Blick verstehen kann, ist es immer noch notwendig, den Inhalt des Buches zu veranschaulichen. Deshalb habe ich den Inhalt des Buches analysiert und daraus eine Radarkarte gemacht. Es scheint, dass "menschliche Disqualifikation" viele ** Abneigungs ** -Komponenten hat und "kein Wind" viele ** Freude ** -Komponenten hat.

ningenshikkaku.png1.pngkokor.pngningenisu.png

Implementierung

Zweck

Unter Berücksichtigung der Arbeits-URL von Aozora Bunko wird eine Radarkarte ausgegeben, die sich auf Emotionen konzentriert.

Arbeitsumgebung

Google colaboratory

Eigentliche Arbeit

Auf Japanisch illustrieren können

Standardmäßig werden japanische Labels, die matplotlib in Google Colabratory verwenden, verstümmelt. Daher habe ich die Schriftart heruntergeladen und den Cache gelöscht, damit ich Japanisch zeichnen kann. Nach dem Löschen wird es angezeigt, sobald die Laufzeit neu gestartet wird.

!apt-get -y install fonts-ipafont-gothic
!rm /root/.cache/matplotlib/fontlist-v310.json
!rm /root/.cache/matplotlib/fontList.json
#Starten Sie die Laufzeit neu

Laden Sie das Emotionswörterbuch herunter

Als nächstes habe ich das Emotionswörterbuch heruntergeladen, mit dem diesmal emotionale Ausdrücke extrahiert wurden. Dies wird veröffentlicht in ML-Ask, [The 3-Clause BSD License]( Es ist ein Open-Source-Wörterbuch gemäß https://opensource.org/licenses/BSD-3-Clause).

!wget http://arakilab.media.eng.hokudai.ac.jp/~ptaszynski/ccount/click.php?id=3 -O emotions.zip
!unzip emotions.zip

Nachdem Sie die Zip-Datei heruntergeladen und entpackt haben, wird eine Ausgabe ähnlich der folgenden angezeigt. Wenn Sie hier überprüfen, können Sie sehen, dass mehrere Textdateien im Verzeichnis "emotions" unter dem Arbeitsverzeichnis gespeichert sind. Jedes entspricht ** "Trauer", "Scham", "Wut", "Abneigung", "Angst", "Überraschung", "gut", "昂", "billig", "Freude" ** In der Datei werden die Wörter und Phrasen gespeichert, die diesem Gefühl entsprechen.

Archive:  emotions.zip
   creating: emotions/
  inflating: emotions/aware_uncoded.txt  
  inflating: emotions/haji_uncoded.txt  
  inflating: emotions/ikari_uncoded.txt  
  inflating: emotions/iya_uncoded.txt  
  inflating: emotions/kowa_uncoded.txt  
  inflating: emotions/odoroki_uncoded.txt  
  inflating: emotions/suki_uncoded.txt  
  inflating: emotions/takaburi_uncoded.txt  
  inflating: emotions/yasu_uncoded.txt  
  inflating: emotions/yorokobi_uncoded.txt  

Als ich den Inhalt von aware_uncoded.txt überprüfte, stellte ich fest, dass jede Zeile ein Wort enthielt, das als "traurig" klassifiziert war.

!head emotions/aware_uncoded.txt
Meine Brust zerreißt
Saug auf
In Tränen zerkratzt
Bewölktes Gesicht
Komm mit mir
Schrei
Weinen
Weinen
Weinen und weinen
Aufziehen

Emotionswörterbuchdaten lesen

Nachdem wir bestätigt haben, dass das Wörterbuch erfolgreich heruntergeladen wurde, laden Sie die Daten, damit sie auf Python verarbeitet werden können. Zu diesem Zweck haben wir die folgenden Funktionen definiert. Konvertiert die für jede Emotion getrennten Wörter und Phrasen in ein ** Diktatformat ** und gibt es zurück.

def get_emotional_words():
  emotions = ["aware", "haji", "ikari", "iya", "kowa", "odoroki", "suki", "takaburi", "yasu", "yorokobi"]
  emotional_words = {}
  for emotion in emotions:
    emotional_words[emotion] = []
    with open("emotions/" + emotion + "_uncoded.txt", "r") as f:
        for line in f:
          line = line.replace('\n','')
          emotional_words[emotion].append(line)
  return emotional_words

Erfassung von Arbeitsdaten von Aozora Bunko

Als nächstes werde ich die Arbeitsdaten abrufen, mit denen ich den Inhalt überprüfen möchte. Die Daten von Aozora Bunko werden auch auf Git veröffentlicht, aber diesmal habe ich die Daten von HTML erhalten. Ich nutze meine Erfahrung in Mein Artikel vor ungefähr 2 Jahren und versuche, eine Vorverarbeitung zu erhalten, um die Daten abzurufen.

def get_txt_from_aozorabunko(url):
  html = urllib.request.urlopen(url=url)
  soup = BeautifulSoup(html, "html.parser")
  #Holen Sie sich den Text →<div class="main_text">~ Körper ~</div>
  sentences = soup.find("div","main_text")
  #Extrahieren Sie nur den Charakterteil
  sentences = sentences.get_text().replace("\r", "").replace("\n", "").replace("\u3000", "")
  #Entfernen Sie Zeichen und Klammern in Klammern voller Breite (da Ruby als Klammerzeichen vorhanden ist).
  sentences = re.sub("(.*?)", "", sentences) 
  return sentences

Emotionsanalyse

Nachdem wir nun das Wörterbuch lesen und die Textdaten der Arbeit abrufen können, erstellen wir eine Funktion für die Emotionsanalyse. Dieses Mal haben wir die ** wörterbuchbasierte ** Methode übernommen und eine Emotionsanalyse mit einer relativ einfachen Methode durchgeführt. Insbesondere zählt es die Anzahl der Wörter, die im Emotionswörterbuch in den Textdaten der Arbeit enthalten sind. Hier ist der aktuelle Code.

def count_emotional_words(sentences, emotional_words):
  count_emotions = [0] * len(emotional_words.keys())
  for idx, emotion in enumerate(emotional_words.keys()):
    for word in emotional_words[emotion]:
      count_emotions[idx] += sentences.count(word)
  return count_emotions

Machen Sie eine Radarkarte

Erstellen Sie einen Code, um ein Radardiagramm der Häufigkeit des Auftretens des zuletzt erfassten emotionalen Ausdrucksworts zu erstellen. Dieser Artikel war beim Erstellen des Codes sehr hilfreich. Vielen Dank. Geben Sie die Liste der Emotionsnamen in "Beschriftungen" und die Häufigkeit der Emotionsausdruckwörter, die von der Funktion "count_emotional_words" empfangen werden, in "Werte" ein.

def plot_polar(labels, values, title):
  jp_font = {'fontname':'IPAGothic'}
  angles = np.linspace(0, 2 * np.pi, len(labels) + 1, endpoint=True)
  values = np.concatenate((values, [values[0]]))  #Machen Sie es zu einem geschlossenen Polygon
  fig = plt.figure()
  ax = fig.add_subplot(111, polar=True)
  ax.plot(angles, values, 'o-')  #Außenrahmen
  ax.fill(angles, values, alpha=0.25)  #füllen
  ax.set_thetagrids(angles[:-1] * 180 / np.pi, labels, fontsize=15, **jp_font)  #Achsenbeschriftung
  ax.set_rlim(0 ,max(values))
  ax.set_title("「" + title + "」", fontsize=15, **jp_font)

Lauf

Führen Sie es schließlich mit der Hauptfunktion aus. Wenn die URL von Aozora Bunko und der Titel der Arbeit für diese Hauptfunktion angegeben werden, wird eine Radarkarte wie die am Anfang ausgegeben.

def main(url, title):
  sentences = get_txt_from_aozorabunko(url)
  emotional_words = get_emotional_words()
  count_emotions = count_emotional_words(sentences, emotional_words)
  emotional_kanji = ["Trauer", "Schande", "Wütend", "Nicht mögen", "Unheimlich", "Überraschung", "Gut", "昂", "Ahn", "Freude"]
  labels = list(emotional_kanji)
  values = count_emotions
  plot_polar(labels, values, title)

Ausführungsbeispiel

Eigentlich habe ich versucht, "Human Disqualification" von Osamu Osamu einzutragen.

#Arbeits-URL von Aozora Bunko
ningen_shikkaku = "https://www.aozora.gr.jp/cards/000035/files/301_14912.html"
main(ningen_shikkaku,"Menschliche Disqualifikation")

ningenshikkaku.png

** Ich konnte sicher eine Radarkarte der emotionalen Tendenz der Arbeit erstellen! ** ** **

Ergebnis

Trends für jede Arbeit

Lassen Sie uns das Ausgabebeispiel am Anfang noch einmal überprüfen. Wenn ich mich auf die "Disqualifikation des Menschen" konzentriere, habe ich den Eindruck, dass ** "Kazenai" eine ziemlich gute Arbeit ist **. Andererseits ähnelt die Gesamtatmosphäre von "Kokoro" der "menschlichen Disqualifikation", aber ** es kann eine stärkere Liebeskomponente haben, weil es eine große günstige Komponente ** hat (beide sprechen von Farbliebe, aber " Ich habe das Gefühl, dass "Herz" ein direkter Ausdruck von Emotionen war. Andererseits kann aus der unheimlichen Sicht der Welt gefolgert werden, dass Ranpo Edogawas "Human Chair" tendenziell eine erschreckendere Komponente hat als andere Werke **. ningenshikkaku.png1.pngkokor.pngningenisu.png

Am Ende

Impressionen

** Es macht Spaß, die Radarkarten verschiedener Werke zu sehen ** (Running Melos ist überraschend traurig)

** Ich konnte mit einer einfachen wörterbuchbasierten Methode analysieren **

** Es gibt nur wenige japanische Emotionswörterbücher ** (das, das ich dieses Mal verwendet habe, und SNOW)

Ich wollte das auch tun

** Web-Toolisierung ** (Es war cool, es über einen Browser ausführen zu können)

** Reorganisation des Wörterbuchs ** (Da es einige 10 Arten von emotionalen Ausdrücken gibt, erstellen Sie eine Sammlung von ungefähr 5 Arten)

** Lassen Sie uns den Unterschied zwischen dem Anfang und dem Ende der Geschichte visualisieren ** (Die Entwicklung der Geschichte scheint sichtbar zu sein!)

Der nächste Adventskalender ist

Morgen sagte Herr Yoshitsugumiyazaki: "Es besteht eine hohe Wahrscheinlichkeit, AI-bezogene Bedenken zusammenzufassen." Es ist immer noch KI-Material. Ich freue mich darauf, welche Inhalte zusammengestellt werden!

Recommended Posts

Ich habe eine Emotionsradarkarte von Aozora Bunkos Arbeit erstellt
Ich habe einen Ansible-Installer gemacht
Ich habe einen Xubuntu-Server erstellt.
Ich habe einen Anpanman-Maler diskriminiert
Ich habe ein Angular Starter Kit gemacht
Ich habe eine Online-Frequenzanalyse-App erstellt
Ich habe ein alternatives Modul für japandas.DataReader erstellt
Was sind die Merkmale von AV-Schauspielerinnen? Ich habe aus dem Titel der Arbeit geraten! (^ _ ^) / ~~
Ich habe einen Appdo-Befehl erstellt, um Befehle im Kontext der App auszuführen
Mit LINEBot habe ich eine Anwendung erstellt, die mich über die "Buszeit" informiert.