LoginSignup
10
11

More than 5 years have passed since last update.

qiita記事にLDA・HDPを適用してみた

Last updated at Posted at 2018-10-04

はじめに

Qiitaの記事をクロールしてLatent Dirichlet AllocationとHierarchical Dirichlet Process適用します。

モチベーション

  • scrapy使ってみたかった
  • gensimでいろいろやってみたかった

対象文書

対象とする文書は、Qiitaの記事にします。APIが整備されておりクロールしやすく、文書量もあります。

先行事例

本文も使うとかタグだけで行うとかいろいろあります。とても参考にさせていただきました。

Qiita「非エンジニア」記事をトピック分類(scikit-learnのLDAが重くldaで比較編)
みなさん「いいね」は欲しいですか?Qiitaにて「いいね」を頂ける記事とは?を分析してみたよ
LDAによるトピックモデル with gensim ~ Qiitaのタグからユーザーの嗜好を考える ~
ScrapingしてLDA写経

環境

  • python 3.6.4
  • Scrapy 1.5.1
  • beautifulsoup4 4.6.0
  • gensim 3.5.0

Qiita APIを利用した記事のクロール

認証してない状態では、リクエスト制限がちょっと厳しいので、Qiita APIの認証認可を参照し、アクセストークンをゲットしておきます。
Qiita APIの投稿における/api/v2/itemsを使って、記事の一覧を取得します。
クローラは、scrapyを使います。下の記事を参考にしました。

作成したSpiderはこんな感じです。authorization_tokenに登録したトークンを入れてください。

qiita_spider.py
# -*- coding: utf-8 -*-

import scrapy
import json 

class QiitaSpider(scrapy.Spider):
    """
    Qiita から投稿記事の一覧を取得する
    実行例
    $ scrapy runspider qiita_spider.py -o items.jl
    """

    name = 'qiita_spider'
    authorization_token = '{{authorization_token}}'

    def __init__(self):
        self.max_page = 100
        self.per_page = 100

    custom_settings = {
        "DOWNLOAD_DELAY": 1,
        'FEED_EXPORT_ENCODING': 'utf-8'
    }

    def start_requests(self):
        """
        投稿の取得
        https://qiita.com/api/v2/docs#%E6%8A%95%E7%A8%BF
        per_page: 1~100, page: 1 ~ 100,
        query: 参照 https://blog.qiita.com/post/119489769284/advance-to-the-best-search
        """

        start_url = "https://qiita.com/api/v2/items/?page={}&per_page={}"

        headers = {'Authorization' : "Bearer {}".format(QiitaSpider.authorization_token) }

        for i in range(1, 1 + self.max_page):
            url = start_url.format(i, self.per_page)
            yield scrapy.Request(url = url, callback=self.parse, headers=headers)

    def parse( self, response ):
        json_response = json.loads(response.body_as_unicode())
        return json_response

APIを叩いて返ってきたJSONを取り出し、ガバッとJSONLで保存する、というような感じです。
継続的にクロールする予定はないので、以下のコマンドで実行します。ファイルには追記書き込みされるようなので予め削除しておくなど注意しましょう。

scrapy runspider qiita_spider.py -o items.jl

前処理

自然言語処理における前処理の種類とその威力をとても参考にさせていただきました。
ubuntu 18.04 に mecab をインストールを参考にmecabを入れておきます。

前処理の手順はこんな感じです。
1. JSONLで保存した記事の一覧のJSONから記事を取り出す
2. 記事の本文を取得
3. タイトル、タグ、記事本文を取り出し正規化
4. mecabでパースして、一般名詞、固有名詞だけ取り出す
5. gensimでDictionary, corpusを作る

前処理用の関数たち

import json
from bs4 import BeautifulSoup
import MeCab
import unicodedata
import re

def strip_html(html):
    """
    htmlからテキストを取り出す
    """
    soup = BeautifulSoup(html,  "lxml")
    # preタグ内はコードが多く、コード中に利用される単語は文書を表さないことが多いので消す
    for tag in soup.find_all('pre'):
        tag.decompose()
    text = ''.join(soup.findAll(text=True))

    return text

def parse_with_mecab(text):
    """
    mecabでパース
    固有名詞、一般名詞の表層のみ利用
    """
    mecab = MeCab.Tagger("mecabrc") 
    mecab.parse("")
    result = mecab.parseToNode(text)

    return_text = []
    while result:
        feature_info = result.feature.split(",")
        if feature_info[0] == '名詞' and feature_info[1] in ['固有名詞', '一般']:
            #return_text += feature_info[-3] + " " # 原型を利用するとき
            return_text.append(result.surface) # 表層を利用するとき
        result = result.next
    return return_text

def normalize(text):
    """
    テキストを正規化する
    unicode正規化と小文字にする
    参考: https://qiita.com/Hironsan/items/2466fe0f344115aff177
    """

    norm_text = unicodedata.normalize('NFKC', text)
    norm_text = norm_text.lower()
    return norm_text

def load_json_lines(filepath):
    """
    scrapyでクロールした.jlを読み込む
    """
    with open(filepath, 'r') as f:
        for i, line in enumerate(f):
            json_data = json.loads(line)
            yield json_data

stopwords = set(
    list('abcdefghijklmnopqrstuvwxyz') # 一文字の英語はどんなプログラミング言語でもよく使われるので
    + ['https', '.com', 'http', '()', '-2', '9.', 'or', 'and'] # ぱっと目についたワード
)
def stopword(text):
    return [ term for term in text if term not in stopwords ]

前処理

# データの取り出しと前処理
items = []
processed_url = set()

for line in load_json_lines('./items_qiita_latest_10000.jl'):
    url = line['url']
    title = line['title']
    likes_count = line['likes_count']
    created_at = line['created_at']
    tags = [tag['name']  for tag in line['tags'] ]

    # すでに読み込んでいたら無視する
    if url in processed_url:
        continue

    # 一定のいいね以上の記事を対象にする
    if likes_count < 5:
        continue

    # html文書からテキストを取り出す
    body = strip_html(line['rendered_body'])

    text = title + " " + " ".join(tags) + " " + body
    text = normalize(text)
    text = parse_with_mecab(text)
    text = stopword(text)

    print(title)
    print(created_at)
    print(url)
    print(tags)
    print(len(text))

    processed_url.add(url)

    items.append(
        {
            "url" : url,
            "title" : title,
            "text" :text,
            "created_at": created_at
        }
    )

Dictionaryを作る

gensimのチュートリアルを参考にします

from gensim.corpora import Dictionary

texts = [ item['text'] for item in items ]
dictionary = Dictionary(texts)
dictionary.filter_extremes(no_below=10, no_above=0.8)
corpus = [dictionary.doc2bow(text) for text in texts]

これで準備は整いました。
文書数は1078、特徴語の種類は2632くらいです

LDA

models.ldamodel – Latent Dirichlet Allocation
gensimでLDA

めっちゃ簡単に書けます。

import gensim

num_topics = 10
lda = gensim.models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=num_topics)

特徴語とともに各トピックのTop.Nの文書を確認。

import numpy as np
documents_topics = np.zeros([num_topics, len(corpus)])

for doc_id, c in enumerate(corpus):
    for topic_id, prob in lda.get_document_topics(c):
        documents_topics[topic_id][doc_id] = prob

for topic_id, probs in enumerate(documents_topics):
    print("==============")
    print("topic_id", topic_id, ":", lda.print_topic(topic_id))
    for doc_id in probs.argsort()[::-1][:10]:
        print("\t", probs[doc_id], items[doc_id]['title'], items[doc_id]['url'] )    

結果

==============
topic_id 0 : 0.010*"データ" + 0.009*"画像" + 0.009*"api" + 0.008*"情報" + 0.008*"変数" + 0.008*"コード" + 0.007*"docker" + 0.007*"github" + 0.006*"環境" + 0.006*"ファイル"
     0.9976372718811035 ClovaスキルからLINE BOTでメッセージを送信するまで(CEK SDK Node.js) https://qiita.com/Omoti/items/0d4d26524303100b19d9
     0.9974712133407593 [2018] 個人でも使える!おすすめAPI一覧 https://qiita.com/mikan3rd/items/ba4737023f08bb2ca161
     0.9972802400588989 Webスクレイピングマスターが教える「スクレイピング対策」@09/16追記 https://qiita.com/Azunyan1111/items/a1964c18e409fe6718fd
     0.9968523979187012 ClovaでLINEログインを使ってみる(アカウント連携) https://qiita.com/imajoriri/items/840a2e91dd8502b00bc1
     0.9968189597129822 RNN(LSTM)で藤井聡太と羽生善治と加藤一二三の将棋AI作ってみる〜フルスクラッチで挑戦!! https://qiita.com/MENDY/items/4bd3f3f87756461a31a4
     0.9967963099479675 じゃんけんグリコでDQN(deep Q-network)に挑む https://qiita.com/tanuk1647/items/7b8c2f0d09330cbfacd2
     0.9966902732849121 AlexaからLINE Botに通知してみる(ASK+Messaging API+LINEログイン+Social API) https://qiita.com/imajoriri/items/0e975b15b9023cafce24
     0.9963991045951843 【初心者向け】Unityで3Dシューティングを作るチュートリアル https://qiita.com/Getabako/items/f2d3f1f92f187ed77f31
     0.9958894848823547 Webアプリケーションのおすすめセキュリティ設定 https://qiita.com/fukushi_yoshikazu/items/1a746fc8c8663be18bf9
     0.9952116012573242 Mastodon向け簡易シェアボタン https://qiita.com/mod_poppo/items/d80ff225b4cc93318ee8
==============
topic_id 1 : 0.014*"コード" + 0.008*"python" + 0.007*"記事" + 0.007*"api" + 0.006*"アプリ" + 0.006*"エンジニア" + 0.006*"自分" + 0.005*"方法" + 0.005*"関数" + 0.004*"環境"
     0.9972043037414551 TokyoWesterns CTF 4th 2018 write-up https://qiita.com/kusano_k/items/9731a60a13273b320dea
     0.9971955418586731 はじめてのJavaFX ~簡単な導入Hello world的なGUI作成まで~ https://qiita.com/Kei_22/items/f54e6ba7cd4bf71b14c8
     0.9968851208686829 [中国金盾][VPN][ShadowsocksR][BBR] VPNを自分構築してみる https://qiita.com/nk0130/items/b81268ea94c144b4fa04
     0.9962334036827087 テスラのソフトウェアとデータを使ったイノベーションはなぜ破壊的なのか https://qiita.com/KanNishida/items/674368f3c12634adf346
     0.9962332844734192 Good Bye Vim. Hello VSCode. https://qiita.com/shimma/items/e6b3b8fd5a727897dcf4
     0.9956721067428589 SORACOM Kryptonのありがたみを感じてみる https://qiita.com/Kta-M/items/a5f4fa2aae7c3e27a3ac
     0.9951601624488831 ある規約違反 iOS アプリが削除されるまでの4日間 https://qiita.com/Watt/items/7d865713b9575d0daedf
     0.9946733117103577 Sequre ProでMySQLにログインできない https://qiita.com/r641y/items/7f0ca12ced72363f9448
     0.9939987063407898 おもちゃのプログラム検査器をつくる https://qiita.com/hatsugai/items/cf89a4a075f30715322e
     0.9937485456466675 高階トレイト境界とうまく付き合う https://qiita.com/ubnt_intrepid/items/1b0e58fbeb0c30e776ec
==============
topic_id 2 : 0.009*"関数" + 0.008*"コード" + 0.007*"ai" + 0.006*"ファイル" + 0.006*"データ" + 0.005*"値" + 0.005*"引数" + 0.005*"状態" + 0.005*"環境" + 0.005*"方法"
     0.9977035522460938 画像をきれいに拡大するAI「waifu2x」で、まとめて一括変換/動画対応版を作ってみた https://qiita.com/2zn01/items/d7d6e1bec4fc1d453aa1
     0.9951861500740051 [iOS][Swift4.1] YouTube動画一覧をNetflix風に無限スクロールして表示させる https://qiita.com/a_jike/items/3193dc7e765a1243d3b7
     0.9951338768005371 Elm 0.19で、Elmに速攻入門。 https://qiita.com/Nimimal/items/8a648ee3df760a382cf5
     0.9931800365447998 ソフトウェア設計についてのつぶやき https://qiita.com/BlueEventHorizon/items/7b8dcf625ff5790ed1ef
     0.9923059940338135 Scala用DIコンテナ airframeの使い方 https://qiita.com/j5ik2o/items/114c0c623b6ca0e71963
     0.9916647672653198 【java】アルファベット1種禁止縛りでHello, world!【縛り】 https://qiita.com/ki_ki33/items/319e2cda34df77c945f2
     0.9907193779945374 Xcode10からマルチカーソル機能が使えるようになったぞ https://qiita.com/pelican/items/735f191857500c11e140
     0.9865642786026001 今勢いのある言語 Elm https://qiita.com/ababup1192/items/c48df0495728f89f756a
     0.9769176840782166 Qiitaのデザインがまた改悪された https://qiita.com/rana_kualu/items/f10a807b9bc6838dd2e2
     0.9756691455841064 Androidの連打防機構、およびOSの不具合と言い張れなくもないなにか https://qiita.com/nekomimi-daimao/items/9691f9e3b64c8a657315
==============
topic_id 3 : 0.013*"python" + 0.009*"コード" + 0.008*"データ" + 0.008*"関数" + 0.007*"記事" + 0.007*"人" + 0.007*"javascript" + 0.006*"エンジニア" + 0.006*"ファイル" + 0.005*"値"
     0.9985687136650085 Systemd かつ UEFI boot な Linux で Swap をOffにする方法 ~  fstab が全てとは限らない https://qiita.com/10yama/items/1ab36a638c6e5c11c136
     0.9964137673377991 フリーランスエンジニアに関する5つの誤解 https://qiita.com/poly_soft/items/c494f3df80738a3daf1c
     0.9963750839233398 マラソンを支える技術 https://qiita.com/kurimoto/items/17f573c8e9627f42f8b9
     0.9957132339477539 5分でブロックを理解し、ラムダでオシャレに書いてみるチュートリアル https://qiita.com/Tsutou/items/092c5facf910d79e7aa7
     0.9955434799194336 320ページ、30万字、図165枚の技術書「はじめてのディープラーニング」をどのように執筆したのか? https://qiita.com/yuky_az/items/e53415526d8798f0a7e7
     0.995453417301178 【35歳プログラミング未経験者】が暗号通貨エンジニアに転職するためにしたこと https://qiita.com/adrenaline0206/items/24157ed2a4587cec3c40
     0.9951074719429016 枯れ果てた開発者の心のバケツ https://qiita.com/rana_kualu/items/a033d3df87e022d0c456
     0.9944086670875549 最近話題の ノンコーディング について考えてみた https://qiita.com/yugoes1021/items/debce542cdcca2901117
     0.993615448474884 25歳初めてのフリーランスエンジニアの単価について https://qiita.com/turmericN/items/a73d005e8bf4700bbb37
     0.9927982091903687 DynamoDBを使うサーバーレス設計で失敗した https://qiita.com/okamu_/items/f8d6064e3179bca27c3f
==============
topic_id 4 : 0.019*"データ" + 0.011*"コード" + 0.008*"docker" + 0.008*"記事" + 0.007*"インストール" + 0.007*"ファイル" + 0.007*"環境" + 0.007*"関数" + 0.006*"コマンド" + 0.006*"方法"
     0.9977439045906067 オススメ!1600円の無線(BLE)温度センサーをRaspberry Pi3 + node-redで活用する https://qiita.com/tinoue@github/items/be50b80c7d6bb107a00c
     0.9972554445266724 Jupyter/Python上でたった3行でインタラクティブなチャート・ウィジェットを作れる!PixieDustを触ってみた https://qiita.com/ishida330/items/36f31f224b230cb8f655
     0.9969993233680725 いまさらのDocker 入門 HandsOn https://qiita.com/quconomy/items/d4ae64759f5acc035826
     0.9964278340339661 【初心者】必要最低限なDockerのコンテナ立ち上げまでの知識をまとめてみた https://qiita.com/hassium0930/items/9eee56e91657f012c8ba
     0.9962491989135742 Docker pull commit push Dockerfile WordPress環境をつくる~Docker Compose~ 新コマンド編 https://qiita.com/cyberblack28/items/76cde5637fa1e58cc85a
     0.9958705902099609 @babel/pluginのloose/specモードについてまとめ https://qiita.com/jkr_2255/items/b7024c4984b69787d9c9
     0.995211660861969 【Unity2018】マップの経路探索をC# Job Systemにやってもらう https://qiita.com/pio/items/42803acdd90172f1ec25
     0.9941921830177307 CDS for Apps を試しに使うには https://qiita.com/yugoes1021/items/98c8a3504ac72c7fb5be
     0.9938759207725525 Scoped Modelの基本的な使い方(Flutter) https://qiita.com/hayassh/items/690fa0d6528e056617b5
     0.9935237169265747 Sourcetree + gitでMIDI音楽制作のデータ管理は出来るか https://qiita.com/cassetteTape/items/1d562528d9a3bed3b423
==============
topic_id 5 : 0.011*"記事" + 0.009*"関数" + 0.008*"環境" + 0.007*"方法" + 0.007*"コード" + 0.007*"例" + 0.007*"型" + 0.006*"ファイル" + 0.006*"unity" + 0.005*"html"
     0.9981127977371216 Unity Recorder の使い方 https://qiita.com/tan-y/items/644760a18484cbe71d43
     0.9980682730674744 Linuxカーネルの独自パッチのメンテに関する検討メモ https://qiita.com/mhiramat/items/f0a26b9cc07206a15286
     0.9975845813751221 What is TypeScript?! https://qiita.com/maeda_88/items/6cbde624b5b55f073cfa
     0.9968633055686951 オールRubyでフロントエンド開発を夢見て <デモあり> https://qiita.com/noontage/items/f4a9d512c6e709ea38df
     0.9960166215896606 Unity 3DでUpdateとFixedUpdate間のタイミングを考慮したジャンプ(基礎) https://qiita.com/mkgask/items/6d04d0be13cc0b14d4fb
     0.9952369928359985 linuxカーネルに関する独自コードをメンテナンスするコスト https://qiita.com/satoru_takeuchi/items/98b6115b8ff271f8b0d1
     0.9947047233581543 [Unity]ドローコールを増やさずにColorブレンドタイプの異なるUIを描画する  https://qiita.com/mochi5420/items/913f65c948faf2129f5f
     0.9943231344223022 【配布】msiファイルのインストールの面倒さをなんとかする https://qiita.com/trackiss/items/3f46c72b720b73bda4ca
     0.9941545128822327 TypeScriptで高カインド型(Higher kinded types) https://qiita.com/kgtkr/items/281b634987220d1d1ed5
     0.993998646736145 Unity 2018 Timeline を使ってユニティちゃんを走らせてみた https://qiita.com/kingyo222/items/793e3f3b5d61b76a1af8
==============
topic_id 6 : 0.012*"コード" + 0.011*"関数" + 0.009*"api" + 0.008*"記事" + 0.008*"ファイル" + 0.007*"方法" + 0.007*"情報" + 0.006*"コマンド" + 0.006*"python" + 0.006*"メソッド"
     0.9984207153320312 【AWSでサイト制作3】Cloud9×RailsでHello World! https://qiita.com/HitomiHoshisaki/items/6a0cd17cbe57eb03277e
     0.9978868961334229  MonorepoBuilderでPHPのモノレポを作るチュートリアル https://qiita.com/suin/items/421a55bdb009b2ada2d1
     0.9977495074272156 LaravelをElastic BeanstalkからFargateに移行しました https://qiita.com/hareku/items/73f7730c1adc01bbe5a0
     0.9974854588508606 Goアプリケーションの設定情報をTOML・環境変数に格納する https://qiita.com/Khigashiguchi/items/525a5920b3953bfbf5fa
     0.9974641799926758 LaravelアプリケーションをローカルでもAWSでもDockerで動かす https://qiita.com/imunew/items/1e4826030d725beb4710
     0.9974570274353027 GitHubを楽しく使おう https://qiita.com/mochisuna/items/8cdab33f2f903817cc92
     0.997398316860199 Goの新定番?ORMのSQLBoilerを使ってみる https://qiita.com/uhey22e/items/640a4ae861d123b15b53
     0.9962490797042847 Go 2のgenerics/contract簡易まとめ https://qiita.com/lufia/items/242d25e8c93d88e22a2e
     0.995693027973175 【Firebase】Cloud Functionsで学ぶPromiseとasync/await https://qiita.com/samuraikun/items/40f1ce951931d1b26b62
     0.9947357177734375 Template Haskellでコンパイル時にFizzBuzz https://qiita.com/YoshikuniJujo/items/a8373c1bd1986ced9d5d
==============
topic_id 7 : 0.027*"js" + 0.011*"コード" + 0.010*"ファイル" + 0.010*"react" + 0.007*"画面" + 0.007*"コンポーネント" + 0.007*"html" + 0.006*"github" + 0.006*"記事" + 0.006*"プロジェクト"
     0.9993011355400085 今から始めるReact入門 〜 React の基本 https://qiita.com/TsutomuNakamura/items/72d8cf9f07a5a30be048
     0.9990583658218384 Vue.jsとNuxt.jsを使っていて、どっちのドキュメントを見ればいいんだ?ってなったときのために機能を整理する。 https://qiita.com/noplan1989/items/eae57372e2fd360438e0
     0.9988293647766113 Reactで誰もがやりたかった10の機能。アプリ構想はあるけど作れない人の壁をぶっ壊す。 https://qiita.com/y_kawase/items/8f1b5a303400a09c4923
     0.9983632564544678 Vue.js(Vuetify)とFirebaseで簡単なブログを公開して、ちょっとテストも書く https://qiita.com/naoki85/items/1eb370c2bf64aaebf6d0
     0.997814953327179 React Native をプロダクションで使ってわかった良かった点・悪かった点 https://qiita.com/nakanishy/items/9b8bb8fe5bee6a6c677b
     0.9974854588508606 Railsで remote: true と js.erbを使って簡単にAjax(非同期通信)を実装しよう!(いいね機能のデモ付) https://qiita.com/__tambo__/items/45211df065e0c037d032
     0.9974058270454407 React開発環境構築2018 https://qiita.com/tsin1rou/items/6e4ee70b309cc266dcc9
     0.997229278087616 Vue vuexでfirebaseのログイン保持 https://qiita.com/ErgoFriend/items/bd1bb445e185bf45e272
     0.9967849850654602 webpack+VSCodeで、Vanilla JS+Canvas APIの簡単なゲーム開発準備 https://qiita.com/suzuki_sh/items/a86628b1e729cc9b79b8
     0.996590256690979 Nuxtで言語別ルーティングを実装する https://qiita.com/miyaoka/items/1468b7c3f6ec86f35f03
==============
topic_id 8 : 0.014*"画像" + 0.014*"データ" + 0.009*"方法" + 0.008*"コード" + 0.008*"ベクトル" + 0.007*"関数" + 0.007*"記事" + 0.006*"モデル" + 0.006*"情報" + 0.006*"値"
     0.9990603923797607 QISKit でJones 多項式の量子アルゴリズム https://qiita.com/SelMut/items/8aa2a9a21b39da2bd28d
     0.9988293647766113 「詳解OpenCV3」の備忘録 https://qiita.com/mocobt/items/67cb6d38c795d53800b7
     0.9985802173614502 【理論とイメージ】CNNの誤差逆伝播とDeconvolutionまとめ https://qiita.com/bukei_student/items/a3d1bcd429f99942ace4
     0.9985122680664062 CGのための線形代数入門 ベクトル編 https://qiita.com/mebiusbox2/items/172131bf95da172d1371
     0.997995138168335 Openposeの3D化に関する調査 https://qiita.com/tonouchi510/items/390b98a4db669168d662
     0.9978359937667847 Pythonを使って固定視点画像からデジタル数字を抽出する https://qiita.com/skotaro/items/082bfd9d42a02ce90817
     0.9973048567771912 iOS 10以降のApple Color Emojiで使用される独自画像フォーマット"emjc"の仕様解析とデコーダ公開について https://qiita.com/496_/items/80cfc03ad2ed26c2ab52
     0.9972044229507446 CGのためのフーリエ解析入門 フーリエ級数編 https://qiita.com/mebiusbox2/items/657df6e458d85303e50d
     0.9969995021820068 CGのための線形代数入門 行列式編 https://qiita.com/mebiusbox2/items/191dcbead5d927f9b557
     0.9969586730003357 ボロノイと点列の生成のはなし(1) https://qiita.com/shinjiogaki/items/df433279497bcc580f11
==============
topic_id 9 : 0.011*"ファイル" + 0.009*"データ" + 0.008*"クラス" + 0.007*"画像" + 0.007*"環境" + 0.007*"php" + 0.006*"コード" + 0.005*"cloud" + 0.005*"関数" + 0.005*"情報"
     0.9993606805801392 CNCF Blog 2018年の記事一覧 https://qiita.com/zembutsu/items/5d1dba7e1b42c31a79ab
     0.998442530632019 [Unity 2018.2] AssetBundleのキャッシュを完全に理解する https://qiita.com/k7a/items/23d909ffeea3bab7dfcb
     0.9976494908332825 OculusGo用の個人制作ゲームをストアリリース ~ストア審査はパフォーマンス確保との闘い~ https://qiita.com/hoke946/items/fce024d6867dd35cef4a
     0.9971781969070435 Laravelコードリーディング - Laravel5.7のEmail Verificationを読む https://qiita.com/yamaji_daisuke/items/731868a4de6037794976
     0.9967619776725769 Laravel5.7 対応版 掲示板作成チュートリアル windows版 xammp使用 https://qiita.com/yoshi123/items/c76718f8b689b46fe403
     0.9964697957038879 VRをはじめましょう https://qiita.com/h-yamasaki/items/722fcbbd79079eccf5b0
     0.9964278936386108 Flutterウィークリー #33 https://qiita.com/aoinakanishi/items/f735beaf9765a77b3e00
     0.9961531758308411 We don't need Peano Numbers in PureScript https://qiita.com/kimagure/items/522fa4dd4abdcc313c8e
     0.9947965145111084 Flutterウィークリー #32 https://qiita.com/aoinakanishi/items/ee61998f67d9e2404481
     0.9945442080497742 GAE/SE PHP 7.2 標準で提供されていない拡張を使用する https://qiita.com/kunit/items/649e7dfd37d354574f01

うーん。イマイチ解釈しづらいですね。利用する語を絞ったり、結構試行錯誤しましたがなかなかうまく行きません。

HDP

models.hdpmodel – Hierarchical Dirichlet Process

HDPの説明はこちらに譲ります。
Hierarchical Dirichlet Processに関するメモ
GensimのHDP(Hierarchical Dirichlet Process)をクラシック音楽情報に対して試してみる
階層ディリクレ過程を実装してみる (1) HDP-LDA と LDA のモデルを比較

これも簡単。

hdp = gensim.models.HdpModel(corpus, dictionary, random_state=1)

LDAと同じくTop.Nを確認

import numpy as np
documents_topics = np.zeros([hdp.m_T, len(corpus)])

for doc_id,c in enumerate(corpus):
    for topic_id, prob in hdp[c]:
        documents_topics[topic_id][doc_id] = prob

for topic_id, probs in enumerate(documents_topics):
    print("==============")
    print("topic_id", topic_id, ":", hdp.print_topic(topic_id))
    print("len nonzero: ", len(probs.nonzero()[0]))
    for doc_id in probs.argsort()[::-1][:10]:
        print("\t", probs[doc_id], items[doc_id]['title'], items[doc_id]['url'] )    

結果(上位10トピックだけ)

==============
topic_id 0 : 0.007*"音" + 0.007*"図" + 0.007*"ファイル" + 0.006*"画像" + 0.006*"記事" + 0.005*"コード" + 0.005*"方法" + 0.005*"環境" + 0.005*"html" + 0.005*"データ"
len nonzero:  707
     0.9998134459992689 AudioUnit(iOS)を20個以上用いて「ラウドネス周波数特性補正付き音楽再生アプリ」を独学で造り上げた奮闘記 https://qiita.com/Try-Jizy/items/178aefe3f06a634064ca
     0.9991446826496375 Djangoでショッピングカートを作ろう! https://qiita.com/__init__/items/37375d60256014fc93f0
     0.9988666993006964 SSL/TLSの見落とされがちな「認証」という基本機能 https://qiita.com/angel_p_57/items/dcb12a6a864f9aeba427
     0.998825590664275 Eclipse+Tomcatでhttp2開発環境構築してみた https://qiita.com/usankusai/items/677126cdb45bfac0e260
     0.998697367082317 驚くほど無料で一瞬でWordPressを用いたブログ環境を構築できた話 https://qiita.com/fuwamaki/items/8684003bb47197336645
     0.9984439842566974 Gitlab(Runner、Container Registry)+AnsibleでローカルにCI環境を作ってみる https://qiita.com/comefigo/items/d5c4d3f61edd30ba46ee
     0.9982198903721987 あなたのサイトのjpeg画像は過剰品質である。多分。 https://qiita.com/masato_makino/items/28cc2d82d66dbdb12d9a
     0.9981005700092349 Goアプリケーションの設定情報をTOML・環境変数に格納する https://qiita.com/Khigashiguchi/items/525a5920b3953bfbf5fa
     0.9979205179888316 Red Hat Decision Manager - Decision Serverにルールをデプロイして呼び出す -  https://qiita.com/Erina/items/f134d69028389798306c
     0.9978815816850141 はじめてのJavaFX ~簡単な導入Hello world的なGUI作成まで~ https://qiita.com/Kei_22/items/f54e6ba7cd4bf71b14c8
==============
topic_id 1 : 0.010*"画像" + 0.009*"データ" + 0.008*"python" + 0.007*"値" + 0.007*"byte" + 0.007*"ベクトル" + 0.007*"コード" + 0.007*"記事" + 0.006*"関数" + 0.006*"文字列"
len nonzero:  393
     0.9996266135766766 AtCoder Beginner ContestのA問題の最短コードを読む https://qiita.com/kotatsugame/items/184bfd63d9b21f214475
     0.9993524852196625 AtCoder Beginner ContestのB問題の最短コードを読む(001-020) https://qiita.com/kotatsugame/items/a1703bba780717897bf6
     0.9987184177767583 GHC.List を読んで Haskell のリスト操作をまとめた https://qiita.com/7ma7X/items/8cee82377587058ff0c3
     0.9986768370062346 初心者のための測度論的確率論 ~ Pythonコードを添えて ~ https://qiita.com/sasakinzm/items/429a9fc629aa04880a02
     0.9984973819947739 CGのための線形代数入門 ベクトル編 https://qiita.com/mebiusbox2/items/172131bf95da172d1371
     0.9979891322163557 どこでもドアを作ってみた物語 https://qiita.com/youwht/items/8ca57766a991371c1cfe
     0.9975791664820546 モンティ・ホール問題をゲーム化してDQNにプレーさせてみた https://qiita.com/tanuk1647/items/c5a27f618b7876f92de0
     0.9971953420540776 iOS 10以降のApple Color Emojiで使用される独自画像フォーマット"emjc"の仕様解析とデコーダ公開について https://qiita.com/496_/items/80cfc03ad2ed26c2ab52
     0.9969720484911926 CGのための線形代数入門 行列式編 https://qiita.com/mebiusbox2/items/191dcbead5d927f9b557
     0.9966888589524496 モンティ・ホール問題を機械学習(強化学習)で解く https://qiita.com/tanuk1647/items/bd85b7db2176dcff9511
==============
topic_id 2 : 0.015*"js" + 0.008*"react" + 0.007*"vue" + 0.007*"データ" + 0.006*"コード" + 0.005*"html" + 0.005*"redux" + 0.004*"コンポーネント" + 0.004*"メソッド" + 0.004*"github"
len nonzero:  228
     0.998976245078596 Vue.jsとNuxt.jsを使っていて、どっちのドキュメントを見ればいいんだ?ってなったときのために機能を整理する。 https://qiita.com/noplan1989/items/eae57372e2fd360438e0
     0.9983164435838847 Redux と React Context API - 適材適所のススメ https://qiita.com/ossan-engineer/items/c3e5bd4d9bb4db04f80d
     0.9977849329271793 ClojureScript による SPA のモジュール分割 https://qiita.com/223kazuki/items/dd1af292a644e95a3085
     0.9975038955595372 Vue vuexでfirebaseのログイン保持 https://qiita.com/ErgoFriend/items/bd1bb445e185bf45e272
     0.995911557451434 Angular入門 未経験から1ヶ月でサービス作れるようにする その9. カスタムバリデーション https://qiita.com/seteen/items/d9aad2edf6c795a135a7
     0.9957898814081961 ReactJSとReduxの単体テストを'きちん'と書く https://qiita.com/teradonburi/items/8a7a3149b293844a6edd
     0.9955296512314911 @babel/pluginのloose/specモードについてまとめ https://qiita.com/jkr_2255/items/b7024c4984b69787d9c9
     0.9955211790523937 React Redux の難しかった点をできるだけシンプルに図解 https://qiita.com/suzukenz/items/40afe717029c2f8f4a54
     0.9952569626920724 テストケース自動生成器をつくる https://qiita.com/hatsugai/items/666314bbe85ca6b93755
     0.9950049031707187 SEO対策をサーバーサイドレンダリングせずにやっていく https://qiita.com/otakumesi/items/9dc8dbb1b66dd3e412f2
==============
topic_id 3 : 0.008*"アプリ" + 0.005*"react" + 0.005*"サーバー" + 0.004*"自分" + 0.004*"データ" + 0.004*"画像" + 0.004*"js" + 0.004*"web" + 0.004*"人" + 0.003*"コード"
len nonzero:  142
     0.9984019827903402 IT業界1年未満のエンジニアに紹介したいキャリアアップケース5選 https://qiita.com/kakiuchis/items/e04f39ae8bd214ca0bb7
     0.9964826814355819 Firebaseを使い始めたら人生が変わった(ような気がした) https://qiita.com/owen/items/c51c6ec27c9e2f5804b0
     0.9949176867246188 Cloud Functions with Puppeteer + Google Apps Script でスクレイピングサーバーをサクッと作る https://qiita.com/howdy39/items/2f355fea8340a35aa5da
     0.9884296498380775 Firebaseで失敗した https://qiita.com/okamu_/items/4a616da7f7dc8aa011aa
     0.9883916317155585 Bancor Protocolの価格調整アルゴリズムをPythonでシミュレーションしてみた https://qiita.com/ym3141592/items/11a191713b781e083919
     0.9502181656978518 【Swift, Firebase】究極の瞑想アプリを作った話 https://qiita.com/okamu_/items/a65ddf5c15787c0103ba
     0.946433437056745 Nuxt.js, Firebase, Stripe をフル活用してサーバーレスでJAMStackなECサイトを2日で開発した話 https://qiita.com/potato4d/items/13050d5934ff592dc539
     0.9202487904896819 日本最大級の青少年団体のイベントアプリを開発・運用した話 https://qiita.com/07JP27/items/7eb000c8e50b56ce8d08
     0.9088301787206098 まともにコードが書けない大手SIerエンジニアが60万ダウンロードの大ヒットAndroidアプリを作った物語 https://qiita.com/hamham/items/c3904f4b1e22aea0c2d8
     0.9015357550809441 全部iOSにしゃべらせちゃうLTを支えた技術 https://qiita.com/hironytic/items/3476f0c50da5eae2ec7d
==============
topic_id 4 : 0.006*"コード" + 0.006*"python" + 0.005*"ゲーム" + 0.005*"javascript" + 0.004*"関数" + 0.004*"react" + 0.004*"インスタンス" + 0.004*"データ" + 0.004*"web" + 0.003*"3d"
len nonzero:  112
     0.9933609720710893 オールRubyでフロントエンド開発を夢見て <デモあり> https://qiita.com/noontage/items/f4a9d512c6e709ea38df
     0.99320315399996 ゲーム業界にあこがれているプログラマ志望の学生さんたちに贈るメモ https://qiita.com/akehoyayoi/items/1c6ec8506d926b33875a
     0.9923466304326151 python初心者でもたった1時間でスクレイピングができるようになるまで(mac用) https://qiita.com/n_oshiumi/items/5adf4dcd2219e86d400b
     0.9918142191196566 PyGameでシンプルなゲームの作成(Python) https://qiita.com/KMim/items/24a1d69833bc335779a4
     0.990476893021604 chrome-extension-webpack-boilerplate で手早く Chrome 拡張機能の開発環境準備 https://qiita.com/gotchane/items/8d5b380ccd079112c03f
     0.9839780121936565 Webスクレイピングするなら何言語?Python、Ruby、またはJavaScript? https://qiita.com/Octoparse_Japan/items/14304b5bd9fb84945ec3
     0.9781302514987934 【Unity】~SIerからゲーム業界へ~ 第1回 概要 https://qiita.com/straycatz/items/2bbadf169f2fde5371f1
     0.9426516955540701 実はReact Native公式ドキュメントでReact Native for Webが使われている https://qiita.com/Nkzn/items/93688d39ab94d16e64e8
     0.937306804962639 Twitterのツイートを分析して、どういうツイートがRTされやすいのか分析してみた https://qiita.com/kkdmgs110/items/8e2074d4e70339a1ccb5
     0.9281871016934543 堅牢で保守的な最低限度の CSS https://qiita.com/toshifumiimanishi/items/289ff7a44054bcc39b09
==============
topic_id 5 : 0.007*"コード" + 0.007*"関数" + 0.006*"変数" + 0.005*"python" + 0.005*"情報" + 0.004*"値" + 0.004*"クラス" + 0.004*"ライブラリ" + 0.004*"メソッド" + 0.004*"画像"
len nonzero:  130
     0.9988173369336765 KotlinとJavaができる人向けDart速習 https://qiita.com/kikuchy/items/2cce118d38fc15324b2b
     0.9971129260171738 [C#] 配列やList<T>を直接公開する代わりにするべきこと https://qiita.com/laughter/items/b5e91d0eac5bac208d35
     0.9953355971721969 [C#]絶対名前空間を使ってはいけないC# https://qiita.com/yaegaki/items/312780b534592a98a17c
     0.9951513566875891 もう間違えない! Cloud Firestore rulesのresource, request.resource, writeFields https://qiita.com/sgr-ksmt/items/a551251035f29ede2258
     0.9947416469843301 1から自作キーボードを作ってみた https://qiita.com/kamaboko123/items/c32ad91434ffc7f4ff8d
     0.9945983109832977 酒飲みがJavaScriptで個人的に気をつけている所 https://qiita.com/sakurasumizome/items/5df8477423659e969a90
     0.9915792504999807 【決定版】GAS で Gmail の検索結果をスプレッドシートに抽出する方法 https://qiita.com/tanabee/items/17eb721801eff8d97db9
     0.9846401079083618 Task.Runでクロージャを使うと意図しない挙動を取ることがある(追記あり) https://qiita.com/NetSeed/items/373639164db38e309773
     0.9658122150310621 【Unity】.NET 4.6以降にて列挙型をキーとしたDictionaryは普通に速い https://qiita.com/goropocha/items/9c58d4f163c1e409a3fd
     0.9596353496738012 pythonで並行処理を実行させて、それぞれの結果の値を取得する https://qiita.com/fumihiko-hidaka/items/5745468e1588b39fbf5f
==============
topic_id 6 : 0.006*"docker" + 0.005*"自分" + 0.004*"エンジニア" + 0.004*"データ" + 0.004*"方法" + 0.004*"記事" + 0.004*"コード" + 0.004*"ソフトウェア" + 0.003*"システム" + 0.003*"コンテナ"
len nonzero:  101
     0.9987008296462044 'The human scalability of “DevOps”' by Matt Klein の日本語訳 https://qiita.com/seikoudoku2000/items/ab8da70b7237d5930f34
     0.9978267683025127 Linuxカーネルの独自パッチのメンテに関する検討メモ https://qiita.com/mhiramat/items/f0a26b9cc07206a15286
     0.9956358060493254 テスラのソフトウェアとデータを使ったイノベーションはなぜ破壊的なのか https://qiita.com/KanNishida/items/674368f3c12634adf346
     0.9912935857522661 Golangの超シンプル構成webアプリをDockerで起動するところまで https://qiita.com/nitt_san/items/6cba1e422dcdd6098f06
     0.9820366014650251 VagrantとDockerの使い分けについてまとめてみた https://qiita.com/ti39dx/items/907cec70f59dd7886958
     0.9020894632129133 業務外で自分にコードを書かせたくて、別人格「おじさん」にタスクを指示してもらうことにした https://qiita.com/cuhey3/items/4cec3757f378d93e488b
     0.885266636441153 SORACOM Kryptonのありがたみを感じてみる https://qiita.com/Kta-M/items/a5f4fa2aae7c3e27a3ac
     0.8789158890294558 mockmock × AWS IoT Core × Lambda を試してみる https://qiita.com/ryo_naka/items/feaeee2918bbdd2036e6
     0.855282388387367 【Golang】goプロジェクトにオニオンアーキテクチャを導入した https://qiita.com/nanamen/items/f37d1047368929e377fd
     0.8393499622510266 【翻訳】なぜ開発者は文章の書き方を学ぶべきなのか? https://qiita.com/mariatapia/items/141f9ce8cc0b4af24047
==============
topic_id 7 : 0.008*"docker" + 0.004*"環境" + 0.004*"コンテナ" + 0.004*"コマンド" + 0.004*"人" + 0.004*"インストール" + 0.004*"情報" + 0.003*"コード" + 0.003*"記事" + 0.003*"ファイル"
len nonzero:  108
     0.9940634362130661 ansible_specを利用してAnsibleとServerspecを同一ディレクトリで管理してみる https://qiita.com/n-tanimoto/items/7d2a902689d83443b6e2
     0.9924772857650263 iOSアプリをOSSにして一週間、良かったこと・悪かったこと https://qiita.com/mitsumasa/items/4a95d3944a65c25bd8ad
     0.9636288482286262 Docker MachineとVMware FusionでmacosにDocker環境を構築する https://qiita.com/reoring/items/73351f5d2d4292a24305
     0.9557777833994355 【初心者】必要最低限なDockerのコンテナ立ち上げまでの知識をまとめてみた https://qiita.com/hassium0930/items/9eee56e91657f012c8ba
     0.9436988407268543 伝わる文章スタイルガイド https://qiita.com/kodera123/items/d687e5f979b0b30a8104
     0.9410925516281796 Docker pull commit push Dockerfile WordPress環境をつくる~Docker Compose~ 新コマンド編 https://qiita.com/cyberblack28/items/76cde5637fa1e58cc85a
     0.917590376992803 【35歳プログラミング未経験者】が暗号通貨エンジニアに転職するためにしたこと https://qiita.com/adrenaline0206/items/24157ed2a4587cec3c40
     0.9103795553489833 フリーランスエンジニアの単価を決める https://qiita.com/KazukiTanaka/items/130a2c477847b24e35ce
     0.8874472339723513 速記:アーキテクチャ ディスカッション Vol.1ディスカッション議事録 #iiLoveArch https://qiita.com/Khigashiguchi/items/f384bdf9b73c8180da00
     0.8473014764375449 var_dump、var_export、print_r、デバッグ時に使うのがベストなのはどれ!? https://qiita.com/awesam86/items/1103079594fefc8e9f3f
==============
topic_id 8 : 0.006*"キャッシュ" + 0.005*"コード" + 0.005*"クラス" + 0.005*"ファイル" + 0.005*"view" + 0.005*"型" + 0.004*"データ" + 0.004*"js" + 0.004*"docker" + 0.004*"関数"
len nonzero:  87
     0.9982233805818302 [Unity 2018.2] AssetBundleのキャッシュを完全に理解する https://qiita.com/k7a/items/23d909ffeea3bab7dfcb
     0.997599144546765 What is TypeScript?! https://qiita.com/maeda_88/items/6cbde624b5b55f073cfa
     0.9974605306506176 [検出レート約30FPS] RaspberryPi3 Model B(プラスなし) で TX2 "より少し遅い" MobilenetSSDの物体検出レートを獲得しつつ MultiModel (VOC+WIDER FACE) に対応する https://qiita.com/PINTO/items/190daa4fddfd2a21f959
     0.9889044416626305 SlackのAPI経由でのメンションの仕様変更(2018/9/12~) https://qiita.com/gimKondo/items/99ba9b05d14a6b49df68
     0.9132930307102691 XIBからViewを生成する4つの実装パターン https://qiita.com/marty-suzuki/items/7c7ecdcb1f16c21b0051
     0.8553544046572332 サマータイムに対応したかった(Windows+C#編) https://qiita.com/rawr/items/f18d8a9fdf0ca74ba48c
     0.8205700278711993 UnityでLive2D https://qiita.com/ayumegu/items/f3dde0384b1e3f7f0d24
     0.8197780740938927 Amazon EFS 東京リージョンの限界を試す https://qiita.com/zakky/items/08e6aa876f24bda69eb1
     0.7876510755437102 SQL文字列を構築するベストではないかもしれないがベターなプラクティス(VB.NET) https://qiita.com/jun1s/items/28941e463ca33f722266
     0.7290470796588288 Railsで remote: true と js.erbを使って簡単にAjax(非同期通信)を実装しよう!(いいね機能のデモ付) https://qiita.com/__tambo__/items/45211df065e0c037d032
==============
topic_id 9 : 0.011*"クラス" + 0.009*"オブジェクト" + 0.007*"メソッド" + 0.006*"パターン" + 0.005*"コード" + 0.004*"データ" + 0.004*"変数" + 0.004*"方法" + 0.003*"ファイル" + 0.003*"node"
len nonzero:  67
     0.9994004358099783 Rubyによるデザインパターンまとめ https://qiita.com/yuji_ariyasu/items/588fef6062b3c7149509
     0.9873326762443403 オススメ!1600円の無線(BLE)温度センサーをRaspberry Pi3 + node-redで活用する https://qiita.com/tinoue@github/items/be50b80c7d6bb107a00c
     0.9099105645785512 Azure REST API を Postman で操作する https://qiita.com/TsuyoshiUshio@github/items/76edcc19ee4193a1ce6a
     0.7681345838337805 Vueのアニメーションが凄い https://qiita.com/wintyo/items/7aa0b52c101ec31637b4
     0.7671232226739837 「SGDR: Stochastic Gradient Descent with Warm Restarts」をちょっと改良してKerasで実装した https://qiita.com/koshian2/items/4c27c887438a52062d97
     0.7664796662191767 Unity 3DでUpdateとFixedUpdate間のタイミングを考慮したジャンプ(基礎) https://qiita.com/mkgask/items/6d04d0be13cc0b14d4fb
     0.5977066005456876 「データ前処理」-  Kaggle人気チュートリアル https://qiita.com/hokuto_HIRANO/items/12e046b3e02961d8460d
     0.5869000565488413 JavaScriptのオブジェクトって難しすぎませんか…? https://qiita.com/saoshi/items/f93769412403364c1d2a
     0.5823866937373715 ITリテラシーが(多分)古めの職場環境でちょっとした変更で社内の運用が大幅に改善した話。 https://qiita.com/yamuuuuuun/items/1a6511c4e251918d1481
     0.5486794850558759 RowToListで型プログラミングをやってみた話 https://qiita.com/acple@github/items/6f062f03bbdb0abed36d

LDAでうまくトピックにわけられてないから当たり前ですが、解釈難しいですね。

考えたこと

  • 「技術のポエム」とか「やってみた系」とか「インフラまわり」とか「データ分析」とか「フロントエンド」とかでいい感じにまとまるかと思って期待していましたが、技術分野に偏っているため、適当なトピックが出てこなくて厳しい。例えば「コード」とか「データ」とかの単語はどんなトピックでも利用されているし、pythonもWebやらデータ分析やらなにやらで使われている単語がそれぞれで似過ぎてるのが原因だろうか
  • 「ニュース」とか「スポーツ」とか「論文」とか幅広いトピックで使うべきか
  • 技術分野に特化したストップワードのリストとか作れないかな
  • scrapy, gensim便利
  • Dynamic Topic Model使ってみたい
10
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
11