[PYTHON] Analysieren Sie das Themenmodell, mit GensimPy3 Romanautor zu werden

Es gibt eine Python-Bibliothek, die Themenmodelle mit dem Namen [gensim] verarbeitet (http://radimrehurek.com/gensim/). Offiziell unterstützt es nur Python Version 2.5 <= Python <3.0.

Samantp hat jedoch eine Bibliothek namens [gensimPy3] veröffentlicht (https://github.com/samantp/gensimPy3). Es ist eine Gabel von Gensim für Python 3.3.

Dieses Mal ist es mit diesem gensimPy3 dasselbe wie Shoto's Analyse des Rankings, ein Romanautor mit einem Themenmodell zu werden (gensim) Ich experimentierte, um zu sehen, ob ich es schaffen könnte.

Installation von GensimPy3

https://github.com/samantp/gensimPy3

Klonen Sie den Quellcode von.

git clone [email protected]:samantp/gensimPy3.git

damit,

python setup.py test

wenn Sie tun

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa3 in position 3973: invalid start byte

Ich war besorgt, weil ich einen Fehler bekam. Aber ich habe es ignoriert und installiert.

python setup.py install

Aus irgendeinem Grund habe ich einen SyntaxError bekommen, aber die Installation war erfolgreich.

Unterschiede in der Umgebung

Die Unterschiede zu Shotos Artikel http://sucrose.hatenablog.com/entry/2013/04/27/225218 werden unten beschrieben.

Da Pyquery dieselbe Notationsauswahl wie JQuery verwenden kann, ist es mit Console, einem Entwicklertool von Chrome, einfach, Versuche und Irrtümer durchzuführen. Praktisch.

Quellcode

topic_model_in_narou.py


# -*- coding: utf-8 -*-
import requests
from pyquery import PyQuery as pq
import gensim
import pdb


def fetch_narou_ranking_html():
    r = requests.get('http://yomou.syosetu.com/rank/list/type/total_total/')
    r.encoding = 'utf-8'
    return r.text


def collect_tags(d):
    d_novels = d('.s')
    tags = []
    for d_novel in d_novels:
        d_tag_name_list = d_novel.findall('a')
        tags_in_a_novel = [d_tag_name.text for d_tag_name in d_tag_name_list]
        tags.append(tags_in_a_novel)
    return tags


if __name__ == "__main__":
    html = fetch_narou_ranking_html()
    d = pq(html.encode('utf-8'))
    tags = collect_tags(d)

    dictionary = gensim.corpora.Dictionary(tags)
    dictionary.filter_extremes(3)
    corpus = [dictionary.doc2bow(text) for text in tags]
    lda = gensim.models.ldamodel.LdaModel(corpus=corpus, num_topics=10, id2word=dictionary)
    for x in lda.show_topics(-1, 5):
        print(x)

Ich habe ein Modell mit diesem Code erstellt und konnte Themen anzeigen. Die Ergebnisse sind wie folgt.

0.115*Fantasie+ 0.068*Magie+ 0.041*betrügen+ 0.034*Harem+ 0.028*Reinkarniert
0.173*Magie+ 0.095*Fantasie+ 0.039*dunkel+ 0.033*Ausflug+ 0.027*Reinkarniert
0.106*Reinkarniert+ 0.087*Harem+ 0.074*Der stärkste Held+ 0.063*betrügen+ 0.052*Fantasie
0.079*Fantasie+ 0.069*betrügen+ 0.062*Liebe+ 0.059*Reinkarniert+ 0.041*Eine weitere Weltreise
0.088*Fantasie+ 0.063*Eine weitere Weltreise+ 0.051*Harem+ 0.039*Abenteuer+ 0.039*Teilnahme am OVL Bunko Grand Prize
0.105*betrügen+ 0.103*Fantasie+ 0.062*Der stärkste Held+ 0.058*Magie+ 0.044*Reinkarniert
0.099*Fantasie+ 0.089*Reinkarniert+ 0.045*Der stärkste Held+ 0.045*am stärksten+ 0.034*Magie
0.051*Magie+ 0.051*Emporkömmling+ 0.051*Monster-+ 0.039*VRMMO + 0.039*ernst
0.140*Fantasie+ 0.077*betrügen+ 0.054*Reinkarniert+ 0.043*Magie+ 0.038*Abenteuer
0.168*Fantasie+ 0.073*Magie+ 0.052*Liebe+ 0.026*Abenteuer+ 0.026*Krieg

Ja, nur Fantasie ... Es gibt zu viele gleiche Genres und sie sind nicht in Themen unterteilt. Es scheint besser, die Daten aus dem Pixiv-Roman zu erhalten.

Nachtrag

dictionary.filter_extremes (no_below = 5, no_above = 0.5, keep_n = 100000) Ich dachte, dass es möglich sein könnte, die Nur-Fantasie-Situation zu ändern, indem ich den Wert der Funktion und die Filterung ändere, also habe ich sie geändert.

topic_model_in_narou.py


# -*- coding: utf-8 -*-
import requests
from pyquery import PyQuery as pq
import gensim
import pdb


def fetch_narou_ranking_html():
    r = requests.get('http://yomou.syosetu.com/rank/list/type/total_total/')
    r.encoding = 'utf-8'
    return r.text


def collect_tags(d):
    d_novels = d('.s')
    tags = []
    for d_novel in d_novels:
        d_tag_name_list = d_novel.findall('a')
        tags_in_a_novel = [d_tag_name.text for d_tag_name in d_tag_name_list]
        tags.append(tags_in_a_novel)
    return tags


if __name__ == "__main__":
    html = fetch_narou_ranking_html()
    d = pq(html.encode('utf-8'))
    tags = collect_tags(d)

    dictionary = gensim.corpora.Dictionary(tags)
    dictionary.filter_extremes(no_below=5, no_above=0.05, keep_n=10000)  #Veränderung
    corpus = [dictionary.doc2bow(text) for text in tags]
    lda = gensim.models.ldamodel.LdaModel(corpus=corpus, num_topics=20, id2word=dictionary)
    for x in lda.show_topics(-1, 5):
        print(x)

Der Wert von no_above wurde auf 0,05 gesetzt. Wir haben beschlossen, keine Tags zu zählen, die in mehr als 5% der Gesamtzahl erscheinen.

offizielle gensim-Website http://radimrehurek.com/gensim/corpora/dictionary.html

Hier sind die Ergebnisse.

0.166*Wachstum+ 0.133*Komödie+ 0.100*Schlacht+ 0.100*Emporkömmling+ 0.067*Narocon Hauptpreis
0.106*SF + 0.054*Ausflug+ 0.054*VRMMO + 0.054*Narocon Hauptpreis+ 0.054*Emporkömmling
0.142*Drachen+ 0.142*dunkel+ 0.073*Sklave+ 0.073*Aristokrat+ 0.073*Schlacht
0.120*Magier/Hexe+ 0.081*Geist+ 0.081*Elf+ 0.081*Tiermann+ 0.081*Emporkömmling
0.136*Mutig+ 0.136*Komödie+ 0.092*Labyrinth+ 0.092*am stärksten+ 0.092*VRMMO
0.140*Beschwöre eine andere Welt+ 0.106*Nation/Menschen+ 0.071*VRMMO + 0.053*Punktierung+ 0.036*Sklave
0.153*Ritter+ 0.078*Missverständnis+ 0.078*Mittelalter+ 0.078*Magier/Hexe+ 0.078*Beschwöre eine andere Welt
0.125*Beschwörung+ 0.125*Abenteurer+ 0.125*Tiermann+ 0.125*am stärksten+ 0.125*Bequemlichkeit
0.151*Mutig+ 0.091*Monster-+ 0.091*Wunderschönen+ 0.061*Krieg+ 0.061*Punktierung
0.163*Monster-+ 0.122*Freundschaft+ 0.082*Aristokrat+ 0.082*Emporkömmling+ 0.082*am stärksten
0.260*Geist+ 0.054*Aristokrat+ 0.054*Komödie+ 0.054*ernst+ 0.054*Nation/Menschen
0.143*Abenteurer+ 0.096*Schlacht+ 0.096*ernst+ 0.096*Innere Angelegenheiten+ 0.049*Emporkömmling
0.189*Komödie+ 0.143*Missverständnis+ 0.096*VRMMORPG + 0.096*Komödie+ 0.049*Schüler
0.147*Drachen+ 0.118*am stärksten+ 0.060*Elf+ 0.060*Schlacht+ 0.060*Krieg
0.173*Sklave+ 0.088*Ausflug+ 0.088*Magie+ 0.045*Wachstum+ 0.045*Monster-
0.173*Innere Angelegenheiten+ 0.088*Mutig+ 0.088*Ausflug+ 0.045*am stärksten+ 0.045*Sklave
0.130*ernst+ 0.088*Schlacht+ 0.088*Schüler+ 0.088*Senki+ 0.088*Transfer in eine andere Welt
0.143*Fertigkeit+ 0.107*Vorlage+ 0.072*Krieg+ 0.072*Emporkömmling+ 0.072*Magie
0.206*Krieg+ 0.070*Innere Angelegenheiten+ 0.070*Mittelalter+ 0.070*Beschwörung+ 0.070*Nation/Menschen
0.130*Sklave+ 0.130*Gilde+ 0.088*Aristokrat+ 0.088*Beschwörung+ 0.045*Krieg

Immerhin war es nur Fantasie ...

Aber wenn Sie genau hinschauen, ist es ein bisschen wie "Ernst, Schlacht, Schüler, Senki, ein anderer Welttransfer", "SF, Reise, VRMMO, Narurokon-Hauptpreis, Aufstieg", "Krieg, innere Angelegenheiten, Mittelalter, Beschwörung, Nation / Ethnizität". Scheint ein anderes Genre zu sein, daher ist es besser als beim Standardprozess dictionary.filter_extremes ().

Recommended Posts

Analysieren Sie das Themenmodell, mit GensimPy3 Romanautor zu werden
Ich habe versucht, ein Modell mit dem Beispiel von Amazon SageMaker Autopilot zu erstellen
Machen Sie LCD-Screenshots mit Python-LEGO Mindstorms
Visualisieren Sie das charakteristische Vokabular eines Dokuments mit D3.js.
Berechnen Sie das Produkt von Matrizen mit einem Zeichenausdruck?
Ich habe versucht, mit dem Seq2Seq-Modell von TensorFlow so etwas wie einen Chatbot zu erstellen
Überprüfen Sie die Wirkung des Urlaubs als Gegenmaßnahme gegen das neue Koronavirus mit dem SEIR-Modell
Mit den Daten von COVID-19 wurde ein Netzwerkdiagramm erstellt.
Messen Sie die Wichtigkeit von Features mit einem zufälligen Gesamtstrukturwerkzeug
Holen Sie sich die ID einer GPU mit geringer Speichernutzung
Holen Sie sich UNIXTIME zu Beginn des heutigen Tages mit einem Befehl
Implementieren Sie mit Open Modelica das mathematische Modell "SIR-Modell" von Infektionskrankheiten
Die Geschichte des Django-Modellfeldes verschwindet aus der Klasse
Ich habe eine Funktion erstellt, um das Modell von DCGAN zu überprüfen
Kalibrieren Sie das Modell mit PyCaret
Neue Corona-Virus-Infektion: Die Rolle sozialer Distanzstrategien mit einem einfachen Modell verstehen
Die Geschichte, wie man mit discord.py einen Fragenkasten-Bot erstellt
Ich habe versucht, die Anzahl der im Inland infizierten Menschen der neuen Korona mit einem mathematischen Modell vorherzusagen
Verarbeiten Sie den Inhalt der Datei der Reihe nach mit einem Shell-Skript
Eine Geschichte, die mit der Installation der maschinellen Lernbibliothek JAX zusammenhängt
Finden Sie den optimalen Wert der Funktion mit einem genetischen Algorithmus (Teil 2)
[Statistik] Erfassen Sie das Bild der zentralen Polbegrenzungstheorie mit einem Diagramm
[Einführung in StyleGAN] Ich habe mit "The Life of a Man" ♬ gespielt
Wenn Sie eine Liste mit dem Standardargument der Funktion angeben ...
Die Geschichte, einen Standardtreiber für db mit Python zu erstellen.
Zählen Sie mit NetworkX den maximal verketteten Teil eines zufälligen Diagramms
Rufen Sie die URL des von der Jira-Python-Bibliothek erstellten JIRA-Tickets ab
Bewerten Sie die Leistung eines einfachen Regressionsmodells mithilfe der LeaveOneOut-Schnittstellenvalidierung
Die Geschichte, ein Modul zu erstellen, das E-Mails mit Python überspringt
Erstellen Sie ein Kompatibilitätsbewertungsprogramm mit dem Zufallsmodul von Python.
Python-Simulation des Epidemiemodells (Kermack-McKendrick-Modell)
Inverse Analyse des maschinellen Lernmodells
Erstellen Sie mit PySide einen Modelliterator
Validieren Sie das Trainingsmodell mit Pylearn2
Die Geschichte des Exportierens eines Programms
Erstellen einer verteilten Umgebung mit der Raspberry PI-Serie (Teil 1: Zusammenfassung der Verfügbarkeit von plattenlosen Clients nach Modell)
Eine Geschichte, die die Gegenwart von Qiita mit Qiita API + Elasticsearch + Kibana visualisiert
Die Geschichte eines Parksensors in 10 Minuten mit dem GrovePi + Starter Kit
Die Geschichte, wie man mit Python einen 100-Yen-Frühstücks-Bot für die Universität macht
[Erklärung zum AtCoder] Kontrollieren Sie die A-, B- und C-Probleme von ABC182 mit Python!
Berechnen Sie die kürzeste Route eines Diagramms mit der Dyxtra-Methode und Python
Memorandum zur Einführung des EXODUS-Datenmodells der Finite-Elemente-Methode (FEM)
Generieren Sie eine Liste mit der Anzahl der Tage im aktuellen Monat.
Eine Reihe von Amateur-Infrastrukturingenieuren, die Django mit Docker berühren (2): Erstellen eines Modells
[Einführung in Python] So sortieren Sie den Inhalt einer Liste effizient mit Listensortierung
Lernen Sie die Grundlagen der Dokumentklassifizierung durch Verarbeitung natürlicher Sprache, Themenmodell
[NNabla] Hinzufügen einer Quantisierungsschicht zur mittleren Schicht eines trainierten Modells
Berechnen Sie die Wahrscheinlichkeit, eine Tintenfischmünze zu sein, mit dem Bayes-Theorem [Python]
Die Geschichte einer Soundkamera mit Touch Designer und ReSpeaker
Ich habe versucht, die Negativität von Nono Morikubo zu analysieren. [Vergleiche mit Posipa]
Ich habe GAN mit Keras gemacht, also habe ich ein Video des Lernprozesses gemacht.
Holen Sie sich das durchschnittliche Gehalt eines Jobs mit bestimmten Bedingungen von Indeed.com
Ich habe einen Fehler beim Abrufen der Hierarchie mit MultiIndex von Pandas gemacht
Ich habe versucht, das Verhalten des neuen Koronavirus mit dem SEIR-Modell vorherzusagen.
[AtCoder Erklärung] Kontrollieren Sie ABC184 A, B, C Probleme mit Python!
[Python & SQLite] Ich habe den erwarteten Wert eines Rennens mit Pferden im 1x-Gewinnbereich ① analysiert