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