[PYTHON] [Apprentissage automatique] Regroupez les articles Yahoo News avec le modèle de sujet MLlib (LDA).

Ceci est le troisième article de la série Spark. Utilisons le LDA de MLlib pour regrouper les articles de Yahoo News avec un modèle de sujet (LDA: allocation de Dirichlet latent).

Premier coup [Apprentissage automatique] Démarrez Spark avec iPython Notebook et essayez MLlib    http://qiita.com/kenmatsu4/items/00ad151e857d546a97c3 Deuxième édition [Apprentissage automatique] Essayez d'exécuter Spark MLlib avec Python et faites des recommandations    http://qiita.com/kenmatsu4/items/42fa2f17865f7914688d

0. Environnement

Veuillez noter que cet article décrit ce qui a été fait dans l'environnement ci-dessus, de sorte que les paramètres peuvent différer dans d'autres environnements.

Python est exécuté par iPython Notebook (Jupyter).

1. Recevez des articles de presse

Il existe un flux RSS de Yahoo News à l'adresse http://headlines.yahoo.co.jp/rss/list, alors collectez des liens et des articles à partir de là.

#Diverses importations
from bs4 import BeautifulSoup
import requests,json, time
from requests_oauthlib import OAuth1Session
from requests.exceptions import ConnectionError, ReadTimeout, SSLError
import numpy as np
import numpy.random as rd
import MeCab as mc
from collections import defaultdict
import cPickle as pickle
import traceback
from datetime import datetime as dt

IPADIC_NEOLOGD_PATH = '/usr/local/lib/mecab/dic/mecab-ipadic-neologd/'

def unpickle(filename):
    with open(filename, 'rb') as fo:
        p = pickle.load(fo)
    return p

def to_pickle(filename, obj):
    with open(filename, 'wb') as f:
        pickle.dump(obj, f, -1)

Ce qui suit est une classe qui télécharge des articles de Yahoo News (http://headlines.yahoo.co.jp/rss/list). Cela prend beaucoup de temps et accédera beaucoup à Yahoo News, donc j'ai déjà téléchargé et préparé les données qui ont été analysées morphologiquement avec Mecab, donc si vous voulez essayer de reproduire cet article, veuillez l'utiliser. Veuillez l'utiliser. (Expliqué dans la section suivante.)

Mecab utilise mecab-ipadic-neologd de @ overver. Auparavant, l'introduction de ce Mecab était introduite dans [cet article](http://qiita.com/kenmatsu4/items/02034e5688cc186f224b#1-1mecab introduction), veuillez donc vous y référer lors de l'installation.

#Classe qui récupère des articles de Yahoo News
class Category():
    def __init__(self, name="", url=""):
        self.name = name
        self.url = url
        self.article_list = []
        
    def addArticle(self, article):
        self.article_list.append(article)
        
class Article():
    def __init__(self, title="", contents=u"Non acquis", url=""):
        self.url = url
        self.title = title
        self.contents = contents
        self.mecabed_contents = {}
        
    def add_contents(self, contents):
        self.contents = contents
        
    def exec_mecab(self):
        self.mecabed_contents = Article.mecab_analysis(self.contents)
        
    @staticmethod
    def mecab_analysis(sentence):
        t = mc.Tagger('-Ochasen -d {}'.format(IPADIC_NEOLOGD_PATH))
        sentence = sentence.replace('\n', ' ')
        text = sentence.encode('utf-8') 
        node = t.parseToNode(text) 
        ret_list = []
        while node.next: 
            if node.surface != "":  #Exclure les en-têtes et les pieds de page
                word_type = node.feature.split(",")[0]
                if word_type in ["nom", "adjectif", "verbe"]:
                    plain_word = node.feature.split(",")[6]
                    if plain_word !="*":
                        ret_list.append(plain_word.decode('utf-8'))
            node = node.next
        return ret_list 

DEBUG = True
class YahooHeadlines():
    def __init__(self):
        self.url = 'http://headlines.yahoo.co.jp/rss/list'
        self.category_list = []
        self.f = open('log/log_{}.log'.format(dt.now().strftime('%Y%m%d_%H%M%S')), 'a+')
        
    def close(self):
        self.f.close()
                      
    def logging(self, log):
        self.f.write(log.encode('utf-8'))
    
    def unpickle(self, filename):
        with open(filename, 'rb') as fo:
            p = pickle.load(fo)
        self.category_list = p

    def pickle(self, filename):
        with open(filename, 'wb') as f:
            pickle.dump(self.category_list, f, -1)
        
    def download_contents(self):
        self.get_category_url_list()
        self.get_article_title_list()
        self.get_all_article()

    def get_url_list(self):
        return self._url_list
    
    def set_category_list(self, category_list):
        self.category_list = category_list
    
    def get_category_list(self):
        return self.category_list
    
    def get_category_url_list(self):
        res = requests.get(self.url)
        news_all = BeautifulSoup(res.text, "xml")
        for link in news_all.find_all('a'):
            url = link.get('href')
            if 'xml' in url and 'my.yahoo.co.jp' not in url:
                self.category_list.append(Category(name=link.parent.text.replace('\n',''), url=url))
        if DEBUG:
            print "len(self.category_list)", len(self.category_list)

    def get_article_title_list(self):
        for category in self.category_list:
            res = requests.get(category.url)
            soup = BeautifulSoup(res.text, "xml")
            for item in soup.find_all('item'):
                category.addArticle(Article(title=item.title.getText(), url=item.link.getText()))

    def count(self):
        print "len(self.category_list)", len(self.category_list)
        for cat in self.category_list:
            print "len(cat.article_list)", len(cat.article_list)

        
    def get_all_article(self, start=0, end=None):
        end = len(self.category_list) if end is None else end
        for cat in self.category_list[start:end]:
            print cat.name
            for article in cat.article_list:
                try:
                    print article.title
                    time.sleep(0.5)   # interval time for reducing server load
                    res = requests.get(article.url)
                    soup = BeautifulSoup(res.text, "xml")
                    t = soup.find("p", "ynDetailText")
                    if len(t.getText()) > 0:
                        temp = []
                        for line in t.prettify().split('\n'):
                            if '<!-- /.paragraph -->' in line:
                                break
                            temp.append( line )
                        article.add_contents(BeautifulSoup("\n".join(temp), "xml").get_text().replace(' ','').replace('\n',''))
                        article.exec_mecab()
                except Exception as e:
                    print "error."
                    self.logging(u"{},{}".format(article.url, article.title))
                    self.logging(traceback.format_exc())

    def export(self):
        news_list = []
        for c in self.category_list:
            for a in c.article_list:
                if u'Non acquis' != a.contents:
                    news_list.append(a.mecabed_contents)
        return news_list

Téléchargez l'article News et enregistrez-le avec pickle.

yh = YahooHeadlines()
print "YahooHeadlines() created."
yh.get_category_url_list()
print "get_category_url_list() finished."
yh.get_article_title_list()
print "get_article_title_list() finished."
yh.get_all_article(start=9, end=30)
dat = yh.export()
to_pickle('mecabed_contents.npy', dat)

2. Téléchargement et lecture des données analysées morphologiquement avec Mecab

Le fichier mecabed_contents.npy analysé est stocké à l'emplacement suivant sur GitHub, veuillez donc le télécharger et l'utiliser. https://github.com/matsuken92/Qiita_Contents/tree/master/LDA_with_Spark

Chargez les données ci-dessous.

dat = unpickle('mecabed_contents.npy')

2. Redimensionner Java Heap pour une utilisation avec Spark

Dans le calcul LDA, une exception Java OutOfMemory a été émise, augmentez donc la taille du tas. (Je pense que cela dépend de l'environnement dans lequel il est exécuté, veuillez donc le définir de manière appropriée)

cd $SPARK_HOME/conf
cp spark-defaults.conf.template spark-defaults.conf
vi spark-defaults.conf

Décommentez uniquement sur «spark.driver.memory» comme indiqué ci-dessous.

spark-defaults.conf


# spark.master                     spark://master:7077
# spark.eventLog.enabled           true
# spark.eventLog.dir               hdfs://namenode:8021/directory
# spark.serializer                 org.apache.spark.serializer.KryoSerializer
spark.driver.memory                5g
# spark.executor.extraJavaOptions  -XX:+PrintGCDetails -Dkey=value -Dnumbers="one two three"

3. Démarrez Spark, extrayez des fonctionnalités avec Tf-Idf et effectuez une classification à l'aide de LDA

3-1. Démarrez Spark

Veuillez également vous référer à Article précédent pour démarrer Spark avec iPython Notebook (Jupyter).

Quoi qu'il en soit, lancez Spark.

import os, sys
import pandas as pd
import numpy as np
from datetime import datetime as dt
print "loading PySpark setting..."
spark_home = os.environ.get('SPARK_HOME', None)
print spark_home
if not spark_home:
    raise ValueError('SPARK_HOME environment variable is not set')
sys.path.insert(0, os.path.join(spark_home, 'python'))
sys.path.insert(0, os.path.join(spark_home, 'python/lib/py4j-0.8.2.1-src.zip'))
execfile(os.path.join(spark_home, 'python/pyspark/shell.py'))

3-2. Vectorisation des données par Tf-Idf

** Remarque: la vue selon laquelle l'exécution du modèle de rubrique avec Tf-Idf améliore la précision, et la vue selon laquelle il est théoriquement supposé compter les mots (Tf-Idf devient flottant). Veuillez noter qu'il semble que cela ne correspond pas à la théorie car cela finira. J'ajouterai bientôt la méthode de comptage normale. (Voir la section des commentaires. [Merci pour votre commentaire @ ixofog417.]) **

Tout d'abord, vectorisez avec Tf-Idf pour préparer l'application de l'article acquis à LDA.

import pandas as pd
from pyspark.mllib.feature import HashingTF
from pyspark.mllib.feature import IDF

hashingTF = HashingTF()
documents = sc.parallelize(dat)
def hashing(x):
    return hashingTF.transform([x]).indices[0]

hashed = documents.flatMap(lambda line: line) \
             .map(lambda word: (hashing(word), word)).distinct()

hashed_word = pd.DataFrame(hashed.collect(), columns=['hash','word']).set_index('hash')

hashed_word contient les données suivantes. Plus tard, je veux extraire le mot de la valeur de hachage, donc je vais en faire une table.

word
hash
605 Invités invités
342707 Joueur
578741 Entreprises de fleurs
445743 Dogo Onsen
599361 BURBERRY
520201 Tokyo Game Show
... ...
735678 Omettre
56058 Sécurité
444490 Tsukiko
706206 GENERATIONS
267402 Coupé

41261 rows × 1 columns

Calculez la valeur Tf-Idf avec Spark et générez le RDD converti afin qu'il puisse être lu par LDA.

# Tf-Génération Idf
tf = hashingTF.transform(documents)
tf.cache()

idf = IDF().fit(tf)
tf_idf_data = idf.transform(tf)

3-3. Exécution du LDA

Exécutez LDA avec Spark MLlib. Pour le moment, définissez k = 30. Le défi est de savoir comment décider du nombre de sujets. Cette fois, j'ai finalement choisi Ai, donc je pense qu'il y a une meilleure valeur. (Si vous savez comment décider k, dites-moi s'il vous plaît!)

from pyspark.mllib.clustering import LDA, LDAModel
from pyspark.mllib.linalg import Vectors
print dt.now().strftime('%Y/%m/%d %H:%M:%S')
K = 30


# Index documents with unique IDs
corpus = tf_idf_data.zipWithIndex().map(lambda x: [x[1], x[0]]).cache()

# Cluster the documents into three topics using LDA
%time ldaModel = LDA.train(corpus, k=K)

# Output topics. Each is a distribution over words (matching word count vectors)
print("Learned topics (as distributions over vocab of " + str(ldaModel.vocabSize()) + " words):")
%time topics = ldaModel.topicsMatrix()

print dt.now().strftime('%Y/%m/%d %H:%M:%S')

Je cours sur un "nouveau Macbook" faible et ce calcul a pris environ 12 minutes. Vous pouvez le faire: sourire:

out


2015/09/20 17:31:17
CPU times: user 6.34 ms, sys: 2.09 ms, total: 8.44 ms
Wall time: 30.8 s
Learned topics (as distributions over vocab of 1048576 words):
CPU times: user 5min 14s, sys: 6min 12s, total: 11min 26s
Wall time: 11min 53s
2015/09/20 17:43:42

3-4. Sortie de résultat

Le résultat calculé dans la section précédente est une sortie.

def idx_to_word(idx):
    res = hashed_word.ix[idx].word
    if type(res) == pd.Series:
        return res.to_dict().values()[0]
    else:
        return res

rep_num = 20

for topic in range(K):
    print("Topic " + str(topic) + ":")
    temp_w = []
    temp_t = []
    for word in range(0, ldaModel.vocabSize()):

        top = topics[word][topic]
        if top != 0:
            #print("{}:{}".format(word, top))
            temp_w.append(word)
            temp_t.append(top)
    
    temp_w = np.array(temp_w)
    temp_t = np.array(temp_t)
    idx = np.argsort(temp_t)[::-1]
    print ','.join(map(idx_to_word, temp_w[idx[:rep_num]]))
    print temp_t[idx[:rep_num]]

Voici les résultats de la classification. Les 20 premiers mots de chaque sujet sont affichés. C'est comme ça, mais il faut encore un réglage. Ce à quoi se réfère chaque sujet n'est pas clair. Est-ce comment décider k?

out


Topic 0:
3D,1%,JP,Yahoo,co.jp,http://,2Z,FE,TC,WC,JavaScript,SRC,ALT,D2,Minutes,.S,SIG,clear,Mi,GIF
[ 30498.99621439   6067.97495307   5638.31180986   4239.90976107
   3839.63866955   3620.87671019   2048.76800459   2035.55013512
   2035.55013512   2035.55013512   1903.02711354   1898.96547573
   1820.93929181   1763.1621581    1724.74815005   1688.15876657
   1613.83355369   1483.59938276   1454.82128817   1338.48860166]
Topic 1:
L'apprentissage en profondeur,GPU,Excédent de dette,Centrale nucléaire,Ajin,Opération,Kyocera,Calcul,Hamada,Japon Inter,Recommandation,M. Murakami,Woodward,Bibliothèque,Achat,ABC,DI,Utilisation,Médecine préventive,Actif net
[ 230.26782221  222.54019498  109.0725775    86.27167445   86.10057908
   84.22603202   67.68409895   66.99081298   60.91536464   57.4006148
   57.16789412   50.24346965   50.17063652   45.16572514   43.57092785
   43.37177773   43.06492631   41.84250571   40.60449032   39.60700784]
Topic 2:
du son,Professeur,Amplificateur,Litige,orateur,Suzuki,Université,parti communiste,A-10,DR,(Stock),SUZUKI,M.,Capitale,HONDA,Itano,m,Enregistrement,Internet,bande
[ 313.9497848   311.07373468  291.18216703  200.41036663  174.99267573
  168.83426043  162.12249119  160.4631899   158.44550237  155.86272676
  152.51636208  145.63724853  144.22014499  143.88263097  138.80529834
  136.38362019  133.87558279  132.8150622   127.1633457   123.42496755]
Topic 3:
Dauphin,patient,Transporter dans,Marine,Adhésion,米Marine,Stratégie,avocat,Commerçant,train,Peinture de printemps,Goku ZERO,Militaire,Fukuoka,Accord,Groupe,la belle et la Bête,Rang,emblème,mise à jour
[ 285.35384105  125.29445731  122.03394224  117.37108065  114.56787287
  107.67685141  107.66792085  107.49265658  104.77371348  104.55689386
  103.34343411  101.54959522   99.13195887   97.66056425   87.6906483
   83.77795736   82.83739301   82.06384181   81.99063074   79.61260345]
Topic 4:
Îles Ogasawara,19e,pluie,NARUTO-Naruto-,Perspective,demain,Endroit,Chocobo,Aujourd'hui,des champs,Typhon n ° 20,Catastrophe sédimentaire,Ofuji,Luna,arme,Très,Station,y a-t-il,Hmm,Tohoku
[ 230.41298471  206.73983243  201.38377462  162.53955457  156.01089213
  152.26626716  147.20327527  143.56116858  138.58499586  136.35519513
  134.63602579  131.89025362  122.02553338  114.84698842  114.73039984
  112.58882552  111.19144156  109.29280382  108.74278871  108.06638723]
Topic 5:
boutique,LGBT,Rural,Feuilles d'automne,Hanyu,Everest,Des soirées,USJ,MM,soudage,NorAh,Kushiro,joueur,base-ball,Homme,Abe,Dohi,perte,Muraki,Fukamachi
[ 534.02134183  233.21159627  161.734613    149.27499135  148.04072853
  139.83024817  128.12607155  127.16365004  121.55663036  116.93175677
  115.10536063  111.9230136   108.32928292  101.01309412   99.57305727
   97.8645909    93.31870841   90.55202246   88.16103482   85.11086582]
Topic 6:
Force d'autodéfense,Le pertinent,Activités,Article,la mise en oeuvre,porter secours,etc,soutien,Règlements,Des biens,Article,La coopération,Mesure,Unité,Prestations de service,chercher,situation,Offre,deux,armée
[ 425.27200701  410.14147759  340.63660257  335.99268066  301.03835559
  277.69844718  262.99789699  244.04626438  241.86903535  233.56945124
  226.29603529  213.94031937  208.31405209  198.09771261  191.92479361
  173.18290576  171.56092092  164.69617574  147.1031081   144.02472698]
Topic 7:
Hmm,pense,さHmm,Homme,Danse,Aller,Lieu,Yo,faire,joueur,mot,Chanson,étape,Devenir,créer,viens,Apparence,membre,chose,Femme
[ 400.87252109  311.02748052  250.83203469  243.87087686  241.62681685
  235.1485944   219.71001515  212.56170962  206.76164473  198.28774766
  190.64751854  190.09850913  187.53964957  178.53456693  173.1581961
  170.93611348  167.90595764  166.71680877  163.85967037  160.64966047]
Topic 8:
Lee Seung Gi,Smartphone pas cher,Endo,Boîte de police,Architecture,conception,SHEENA,Carla,équipe Dempa.inc,la taille,Joe,Construction,Chidori,Veille,Christian,Kura,Inoculation,Étude de cas,Traitement spécial,concurrence
[ 122.01843494  100.42493188   96.7819965    90.82173926   84.67996554
   84.04629268   81.2426219    81.22826354   79.28066538   77.10645017
   75.3958751    70.7937157    67.79664672   67.62432926   62.02688985
   61.12174747   60.911537     60.671785     60.6691196    59.22618216]
Topic 9:
Ishihara,Yamashita,9 mai,Centrale nucléaire,Total,MAX,M.,Alibaba,a gagné,Kawashima,amour,Moine,Dix mille,Enchère réussie,,,Takamine,Rôle,mettant en vedette,坊M.,Emploi Département du travail
[ 251.21702545  246.98644992  188.33673645  180.99682139  170.83125774
  161.27898596  150.18861226  148.37545664  145.26656891  116.99233982
  115.97102397  111.61849001  108.61185273  108.09102905  104.38739566
  103.32743846   96.51126917   95.40721995   95.33654317   94.80918496]
Topic 10:
Droit de légitime défense collective,exercice,Sécurité,Japon,restes,facture,Corée du Nord,GO,système,premier ministre,Riz,Pokemon,Corée,paix,guerre,En pensant,Réunion,Établi,Kobayashi,Télomée
[ 325.4190462   294.03767623  253.6549491   215.81603062  212.85361125
  212.4241334   203.16256149  145.41407277  145.35949337  144.77378143
  140.99962347  135.45572385  131.0855378   121.75771794  118.79648391
  117.21162034  115.63520103  115.03735685  115.02058923  114.84203109]
Topic 11:
1,0,2,3,5,4,9,8,facture,6,journée,7,membre du comité,Année,Opposition,Parlement,%,Brouillon,Membre du Congrès,Parti au pouvoir
[ 2365.0615964   1843.50976149  1580.14166211   977.45697796   972.93295992
   900.33510929   811.76679401   734.30895952   708.8845634    687.91169097
   666.9871633    638.37414039   480.65198962   403.9740617    397.36591408
   389.03843978   378.11150102   372.94260471   366.06518175   348.52658829]
Topic 12:
%,la semaine,Homme,thé,La main d'oeuvre,Ogiso,Groupe Yamaguchi,Kuwahara,Liège,Envoi,Enquête,Examen,Visite au Japon,Fête Senuri,ventilateur,Répondre,Extension,période,Dix mille,M.
[ 422.50645087  213.35496472  190.18553723  185.25693     172.87477417
  169.32178049  168.65380074  168.60270933  165.10107941  163.39675225
  158.10205955  157.84657732  156.61876499  150.94891424  144.86004174
  142.60856342  141.41821081  139.14405814  136.07482269  129.11386079]
Topic 13:
Animal de compagnie,pneu,inspection,Film Fuji,boutique,chien,accident,Propriétaire,Pain,Relaxation quantitative,bulle,février,Archer,organe,animal,Entreprise,ELEMENT,Fermé,Animal de compagnieシッター,Prends soin de toi
[ 144.38505303  139.38328152  138.65459253  120.09515611  117.32842831
  111.2811561    97.34985563   90.9386823    88.76830528   86.09862267
   86.03676176   81.16131412   73.04842045   71.94537875   71.76221994
   69.36573458   67.72482177   67.56636611   64.59788527   63.72988257]
Topic 14:
débris,espace,Satellite,Okano,S.M.A.R.T,Yasu,Ambre dur,photon,Kinoshita Hanta,faisceau,Suppression,Pâtes,Ai Otome ★ DOLL,Ninomiya,fusée,joueur,collision,construction,Placage,Shinohara
[ 200.98746196  109.11393056  102.69563054   71.64443048   70.61628478
   70.21806077   69.47009154   67.71824577   64.58911369   63.98653636
   61.75894589   57.1558711    54.17379175   50.53475054   50.08003639
   49.38497398   49.1474643    48.05613337   47.37467689   47.21593097]
Topic 15:
train,boutique,Chemin de fer,station,transport,Déduction pour conjoint,Dix mille,Cercle,prix,Larve,défendeur,gène,Les dégâts des inondations,médicament,Débris,Jeter,éducation,Fret JR,Entraine toi,système
[ 209.45549658  172.75201923  164.79055902  147.02460723  146.34946295
  122.11417714  116.53446688  113.36476153  110.00093014  101.51355757
  101.49522834   93.61766945   90.44254789   90.21005366   86.14087176
   85.94118974   85.87426669   83.81989617   81.4445114    81.32144707]
Topic 16:
Chanson,Écrit,M.,Écrit品,un événement,étape,Libération,Performance,vivre,Hmm,Libération,Apparence,album,ventilateur,Frimer,Libération,Tenu,pense,Enregistrement,Lieu
[ 717.72208948  701.88650132  675.57536789  653.80324063  630.25795307
  623.56413175  593.77778162  570.85401227  542.29065168  530.72760902
  527.34422729  504.12104195  477.59137972  477.00323092  449.362484
  433.71529537  424.21385561  415.6621296   413.39032883  408.44365814]
Topic 17:
Les immigrants,m,589 Croatia,action,premier ministre,Corps du tigre blanc,Envoyer,Loi de régulation Stoker,Kwon Sang Woo,Allemagne,Tsukimito,tour,Taureau,Frontière,Abbott,Dirigeants,Hungary,Et al.,Dans la juridiction,email
[ 164.44142649  157.91328715  138.76814858  132.5043004   125.07620334
  114.82154418  112.98085344  108.36476034  100.36013718   99.44524733
   95.72254509   91.79868319   89.07727008   83.49107233   81.37738585
   78.16457362   77.45463275   77.03517754   75.47489877   74.73847572]
Topic 18:
%,Bière,Milliard,Dix mille,Raleigh,Taxe sur l'alcool,Augmenter,Année précédente,Rang,Diminution,Cercle,Enquête,Pour,Compagnie,rapport,un service,marché,Livres,Posco,Mille milliards
[ 580.21824689  434.53747304  337.23060498  322.90011084  275.51253012
  255.35439791  202.94575502  195.40863404  193.2023368   188.88153369
  188.32713027  185.3074174   182.46872612  180.38548978  168.37490369
  159.71109053  159.65702647  155.00164055  150.38902564  149.40071569]
Topic 19:
Okamura,Donner,Ishibashi,Positif,Polarisation,Okamura隆史,Break dance,Criminel,des lunettes de soleil,Ecran tactile,tu,réfugiés,conduire,Fete a la MAISON,recevoir,Père,pharmacien,Basilique,pharmacie,三菱conduire筆
[ 77.67608384  65.66168235  62.59137271  61.50991922  50.18323397
  44.41180978  43.50803013  41.09367176  40.73945738  38.9101876
  37.57614659  36.56843092  35.85623378  35.81638016  34.10640826
  33.81327369  32.32619825  31.22516758  31.12976321  30.34057197]
Topic 20:
charbon,Négociation,Akiko Wada,Okinawa,saké sucré,Ressources humaines,de,Avigan,Règlement du travail,Boule Obon,Réunion,Parc d'attractions,Clé,serendipity,Bal du nouvel an,USJ,PIN,cellule,Ministre,épicerie
[ 200.98686962  154.40963453  106.75322346  102.73754422  100.48163455
   98.9612829    94.85889131   93.31730072   93.30796905   93.27433467
   92.84230214   89.15912225   87.60003563   86.13875558   86.09579478
   81.48415665   81.37494046   81.10648568   75.53083854   74.76190319]
Topic 21:
18e,Côte,Agence météorologique,Shin Hakodate Hokuto,Shinkansen,aller-retour,Ouverture,île,Caoutchouc,2015,Hokkaido,Hawaii,Première visite,父île,SAKANAMON,VAMPS,Apparence,Présentation,3M,Observation
[ 326.61966201  176.18179227  162.70899568  137.89819305  135.61061726
  131.91446936  127.87583916  123.18162869  119.46292987  114.89846676
  113.33026617  108.85661384   96.44435409   94.0825422    93.31173974
   92.48630364   90.34013265   89.33794268   89.00557891   88.60743728]
Topic 22:
Kiriya,RC,Sakaguchi,MT,Tori,Grèce,Disqualification d'héroïne,Guerres des étoiles,Yamazaki,musiques,Geler,Hiromitsu,AWA,Nebuta,Original,OB,Cellule T,M. M,Dispersion,Parc Solmi
[ 242.08396669  233.61062923  172.28879872  158.02400752  156.16092615
  149.65020403  145.38706775  143.01353797  123.89388685  107.61948489
  105.20201675  104.23176854  103.93186096  101.57317097  101.33211206
   98.35838535   93.31294228   81.26331036   78.87903503   77.78473071]
Topic 23:
Conseiller fiscal,Cercle,Dix mille,Déclaration,exportation,montant,impôt,Rang,Mon numéro,Bureau,le revenu,système,%,Philippine,Si,Milliard,Puissance,Compagnie,Détaillant de masse d'électronique domestique,chose
[ 670.6061898   559.30722115  395.94196364  369.03793975  352.9802148
  350.59584008  348.81817142  345.42194256  281.01115977  270.7837518
  268.64882097  263.68902183  256.54739477  233.11666127  228.29591629
  224.91966604  208.54269702  206.95435942  201.05969014  199.71772628]
Topic 24:
de,Constitution,Compagnie,chose,Japon,La personne,Nation,Yuichi Kimura,avocat,ça peut,Entreprise,conception,développement de,Yo,pense,y a-t-il,Dire,Puissance,sexe,Pense
[ 371.66961434  337.03124549  319.99104269  319.594891    309.51245673
  287.52866308  271.19087899  267.75333312  261.60521555  256.02307667
  251.18894465  239.58136963  238.33242359  238.07787656  233.68552111
  231.93864718  213.6720825   207.06572415  206.83553817  206.39025416]
Topic 25:
dommage,Milliard,Boutique,opération,Cercle,Frais,passager,Héli,0,Augmenter,Agriculture,Diminution,Année précédente,AKB48,Miyagi,Ouverture d'un magasin,Préfecture,boutique,Dix mille,tandis que
[ 322.28929388  284.37384142  264.46206604  248.44913769  226.60800063
  226.41660568  212.16654388  205.88384117  189.18011081  173.35857685
  170.73582962  170.16262181  167.13947269  166.91143061  165.98762565
  164.64467713  157.49179255  153.26181924  149.68685887  145.6529475 ]
Topic 26:
Taux de hausse,Chine,marché,Économie,Etats-Unis,Dollar,km,%,Ahn,Monter,Machine,taux d'intérêt,Entreprise,Stock,Perspective,Tomber,Cercle,investissement,taux,Corée
[ 711.44316161  691.81953214  624.21582824  603.1447681   464.88853934
  444.72254696  425.1654548   400.24353915  398.08670081  384.38514657
  378.64702088  364.08566045  354.84095879  354.60928052  346.69708409
  337.14563576  335.09073391  331.251988    328.37760334  316.68760744]
Topic 27:
films,réalisé par,jouer,Hmm,je,Acteur,Rôle,âge,Écrit,L'homme fourmi,さHmm,Apparence,travaux,étape,Drame,Tournage,Livre,actrice,pense,chose
[ 886.18859913  521.81885818  517.66295551  341.28837968  323.889684
  320.54609403  318.78269341  305.49616021  292.69106111  291.83105713
  283.59914761  271.24734272  271.03094368  266.13209765  257.9348965
  252.86535054  245.73361042  241.71909116  225.00245517  222.13685278]
Topic 28:
Jeu,ça peut,Alimenté par,Recrutement,développement de,de,chose,Yuichi Kimura,pour,Supporter,m,Rembourser,利pour,À,Chine,sexe,Yo,Produit,Devenir,téléphone intelligent
[ 453.00001367  302.95432162  283.96542019  280.46414245  257.18675974
  254.89400232  246.43778386  219.71661031  217.78910865  214.12011552
  212.66757085  211.03349157  205.35032129  203.34111497  197.81430578
  193.73396761  193.32616187  190.05730112  189.02413711  187.26200727]
Topic 29:
Asakusa,Autres,la comédie,Club Hikari,Litchi,Kanon,Nakajo,Etc.,Taylor,Festival du film,Takeshi,Ville,Ligne Tsugaru Sanmi,je,Performance,Taitung,Joe Hisaishi,mise en charge,Takarazuka,JR Kyushu
[ 170.36663986  156.09380245  132.93872491  127.17520086  127.13453875
  112.71315236  110.24371137  107.89145147  106.67342349  102.47261177
   99.54801093   93.6074624    90.90080501   85.36814206   79.75410095
   79.31855725   78.95649479   76.60922126   74.76350455   74.69475118]

4. Défis

Il y a les problèmes suivants. Si vous avez des connaissances, je vous serais reconnaissant de bien vouloir me donner quelques conseils.

  1. Y a-t-il un problème avec l'application de LDA avec BOW de Tf-Idf au lieu du nombre d'occurrences de mots? → Il semble préférable de compter les mots.
  2. Les mots sont hachés lors de la conversion Tf-Idf, mais les mots entrent en collision. (Nécessite une action)
  3. Comment déterminer le nombre de thèmes K. Cette fois, je l'ai mis à 30.

référence

Spark 1.5.0 Machine Learning Library (MLlib) Guide  http://spark.apache.org/docs/latest/mllib-guide.html

MLlib - ClusteringLatent Dirichlet allocation (LDA)  http://spark.apache.org/docs/latest/mllib-clustering.html#latent-dirichlet-allocation-lda

Recommended Posts

[Apprentissage automatique] Regroupez les articles Yahoo News avec le modèle de sujet MLlib (LDA).
Catégoriser les articles de presse grâce au Deep Learning
[Apprentissage automatique] Classification des sujets LDA à l'aide de scikit-learn
Classer les informations liées à l'apprentissage automatique par modèle de sujet
Apprentissage automatique avec des images de catégorie Caffe -1 à l'aide du modèle de référence
Modèle d'apprentissage automatique prenant en compte la maintenabilité
L'apprentissage automatique appris avec Pokemon
Apprentissage automatique avec Python! Préparation
Démineur d'apprentissage automatique avec PyTorch
Commencer avec l'apprentissage automatique Python
Essayez le machine learning à la légère avec Kaggle
Gestion des modèles d'apprentissage automatique pour éviter de se quereller avec le côté commercial
J'ai essayé l'apprentissage automatique avec liblinear
Apprentissage automatique par python (1) Classification générale
SVM essayant l'apprentissage automatique avec scikit-learn
Analyse inverse du modèle d'apprentissage automatique
Machine learning d'inspiration quantique avec des réseaux de tenseurs
Validez le modèle d'entraînement avec Pylearn2
Démarrez avec l'apprentissage automatique avec SageMaker
Mémo d'apprentissage "Scraping & Machine Learning avec Python"
API REST du modèle réalisé avec Python avec Watson Machine Learning (édition CP4D)
J'ai essayé de visualiser le modèle avec la bibliothèque d'apprentissage automatique low-code "PyCaret"