[PYTHON] Clustering von Büchern von Aozora Bunko mit Doc2Vec

Ich werde versuchen, ein ähnliches Werk aus den berühmten Werken zu finden, die in Aozora Bunko veröffentlicht wurden. Ich werde Doc2Vec für die Implementierung verwenden. Hinweis) Obwohl der Titel Clustering besagt, handelt es sich nicht ausschließlich um Clustering, nicht wahr?

Was ist Doc2Vec?

Doc2Vec ist eine Erweiterung der Idee von Word2Vec und verwendet zusätzlich zum Wortvektor einen Absatzvektor (Satz-ID). Um Doc2Vec zu verstehen, habe ich auf die folgende Seite verwiesen. https://benrishi-ai.com/doc2vec01/ https://kento1109.hatenablog.com/entry/2017/11/15/181838 Bei der Implementierung von Doc2Vec habe ich auch auf die folgende Seite verwiesen. https://qiita.com/g-k/items/5ea94c13281f675302ca Dieser Qiita-Artikel erklärte auch kurz über Doc2Vec, Ich wusste nicht, was ein Absatzvektor (Satz-ID) ist. Ich denke, es ist ein Vektor, der die Summe aller Wortvektoren ist, die in diesem Absatz erscheinen. Sie müssen das Doc2Vec-Papier lesen und studieren! Es ist eine weitere Gelegenheit! Diesmal ist es implementiert!

Implementierungsstart

Dieses Mal werde ich die Werke von Aozora Bunko kratzen, um die Sätze zu erhalten, und ich werde die Werke in der Nähe von "Human Disqualification" von Osamu Tadashi aus den Werken von Aozora Bunko nachschlagen.

#Importieren Sie die erforderlichen Bibliotheken
from bs4 import BeautifulSoup
import requests
import jaconv
from gensim import corpora
from gensim import models
from pprint import pprint
import pandas as pd
import string
import MeCab
import unicodedata
from gensim.models.doc2vec import Doc2Vec, TaggedDocument

Wörterbuchspezifikation & Funktionsdefinition

Es ist mühsam, jedes Mal das Mecab-Wörterbuch anzugeben. Geben Sie es daher zuerst an. Es ist auch gut, den Code zu organisieren, indem Sie den Code als Funktion definieren.

Wörterbuchbezeichnung

#Geben Sie NEologd im MeCab-Wörterbuch an.
#Mecab ist für die Analyse mobiler Elemente, Wakati für das Teilen
mecab = MeCab.Tagger('-d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd/')
wakati = MeCab.Tagger("-Owakati -d /usr/lib/x86_64-linux-gnu/mecab/dic/mecab-ipadic-neologd/")

Funktionsdefinition

#Definieren Sie eine Funktion zur Durchführung einer morphologischen Analyse
#Wenn Sie eine Datei eingeben, wird die Datei ausgegeben, und wenn Sie eine Zeichenfolge übergeben, wird eine Zeichenfolge zurückgegeben. Ändern Sie mit der Argumentdatei.
#Wenn Sie nur trennen möchten, verwenden Sie Mecab als Argument=Dies kann mit Wakati erreicht werden.
def MecabMorphologicalAnalysis(path='./text.txt', output_file='wakati.txt', mecab=mecab, file=False):
    mecab_text = ''
    if file:
        with open(path) as f:
            for line in f:
                mecab_text += mecab.parse(line)
        with open(output_file, 'w') as f:
            print(mecab_text, file=f)
    else:
        for path in path.split('\n'):
            mecab_text += mecab.parse(path)
        return mecab_text
    

#Da symbolische Zeichen die Analyse stören, definieren wir eine Funktion, die das Symbol entfernt.
#Aozora unten gezeigt_Wird in der Tabellenfunktion verwendet.
def symbol_removal(soup):
    soup = unicodedata.normalize("NFKC", soup)
    exclusion = """ "" [] ,. ・" + "\n" + "\r" + "\u3000"
    soup = soup.translate(str.maketrans("", "", string.punctuation  + exclusion))
    return soup


#Definieren Sie eine Funktion, die die Informationen in der Blue Sky-Bibliothek kratzt und in Tabellendaten formatiert.
#Gibt die Anzahl der im Argument angegebenen Titel aus.(Der Standardwert ist 30)  
#Symbol innen_Ich benutze die Entfernungsfunktion.
def Aozora_table(n=30):
    url = "https://www.aozora.gr.jp/access_ranking/2019_xhtml.html"
    res = requests.get(url)
    res.encoding = 'shift-jis'
    soup = BeautifulSoup(res.content, "html.parser")

    url_list = [url["href"] for i, url in enumerate(soup.find_all("a", target="_blank")) if i < n]

    title = []
    category = []
    text = []
    for url in url_list:
        res = requests.get(url)
        url_start = url[:37]
        res.encoding = 'shift-jis'
        soup = BeautifulSoup(res.content, "html.parser")
        for i, a in enumerate(soup.find_all("a")):
            if i == 7:
                url_end = a["href"][1:]
        url = url_start + url_end
        res = requests.get(url)
        res.encoding = 'shift-jis'
        soup = BeautifulSoup(res.content, "html.parser")
        title.append(soup.find("h1").string)
        category.append(soup.find("h2").string)
        for tag in soup.find_all(["rt", "rp"]):
            tag.decompose()
        soup = soup.find("div",{'class': 'main_text'}).get_text()
        text.append(symbol_removal(soup))
    df = pd.DataFrame({'title': title, 'category': category, 'text': text})
    return df


#TF durch Übergeben einer zweistufigen Liste von Wörtern-Erhalten Sie eine eindeutige Liste von Wörtern, sortiert nach IDF.
def sortedTFIDF(sentences):
    
    #Fügen Sie die ID dem Wort hinzu.
    dictionary = corpora.Dictionary(sentences)
    
    #Zählen Sie die Anzahl der Wortauftritte für jedes Werk
    corpus = list(map(dictionary.doc2bow, sentences))
    
    #TF für jedes Wort-IDF berechnen
    test_model = models.TfidfModel(corpus)
    corpus_tfidf = test_model[corpus]
    
    # ID:TF-IDF → TF-IDF:In Wörter konvertieren. TF-TF mit sortiert, indem IDF nach links gebracht wird-Sie können nach IDF sortieren.
    texts_tfidf = []
    for doc in corpus_tfidf:
        text_tfidf = []
        for word in doc:
            text_tfidf.append([word[1], dictionary[word[0]]])
        texts_tfidf.append(text_tfidf)
    
    # TF-Sortieren nach IDF.
    sorted_texts_tfidf = []
    for text in texts_tfidf:
        sorted_text = sorted(text, reverse=True)
        sorted_texts_tfidf.append(sorted_text)

    return sorted_texts_tfidf

Erstellen einer Datentabelle

Erstellen Sie zunächst eine Datenbabel, indem Sie die Seite von Aozora Bunko abkratzen. Verwenden Sie Ihre eigene Aozora_table-Funktion, um die Datentabelle zu erstellen.

df = Aozora_table(50)
df.head()
title category text
0 [Ame Nimomakezu] Kenji Miyazawa Regen Nimomakezu Stil Nimomakezu Schnee Nimo Natsu kein Hatsu Sanimo Makenu Langlebig Nakarada Womochi 慾 Hanaku Entscheidung Shite 瞋 Razuitsumo ...
1 Meros ausführen Osamu Tadashi Melos beschließt, den wütenden König der bösen Gewalt loszuwerden, und Melos versteht die Politik nicht ...
2 Yamatsukiki Atsushi Nakajima Li Zhao von Xinxi wurde im jungen Alter des gelehrten talentierten Tianbao von Leutnant Gangnam ergänzt.
3 Herz Soseki Natsume Kami-sensei und Iichi Ich habe diese Person als Lehrer bezeichnet. Schreiben Sie also auch hier einfach "Lehrer" und geben Sie den richtigen Namen ein ...
4 Rashomon Ryunosuke Akutagawa Eines Tages wartete ein Diener unter dem Rashomon auf den Regen. Unter dem breiten Tor war dieser Mann ...

Wenn der Text Katakana ist, kann er nicht gut analysiert werden, sodass er in ein einfaches Pseudonym umgewandelt wird.

for i in range(len(df)):
    if df['title'][i] in ["[Ame Nimomakezu]", "Denden Musino Kanashimi"]:
        df['text'][i] = jaconv.kata2hira(df['text'][i])
df.head()
title category text
0 [Ame Nimomakezu] Kenji Miyazawa Ich habe einen starken Körper, der dem Regen, dem Wind, dem Schnee und der Hitze des Sommers standhält, und ich schaue ihn nie an ...
1 Meros ausführen Osamu Tadashi Melos beschließt, den wütenden König der bösen Gewalt loszuwerden, und Melos versteht die Politik nicht ...
2 Yamatsukiki Atsushi Nakajima Li Zhao von Xinxi wurde im jungen Alter des gelehrten talentierten Tianbao von Leutnant Gangnam ergänzt.
3 Herz Soseki Natsume Kami-sensei und Iichi Ich habe diese Person als Lehrer bezeichnet. Schreiben Sie also auch hier einfach "Lehrer" und geben Sie den richtigen Namen ein ...
4 Rashomon Ryunosuke Akutagawa Eines Tages wartete ein Diener unter dem Rashomon auf den Regen. Unter dem breiten Tor war dieser Mann ...

Ich konnte erfolgreich eine Datentabelle für Aozora Bunko erstellen.

Vorverarbeitung zur Übergabe an das Doc2Vec-Modell

Verwenden Sie Ihre eigene "Mecab Morphological Analysis" -Funktion, um sie separat zu schreiben.

texts = []
for i in range(len(df)):
    texts.append(MecabMorphologicalAnalysis(df['text'][i], mecab=wakati))
#Überprüfen Sie, ob Sie die Teilung abgeschlossen haben. Anzeige 5 funktioniert.
for i, text in enumerate(texts):
    if i < 5:
        display(text[:100])

"Weder der Regen, der Wind, der Schnee, die Hitze des Sommers noch die Hitze des Sommers." 'Meros war wütend und entschied, dass er den König der bösen Gewalt loswerden musste. Melos verstand die Politik nicht. Lee Zhao von Xinxi war ein junger Schüler des wissenschaftlich talentierten Tianbao, und sein Name wurde Tora Ei hinzugefügt, und dann wurde er von Leutnant Gangnam ergänzt. "Kami-sensei und Iichi habe ich diese Person immer als Lehrer bezeichnet, daher kann ich auch hier meinen richtigen Namen nicht bekennen, indem ich ihn als Lehrer schreibe. Dies ist ein Refrain von der Welt." "Eines Tages wartete ein Diener unter Rashomon auf den Regen. Unter dem breiten Tor war niemand außer diesem Mann."

Ich konnte normalerweise in den Minuten schreiben.

Konvertieren Sie dann den getrennten Text in eine Liste.

#In Liste konvertieren
sentences = []
for text in texts:
    text_list = text.split(' ')
    sentences.append(text_list)

Modelllernen

Nachdem die Vorverarbeitung abgeschlossen ist und wir die getrennten Listensätze haben, können wir sie zur Schulung an Doc2Vec übergeben.

#Erstellen Sie zunächst Dokumente und übergeben Sie sie an das Modell.
documents = [TaggedDocument(doc, [i]) for i, doc in enumerate(sentences)]
model = Doc2Vec(documents, vector_size=100, window=7, min_count=1)
#Der Inhalt der an das Modell übergebenen Dokumente ist eine Liste, die der Nummer und dem Text entspricht. Der Autor wird hier auch als Referenz gezeigt.
for i, doc in enumerate(documents):
    print(doc[1], df['title'][i], df['category'][i], doc[0][:8])

[0] [Ame Nimomakezu] Kenji Miyazawa ['Regen', 'ni', 'mo', 'Bonus', 'zu', 'Wind', 'ni', 'mo'] [1] Führe Meros Osamu Tadashi aus ['Meros', 'ha', 'Wut', 'shi', 'ta', 'muss', 'oder', ''] [2] Yamatsukiki Atsushi Nakajima ['Shinsai', '', 'Lees', 'ist', 'Akademisches Talent', 'Tenho', '', 'Ende'] [3] Kokoro Natsume Soseki ['Oberer', 'Lehrer' und ',' Ich ',' Eins ',' Ich ',' Ist ',' Das '] [4] Rashomon Ryunosuke Akutagawa ["Eines Tages", "Leben", "Dinge", "de", "sind", "allein"] [5] Galaxy Railroad Night Kenji Miyazawa ['Eins', 'Nachmittag', '', 'Klasse', 'de', 'ist', 'Jeder', 'ist'] [6] Disqualifikation des Menschen Osamu Tadashi ['Vorwort', 'Ich', 'ha', 'das', 'Mann', '', 'Foto', '] [7] Ich bin eine Katze Soseki Natsume ['Ich', 'Ich bin eine Katze', 'Name', 'ist', 'noch', 'nicht', 'wo', 'in'] [8] Yamanashi Kenji Miyazawa ["Klein", "Tanigawa", "Unten", "Nach", "Kopieren", "Ta", "Zwei"] [9] Yume Toya Natsume Soseki. [10] Kusamakura Natsume Soseki ['Ichi', 'Yamaji', 'to', 'Climb', 'While', 'Ko', 'Think', 'Ta'] [11] Kenji Miyazawa, ein Restaurant mit vielen Bestellungen ['Zwei Personen', '', 'Jung', 'Gentleman', 'Ga', 'Vollständig', 'England', ''] [12] Spinnenfaden Ryunosuke Akutagawa ["Eins", "Ein Tag", "Dinge", "De", "Sind", "Masu", "Shaka"] [13] Bocchan Natsume Soseki ['Ichi', 'Eltern', '', 'Mugun', 'de', 'Kosuke', '', 'Zeit'] [14] Lemon Kajii Motojiro ['Etai', '', 'Know', 'No', 'Ominous', 'Na', 'Mass', 'Ga'] [15] Dogura Magura Hisaku Yumeno ['Seite', '', 'Links und Rechts', 'Mitte', 'Intro', 'Lied', 'Fötal', 'Yo'] [16] Chieko Sho Kotaro Takamura ['Leute', 'bis', 'Nein', 'Na', 'N', 'Ist', 'Du', ''] [17] Hojoki Kamo Chomei ['Go', 'River', '', 'Nagare', 'Ha', 'Continuously', 'Shi', ' [18] Empfehlung, Satoshi Fukuzawa zu lernen ['First', 'Hen', 'Heaven', 'is', 'People', '', 'Above', 'to'] [19] "Frühling und Shura" Kenji Miyazawa ['Seite', '', 'Links und Rechts', 'Mitte', 'Geistig', 'Sketsuchi', 'Frühling und Shura', 'Taisho'] [20] Appell zum Einschleichen. [21] Maihime Mori Kogai ["Kohle", "O", "Ba", "Hayaya", "Stapeln", "Ende", "Tsu", "Mitte" [22] Yodaka no Hoshi Kenji Miyazawa ['yo', 'da', 'ka', 'ist', 'wirklich', 'schwer zu sehen', 'Vogel', 'ist'] [23] Momotarou Masao Kusuyama ["Ichi", "Es war einmal", "Es war einmal", "Sind", "Tokoro", "Zu", "Opa" und "] [24] Motojiro Kajii unter dem Kirschbaum ['Unter dem Kirschbaum', 'Leiche', 'ist', 'begraben', 'te', 'ist', 'dies', 'ist'] [25] Nankichi Niimi kauft Handschuhe ['Kalt', 'Winter', 'ga', 'Nord', 'von', 'Fuchs', '', 'Eltern und Kind'] [26] Ryunosuke Akutagawa ['Zen', 'Chinai', 'Supplement', '', 'Nose', 'und', 'Say', 'Ba'] [27] Takase Funa Mori Kogai ["Takase Funa", "ha", "Kyoto", "Takasegawa", "bis", "auf und ab", "tun"] [28] Eine Handvoll Sand Ishikawa Tatsuki ['Hakodate', 'Naru', 'Ikurain', 'Miyazaki', 'Daishiro', 'Kimi', 'Country', ''] [29] Tosa Diary Kinukiyuki ["Mann", "Mo", "Su", "Naru", "Tagebuch", "Toifu", "Dinge", " [30] Star Tour Song Kenji Miyazawa ['Akai', 'Medama', '', 'Sasori', 'Hiroge', 'Ta', 'Washi', ''] [31] Brief im Zementfass Yoshiki Hayama ['Matsudo', 'Yozo', 'ist', 'Zement', 'Ake', 'an', 'Ya', 'Te'] [32. [33] Shayo Tadashiji ["Ichi", "Frühstück", "Do", "at", "Suup", "O", "Ichi", "Soji"] [34] Kawado Ryunosuke Akutagawa ['Bitte', 'Kappa' und ',' Aussprache ',' ',', ',', 'Bitte', 'Einführung'] [35] Otsubel und Elefant Kenji Miyazawa ["Sind", "Kuh", "Halten", "Ga", "Monogataru", "Nr.", "Eins", "Sonntag"] [36] Sakutaro Hagiwara bellt im Mond ["Bruder", "Hagiwara", "Eiji", "Mr." [37] Kaze no Matasaburo Kenji Miyazawa ["Dododo", "Dododo", "Dododo", "Dodo", "Blau", "Kurumi", "Mo", "Abblasen"] [38] Gauche spielt Cello Kenji Miyazawa ['Gauche', 'wa', 'Stadt', '', 'Aktivitätsfoto', 'kan', 'de', 'Cello'] [39] Sanshiro Natsume Soseki ["Ichi", "Schläfrigkeit", "As", "Augen", "Ga", "Sameru" und "Frau"] [40] Hell Change Ryunosuke Akutagawa ['Ichi', 'Horikawa', '', 'Large', 'Den-sama', '', 'Yau', 'Na'] [41] Schulmädchen Osamu Tadashi ['A', 'Sa', 'Auge', 'bis', 'Sa', 'Wann', '', 'Gefühl'] [42] Krabbenschiff Takiji Kobayashi ['Ichi', 'Hey', 'Hölle', 'Sa', 'Gogun', 'Da', 'De', 'Zwei Personen'] [43] Denden Musino Kanashimi Niimi Nankichi [Wann, Piki, Dendenmushi, Ga, Ja, Maschi, Ta] [44] Galaxy Railroad Night Kenji Miyazawa ['Ich', 'Nachmittag', '', 'Klasse', 'de', 'wa', 'alle', 'ha'] [45] Moriko Haru Ryunosuke Akutagawa ["Ichi" oder "Frühling", "Higurashi", "ist", "Tang", "]" [46] An Yasunari Kawabata Osamu Tadashi ['Du', 'ist', 'Bungei Haruaki', 'September', 'Ausgabe', 'an', 'Ich', 'an'] [47] Yin Hou Rei San Junichiro Tanizaki ['○', 'Heute', 'Öffentlicher Auftrag', 'Doraku', '', 'Leute', 'Ga', 'Jun'] [48] Menschlicher Stuhl Ranpo Edogawa ['Yoshiko', 'wa', 'jeden Morgen', 'Ehemann', '', 'ins Büro gehen', 'zu', 'absehen'] [49] LKW Ryunosuke Akutagawa ['Odawara', 'Atami', 'Zwischen', 'bis', 'Stadtbahn', 'Verlegung', '', 'Bau']

Machen Sie Vorhersagen mit einem trainierten Modell

Verwenden wir nun das erlernte Modell, um Werke zu extrahieren, die Tadashi Osamus "menschlicher Disqualifikation" nahe kommen.

#6 ist Osamu Tadashis "menschliche Disqualifikation".
#Es muss eine Geschichte des Leidens gewesen sein, während man sich im eigenen Leben verirrt hat.
#Am Ende wurde ich in eine Nervenheilanstalt gebracht und es fühlte sich schwer an.
ranking = model.docvecs.most_similar(6, topn=50)
ranking[:5] #Top 5 arbeitet mit hoher Kosinusähnlichkeit
[(14, 0.9827772974967957),
 (1, 0.9771202802658081),
 (46, 0.9766896367073059),
 (48, 0.975338876247406),
 (4, 0.9737432599067688)]
ranking[-5:] #Top 5 arbeitet mit geringer Kosinusähnlichkeit
[(5, 0.861607551574707),
 (32, 0.8596963882446289),
 (44, 0.8453813195228577),
 (22, 0.8167744874954224),
 (37, 0.8134371042251587)]

Die Arbeit, die "Human Disqualification" am ähnlichsten ist, wurde als "Lemon" veröffentlicht. Es ist sicherlich nah. Ich glaube, dass dies ein System war, in dem die Hauptfigur während des Leidens lebte, wie im Fall der "menschlichen Disqualifikation". Die Plätze 2 und 3 waren "Run Meros" und "To Yasunari Kawabata". Beide sind Werke von Osamu Tadashi! Ist die schwere Atmosphäre von "Rashomon" auf dem 5. Platz nicht ziemlich nahe an der "menschlichen Disqualifikation"? ??

Die meisten Werke, die nicht ähnlich sind, sind Kenji Miyazawas Werke. (Aus irgendeinem Grund erscheint "Galaxy Railroad Night" zweimal) "Galaxy Railroad Night" und "Yodaka no Hoshi" mögen für die Hauptfigur besorgniserregend sein, aber sie müssen irgendwie warm gewesen sein. .. Ich habe das Gefühl, dass die Atmosphäre ganz anders ist als die "menschliche Disqualifikation".

Wir haben gute Ergebnisse erzielt, die unseren Gefühlen ähnelten! Ich bin jedoch ehrlich besorgt, ob alle Werke zu nahe beieinander liegen und richtig gruppiert werden können.

Berücksichtigung der Verwendung von TF-IDF

Verwenden wir also TF-IDF, um nur wichtige Wörter einzugrenzen und zu gruppieren! !! Hier sind die erwarteten Vor- und Nachteile der Verwendung von TF-IDF.

verdienen

――Der Text enthält viele häufig verwendete und bedeutungslose Wörter wie "o" und "ta" für "Ball werfen", und es besteht die Gefahr, dass jedes Werk einen ähnlichen Vektor hat. Ich dachte es gäbe. Wenn Sie sich mit TF-IDF auf wichtige Wörter konzentrieren und die Merkmale der Arbeit hervorheben, ist es möglicherweise einfacher, Cluster zu erstellen.

Fehler

――Da es kein Satz mehr ist, kann es schwierig sein, den Wortlaut und die Zusammensetzung des Satzes zu verstehen, der dem Autor eigen ist. ――Da die Wörter in Gruppen zusammengefasst sind, ist dies möglicherweise kein guter Ansatz für Werke, die immer wieder denselben Ausdruck aufweisen. ――Wahrscheinlich weisen Wörter wie "Meros" und "Serinuntius" in der Arbeit "Run Meros" hohe Werte für TF-IDF auf. Können Sie sagen, dass sie die Eigenschaften des Textes darstellen? Ich habe eine Frage.

Ich kann mir mehr Nachteile als Vorteile vorstellen, aber ich werde es vorerst versuchen.

TF-IDF-Vorbehandlung

Sätze enthält eine Liste von Wörtern, die bereits getrennt wurden. Wenn es in dieser Form vorliegt, können Sie eine sortierte Liste von TF-IDF für jede Arbeit erhalten, indem Sie sie an Ihre eigene "sortierte TFIDF-Funktion" übergeben. Was wir mit der sortiertenTFIDF-Funktion machen, ist der vorherige Artikel [" Implementierung von TF-IDF mit gensim "](https://qiita.com/kei0919/items/1e191964e727b83372c0#df-idf%E3%82%92 % E5% AE% 9F% E8% A1% 8C% E3% 81% 99% E3% 82% 8B% E5% 89% 8D% E3% 81% AE% E6% BA% 96% E5% 82% 99) Es ist das gleiche wie im TF-IDF-Teil.

#Überprüfen Sie den Inhalt von Sätzen
for i, sentence in enumerate(sentences):
    if i < 5:
        print(sentence[:10])

['Regen', 'ni', 'mo', 'Bonus', 'zu', 'Wind', 'ni', 'mo', 'Bonus', 'zu'] ['Meros', 'wa', 'Wut', 'shi', 'ta', 'muss', 'oder', ',' Bosheit ',' Gewalt '] ['Shinsai', '', 'Li', 'ist', 'wissenschaftliches Talent', 'Tenho', '', 'Ende', 'jünger', ' ['Ein', 'Lehrer', 'und', 'Ich', 'Eins', 'Ich', 'Ist', 'Das', 'Volk', '] ['Eines Tages', '', 'Leben', '', 'Dinge', 'um', 'Sind', 'Eine Person', '', 'Unterer Mann']

#TF mit Ihrer eigenen sortierten TFIDF-Funktion-Holen Sie sich eine Liste nach IDF sortiert.
sorted_texts_tfidf = sortedTFIDF(sentences)
#TF für jede Arbeit-Überprüfen Sie Wörter mit hoher IDF
for i, tfidf in enumerate(sorted_texts_tfidf):
    if i < 5:
        print('%s.' % i, '〜%s〜' % df['title'][i]) #Der Titel wird vorerst auch angezeigt
        pprint(tfidf[:10])
        print('')
  1. ~ [Ame Nimomakezu] ~ [[0.5270176717513841, 'Nanmu'], [0.335824762232814, 'Bonus'], [0.2720937923932906, 'Maki'], [0.1360468961966453, '萓'], [0.1360468961966453, 'Burning'], [0.1360468961966453, "Brauner Reis"], [0.1360468961966453, 'Mubeyuki Bosatsu'], [0.1360468961966453, 'Jyogyo Bosatsu'], [0.1360468961966453, 'Anryu Bodhisattva'], [0.1360468961966453, 'Taho Nyorai']]

  2. ~ Meros ausführen ~ [[0.8826660798685602, 'Meros'], [0.1647643349087979, 'Serinuntius'], [0.12468722733644991, 'King'], [0.09375235972221699, 'I'], [0.07738167204990741, 'You'], [0.07061328638948482, 'Muddy Stream'], [0.06778538031378131, "Menge"], [0.06439978483773416, 'Freund'], [0.06166407227059827, 'Nein'], [0.05884440532457068, 'Nobumi']]

  3. ~ Yamatsukiki ~ [[0.46018061185481746, '袁'], [0.46018061185481746, 'Li Zhen'], [0.32450428070224685, 'self'], [0.2989295156005757, 'Mura'], [0.1698659669116043, "Tiger"], [0.10946065580700806, 'Sorry'], [0.07971453749348684, '吏'], [0.0726600966086554, 'Shame'], [0.0726600966086554, 'Dignified'], [0.07127857508099637, 'Pride']]

  4. ~ Herz ~ [[0.5354264061948253, 'I'], [0.4564728456651801, 'K'], [0.282595486317482, "Frau"], [0.2504145163549083, 'Lehrer'], [0.17885230572329233, 'is'], [0.1597103741100704, 'Lady'], [0.12084196131850143, 'Things'], [0.11917933998957644, 'Vater'], [0.11460565741637332, 'nicht'], [0.10324388965526733, 'I']]

  5. ~ Rashomon ~ [[0.7324117083727154, 'Lower'], [0.46608017805536434, 'Alte Frau'], [0.1618414518545496, 'Tod'], [0.1416112703727309, 'Rashomon'], [0.1059977890898406, 'say'], [0.10332033314297188, 'Dead'], [0.09868036169619741, 'Ladder'], [0.0809207259272748, 'Gesicht'], [0.07675139243037576, 'Sword'], [0.07581439176692739, 'Dead']]

Ich konnte in absteigender Reihenfolge von TF-IDF sortieren. Erstellen wir nun eine "all_title" -Liste, die sich auf die 100 besten Wörter für jede Arbeit konzentriert, und übergeben Sie sie an das Doc2Vec-Modell.

all_title = []
for tfidf in sorted_texts_tfidf:
    title = []
    for word in tfidf[:100]: #Eingrenzen auf 100 Wörter
        title.append(word[1])
    all_title.append(title)
# all_Überprüfen Sie den Inhalt der Titelliste
for i, text in enumerate(all_title):
    if i < 5:
        print(text[:10])

['Nanmu', 'Make', 'Maki', '萓', 'Burning', 'Genmai', 'Mubeyuki Bosatsu', 'Jyogyo Bosatsu', 'Anritsuyuki Bosatsu', 'Taho Nyorai'] ['Meros', 'Serinuntius', 'König', 'Ich', 'Du', 'Schlammiger Strom', 'Menge', 'Freunde', 'Nein', 'Nobumi'] ['袁', 'Li Zhao', 'Selbst', 'Mura', 'Tora', 'Trauer', '吏', 'Schande', 'Würde', 'Selbstachtung'] ['Ich', 'K', 'Frau', 'Lehrer', 'ist', 'junge Dame', 'Ding', 'Vater', 'nicht', 'ich'] ['Lower', 'Old Woman', 'Death', 'Rashomon', 'Say', 'Dead', 'Ladder', 'Face', 'Sword', 'Dead']

Lernen Sie das Doc2Vec-Modell erneut

#Liste wichtiger Wörter im Doc2Vec-Modell all_Übergeben Sie den Titel.
documents = [TaggedDocument(doc, [i]) for i, doc in enumerate(all_title)]
model = Doc2Vec(documents, vector_size=100, window=5, min_count=1)
#Zeigen Sie eine Liste mit Zahlen an und arbeiten Sie mit den Ergebnissen
for i, doc in enumerate(documents):
    print(doc[1], df['title'][i], df['category'][i], doc[0][:8])

[0] [Ame Nimomakezu] Kenji Miyazawa ['Nanmu', 'Make', 'Maki', '萓', 'Burning', 'Genmai', 'Mubeyuki Bosatsu', 'Jyogyo Bosatsu'] [1] Führe Meros Osamu Tadashi aus ['Meros', 'Serinuntius', 'König', 'Ich', 'Du', 'Schlammiger Strom', 'Menge', 'Freunde'] [2] Yamatsukiki Atsushi Nakajima ['袁', 'Li Zhou', 'Selbst', 'Mura', 'Tora', 'Trauer', '吏', 'Schande'] [3] Kokoro Natsume Soseki ["Ich", "K", "Frau", "Lehrer", "ist", "junge Dame", "Ding", "Vater"] [4] Rashomon Ryunosuke Akutagawa ["Senior", "Alte Frau", "Tod", "Rashomon", "Sprich", "Tot", "Leiter", "Gesicht" [5] Galaxy Railroad Night Kenji Miyazawa ["Giovanni", "Campanella", "Ich bin", "Ich", "Besser", "Galaxie", "Gefangennahme", "Himmlischer Fluss"] [6] Disqualifikation des Menschen Osamu Tadashi ['Horiki', 'Selbst', 'Hirame', 'Clown', 'Deshi', 'Yoshiko', 'Ding', 'Tsuneko'] [7] Ich bin eine Katze Soseki Natsume ["Labyrinth", "Ich bin", "Kanzuki", "Sag", "Meister", "Kimi", "Dinge", "Kaneda"] [8] Yamanashi Kenji Miyazawa ["Crambon", "Crab", "Yamanashi", "Wara", "Foam", "Dad", "Crush", "Kapukapu"] [9] Yume Toya Natsume Soseki ['Shotaro', 'Yu', 'Alter Mann', 'Selbst', 'Nio', 'Schwein', 'Ich', 'Unkei'] [10] Kusamakura Natsume Soseki ['Yo', 'Yu', 'Kuichi', 'Malerei', 'Unmenschlichkeit', 'Nu', 'Iru', 'Nami'] [11] Kenji Miyazawa, ein Restaurant mit vielen Bestellungen ['Tür', 'Sahne', 'Ich', 'Bokura', 'Hintern', 'Rasseln', 'Bitte', 'Erhalten'] [12] Spinnenfaden Ryunosuke Akutagawa ['Taita', 'Spinnenfaden', 'Oshaka', 'Paradies', 'Blutteich', 'Sind', 'Hölle', 'Nadelberg'] [13] Bocchan Natsume Soseki ["Rotes Hemd", "Yamastorm", "Ich", "Uranari", "Yu", "Kiyo", "Yu", "Schulleiter"] [14] Lemon Kajii Motojiro ['Lemon', 'I', 'Maruzen', 'Town', 'Fruit Shop', '――', '廂', 'Paint'] [15] Dogura Magura Hisaku Yumeno ['Masaki', 'Wakabayashi', 'Ichiro', 'Gozai', 'Wu', 'Dr.' [16] Chieko Sho Kotaro Takamura ["Chieko", "Sie", "Tsute", "Yau", "ts", "Atsu", "Toifu", "Tsuta"] [17] Hojoki Kamo Chomei ['ゝ', 'Samurai', 'Hi', 'ゞ' oder ',' Mizuka ',' I ',' 經 '] [18] Akademische Empfehlungen Satoshi Fukuzawa ["Regierung", "Volk", "at", "Beshi", "Bekara", "Zaru", "Ara" oder "] [19] "Frühling und Shura" Kenji Miyazawa ['Iru', 'Watakushi', 'Tsute', 'Yau', 'Kai', 'Page', 'Swaying', '┃'] [20] Verdacht, sich in ['Ich', 'Petrus', 'Das', 'Du', 'Jünger', 'Nein', 'Jerusalem', 'Sprechen' einzuschleichen] [21] Maihime Mori Kogai ['Yo', 'Eris', 'ゝ', 'at', 'Aizawa', 'Taru', 'I', 'Minister'] [22] Yodaka no Hoshi Kenji Miyazawa ["Hawk", "Ichizo", "Nest", "I", "Burnt", "Suzume", "Star", "Sora"] [23] Momotaro Masao Kusuyama ["Momotaro", "Großmutter", "Opa", "Kibidango", "Oni ga Shima", "Kiji", "Pfirsich", "Oni"] [24] Unter dem Kirschbaum Motojiro Kajii ['Ich', 'Leiche', '溪', 'Unter dem Kirschbaum', 'Du', 'begraben', 'dünne Feder', 'Haarwurzel'] [25] Nankichi Niimi kauft Handschuhe ["Kinderfuchs", "Fuchs", "Junge", "Mutter", "Hände", "Mutter", "Hutladen", "Handschuhe"] [26] Ryunosuke Akutagawa ['Internes Opfer', 'Mönch', 'Nase', 'Schüler', '哂', 'Sprich', 'Kurz', 'Doji'] [27] Takase Funamori Kogai ['Kisuke', 'Tsute', '衞', 'Sho', 'Un', 'Departure', 'Watakushi', 'Ya'] [28] Eine Handvoll Sand Ishikawa Tatsuki ["Freund", "Furusato", "Ariki", "Kanashi", "Kanashiki", "Denken", "Taru", "Ramu"] [29] Tosa Diary Kinukiyuki ['ゝ', 'Yomeru', 'I', 'Ship', 'Ifu', 'Keri', 'Kuni', 'Singing'] [30] Star Tour Song Kenji Miyazawa ["Medama", "Small Inu", "Hebi", "Tsuyu", "Tsubasa", "Shimoto", "Guma no Ashio", "Oguma"] [31] Brief in einem Zementfass Yoshiki Hayama ["Zement", "Liebhaber", "Groß", "Er", "Masu", "Mixer", "Kleine Kiste", "Rippen"] [32] Mädchen Hölle Hisaku Yumeno ['Shirataka', 'Hauptlehrerin', 'Sie', 'Yuriko', '妾', 'Niitaka', 'Prinzessin', 'Ich'] [33] Shayo Tadashi ["Mama", "Naoji", "Ich", "Uehara", "Ich", "Onkel", "Du bist", "O"] [34] Kawado Ryunosuke Akutagawa ['Kawado', 'Totsuku', 'Ich', 'ゐ', 'ゐ', 'Tetsu', 'Geel', 'Un'] [35] Otsubel und Elefant Kenji Miyazawa [Otsubel, Elefant, Gralaagaa Gralaagaa, weißer Elefant, Hütte, solcher, Griff, ich] [36] Sakutaro Hagiwara bellt im Mond ['Yau', 'ゐ', 'tsute', 'tsuta', 'Poesie', 'ich', 'ゐ', 'atsu'] [37] Kaze no Matasaburo Kenji Miyazawa ["Kasuke", "Saburo", "Ro", "Ichiro", "Matasaburo", "Kosuke", "Say", "Mashi"] [38] Gauche spielt Cello Kenji Miyazawa ["Gauche", "Kakkou", "Sero", "Rakucho", "Tsumugi", "Spielen", "Ich sage", "Wilde Maus"] [39] Sanshiro Natsume Soseki ["Ro", "Sanshi", "Yojiro", "Mieko", "Nonomiya", "Sanshiro", "Hirota", "Haraguchi"] [40] Höllenveränderung Ryunosuke Akutagawa ['Yoshihide', 'Are', 'Ya', 'Tsute', 'Un', 'Den-sama', 'Go', 'Iru'] [41] Schulmädchen Osamu Tadashi ['Mama', 'Ich', 'Japii', 'Ich', 'Imaida', 'Papa', 'Kaa', 'Schwester'] [42] Krabbenschiff Takiji Kobayashi ['Fischer', 'Direktor', '――', 'Aber', 'Kawasaki', 'Tatsu', 'Tsu', 'Kapitän'] [43] Denden Musino Kanashimi Niimi Nankichi ["Dendemushi", "Freunde", "Kanasimi", "Ippai", "Ich", "Yun", "Iki", "Naka"] [44] Galaxy Railroad Night Kenji Miyazawa ["Giovanni", "Campanella", "I", "Better", "Tenkawa", "Say", "Beyond", "Galaxy"] [45] Moriko Haru Akutagawa Ryunosuke ['Moriko Haru', 'Tsute', 'ゐ', 'ゐ', 'Mt. [46] An Yasunari Kawabata Osamu Tadashi ['Hana des Clowns', 'Kazuo Dan', 'Bruder', 'Ich', 'Mr.' [47] Yin-Hai Rei Sanchiro Tanizaki Junichiro [Uru, Yin-Hai, Aro, Dunkelheit, Wir, Ich, Ich] [48] Menschlicher Vorsitzender Ranpo Edogawa ["Ja", "Ich", "Vorsitzender", "Sie", "Sama", "Masu", "Hotel", "Frau"] [49] LKW Ryunosuke Akutagawa ['Ryohei', 'Trocco', 'Erdarbeiten', 'Eisenbahn', '――', 'Bau', 'Er', 'Schieben']

Ergebnisansage!

ranking = model.docvecs.most_similar(6, topn=50) #Diesmal auch durch Osamu Tadashis "menschliche Disqualifikation" bestätigt
ranking[:5]
[(45, 0.25298941135406494),
 (26, 0.22999905049800873),
 (36, 0.1593010127544403),
 (21, 0.15090803802013397),
 (47, 0.1467716097831726)]
ranking[-5:]
[(12, -0.11983974277973175),
 (41, -0.12426283210515976),
 (0, -0.1281222403049469),
 (13, -0.1791403889656067),
 (25, -0.2501679062843323)]

Ich schaue mir die Werke an, die als ähnlich beurteilt werden, aber es gibt keine Werke, die ich für ähnlich halte. Im Gegenteil, wenn man sich die Werke ansieht, die als nicht ähnlich beurteilt werden, scheint es, dass Tadashis Arbeit eine andere Atmosphäre hat, aber ...

Deshalb habe ich festgestellt, dass die Verwendung von TF-IDF die Genauigkeit von Romanen verringert. Der Grund sind die oben genannten [Nachteile](https://qiita.com/kei0919/items/bde365bf179c0a1573af#%E3%83%87%E3%83%A1%E3%83%AA%E3%83%83 Ich denke, dass% E3% 83% 88) beteiligt ist.

Es ist so frustrierend wie es ist, also werde ich als nächstes Doc2Vec und TF-IDF verwenden, um Nachrichtenartikel zu analysieren!

Recommended Posts

Clustering von Büchern von Aozora Bunko mit Doc2Vec
Clustering mit Python-Louvain
Clustering mit Scikit-Learn (1)
Clustering mit Scikit-Learn (2)
Lassen Sie uns Aozora Bunko im Gespräch mit COTOHA zusammenfassen
Autorenschätzung unter Verwendung von neuronalen Netzen und Doc2Vec (Aozora Bunko)
[Version 2020] Scraping und Verarbeitung des Textes von Aozora Bunko
Clustering mit scikit-learn + DBSCAN
DBSCAN (Clustering) mit Scikit-Learn