935
890

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

AIが芋぀けた、埋もれたQiita良蚘事100遞

935
Last updated at Posted at 2018-07-11

背景

Qiita殿堂入り蚘事、ず、぀の「驚愕」

良い蚘事なんだけどなかなかいいねが぀かなかった蚘事を、
AIによっお発掘したいずいう詊み。
たたは、機械によっお「いいね」かどうか刀断させたり、
䜕いいねになる蚘事なのか、予枬するこずは可胜なのかずいう問題を考えおみたい。

以䞋の぀の蚘事の䞭でも少し予告しおいた、
䞀番難しそうな内容に挑戊しおみる。

Qiitaの蚘事デヌタの取埗ず、党䜓感に぀いお蚘茉。
既にいいねを倚数集めおいる「良蚘事」を「殿堂入り」ずしお月ごずにたずめ。

盎近の蚘事デヌタから、傟向分析を実斜し、
様々な知芋や気づきを埗るこずが出来た。

䞊の蚘事を読んでいない人ぞのたずめ。前回たでのあらすじ

  • Qiitaのデヌタを分析したよ。
    • 2016幎4月の蚘事は、2018幎5月に比べお倍いいねが貰えたよ仕様倉曎圱響倧きいね
    • ⇒分析や比范は、出来るだけ投皿日の近い蚘事同士が望たしいね。
  • 月ごずに、「いいね」が高い蚘事を殿堂入りずしおランキング化したよ。
    • TOP30蚘事「0.38%」で、その月の投皿に察するいいねの「43.7%」 も占めるよ。
    • どの蚘事を読んでも面癜いから芋おね。
  • デヌタを分析した結果、いろいろ面癜いこずが分かったよ。䞀郚を玹介するね。
    • 「いいね」の平均倀は8.02。半分以䞊は。めっちゃ偏っおいるね。
    • 人気のタグが「いいね」が倚いわけではなくお、「機械孊習」ずかが倚いんだなあ。
    • 「タグ」ず「いいね」の関係衚や、タグ同士の関連を図瀺するグラフを䜜ったよ。

今回やりたいこず

最初に蚘茉した考察の結果、「いいね」が倚い⇒良蚘事、ず仮定した。
「殿堂入り」に集めた結果はどれも良蚘事で、仮定は正しかった。

しかし、「いいね」が少ない⇒良蚘事ではない、は成り立たない。
぀の「驚愕」の結果を芋おも明らかなように、「いいね」はトレンド次第で倧きく偏る。
そのため、人の目にあたり觊れられおいなかった、䞍遇な良蚘事が倚数眠っおいるのではないか

自然蚀語凊理/機械孊習を駆䜿しお、海の底に眠る良蚘事を発掘出来ないだろうか

  • 詊した結果こんなの出たした、で終わりにしない。
  • 確かに良蚘事っぜい、ずころたで、チュヌニングを行う。
  • チュヌニングには、極力、人間私の䞻芳的チュヌニングを入れない。
    • 「初心者」タグは面癜い、ずか決め打ちではなく、数倀がN以䞊を取る、などで調敎

本投皿の内容

  • 結論/成果  AIによっお「良蚘事」ず刀断された100蚘事を公開
    • 「良蚘事」レベルを刀定するプログラムが出来た。
    • 「文章的な蚘事」に偏っおしたった感はあるものの、
    • 良蚘事なのにいいねが少ないものを抜出できたような気がする。
      • 良蚘事かどうかは個々人の刀断によるずころが倧きいため、
      • 成果ず手法を公開し、フィヌドバックを募るこずにする。
  • 詊行錯誀の過皋や、凊理のコヌド/ノりハりを公開
  • 詊行錯誀① Doc2Vec
    • テキストをベクトル化/数倀に倉換する技術。
    • 良蚘事ずの距離が近い蚘事良蚘事、ずいう仮定は成り立぀のか
  • 詊行錯誀② クラスタリング
    • 良蚘事ず、良蚘事ではない倱瀌は、クラスタリングによっお分類されるか
  • 詊行錯誀③ 最終的には䞊蚘組み合わせオリゞナルロゞック
    • 結果に至るたでの最終考察ず手法。
  • コヌドの実行環境は党お、Windows10 + Python3 +JupyterNotebook を前提。

圓初仮説

良蚘事の類䌌蚘事は良蚘事ずいう仮説Doc2Vec掻甚

Doc2Vecを䜿うず、文章をベクトル化しお衚珟するこずが出来る。
Word2Vecを応甚しお、文章に適甚出来るようにしたようなもの
詳现は、ググれば出おくるので省略する。

この技術を䜿えば、ある蚘事に察しお、「最も䌌おいる蚘事はどれ」
ずいった圢で怜玢が出来る。
ただし「文章」を扱うので、粟床に぀いおはお察しレベル

埋もれおいる良蚘事耇数の良蚘事が近くに居る、ず仮定するず、
ある蚘事に察しお、類䌌蚘事のTOP10などを出しお、
**類䌌蚘事の平均いいね倀が高い蚘事は、埋もれた良蚘事なのではないか**ずいう仮説を立おた。

各皮前提

実装の話に行く前に、いく぀か今回の前提を蚘茉する。

今回䜿甚するデヌタは党お、2018幎6月末ごろに取埗した、
2018幎05月に投皿された蚘事  2017幎06月に投皿された蚘事
のデヌタ79072蚘事に぀いお扱っおおり、
「いいね」の倀に぀いおも、デヌタ取埗時点の倀である。

Doc2Vecのモデルを䜜る方法

Doc2Vecを䜜るための前加工凊理

Doc2Vecのモデルを䜜るためには、孊習甚のデヌタずしお、
「文章の名前 タむトルやタグ 文章のテキストを単語リスト化したもの」
の圢TaggedDocument圢匏に蚘事を加工する必芁がある。

圢態玠解析はmecabmecabの蟞曞ipadic-neologdを䜿甚する。

以䞋のようにしお加工する。

TaggedDocumentリストの䜜成
# 品詞を限定した、タグドキュメントリストの生成
from gensim.models.doc2vec import Doc2Vec
from gensim.models.doc2vec import TaggedDocument

import MeCab

# Mecabによる解析の実隓ipadic-neologdの蟞曞を指定しおいる。
text = '日本語の自然蚀語凊理は難しいよね。'
tagger = MeCab.Tagger(r"-Ochasen -d .\mecab-ipadic-neologd")        
result = tagger.parse(text)
print(result)

# タグドキュメントのリストを䜜る
TaggedDocument_list=[]

# 投皿蚘事を、タグドキュメント化しお、そのリストを䜜っおいく。
# 党蚘事察象にした。
for item_info in item_info_list:
    #投皿蚘事のURLず本文body)を取り出す。
    url_str=item_info[3]
    body=item_info[9]
    # ★ノヌマむラむズを入れる
    normalized_body=normalize_neologd(body)
    
    lines = tagger.parse(normalized_body).splitlines()
    words = []
    for line in lines:
        chunks = line.split('\t')
        # ★特定の品詞に限定しお利甚する。
        if len(chunks) > 3 and (chunks[3].startswith('動詞') or chunks[3].startswith('圢容詞') or (chunks[3].startswith('名詞') and not chunks[3].startswith('名詞-数'))):
            words.append(chunks[0])
    #TaggedDocumentは、以䞋のような圢匏で生成する。モデル利甚時には、tagsの倀でこの文曞を指定する。
    #TaggedDocument_pair = TaggedDocument(words=['名詞', '動詞', '圢容詞', '日本語', '凊理', '難しい'], tags=['d1'])
    #タグは、URLにする。
    TaggedDocument_pair = TaggedDocument(words=words, tags=[url_str] )
    TaggedDocument_list.append(TaggedDocument_pair)

print(len(TaggedDocument_list))

加工の時のポむントは点ある。
圓初はただの分かち曞きで実斜しおいお、生成したモデルの粟床が少し悪かったために、
この点の凊理を入れたずころ、Doc2Vecの粟床が向䞊した。

  • 特定の品詞に絞っお利甚
  • ノヌマラむズ

特定の品詞に絞っお利甚するのは、
意味の薄い単語をあらかじめ消しおおき、
文章䞭の重芁な甚語だけ扱うようにするこずで粟床を䞊げるため。

ノヌマラむズに぀いおは、以䞋の䟋がむメヌゞしやすい。
党角のアルファベットの倉換や党角スペヌスを削陀or半角化したりしお、
同じ意味の単語が、同じ衚蚘になるように、揃えるこず。

ノヌマラむズの実行䟋
normalize_neologd("南アルプスの 倩然氎   レモン䞀絞り")
# >  '南アルプスの倩然氎Sparking Lemonレモン䞀絞り'

この関数は、mecab-ipadic-neologdのプロゞェクトから
パクっおきたコピヌしおきただけのもので、コヌドは以䞋の通り。

ノヌマラむズ
# https://github.com/neologd/mecab-ipadic-neologd/wiki/Regexp.ja
# ノヌマラむズ詳现は↑のURLを参照

# encoding: utf8
from __future__ import unicode_literals
import re
import unicodedata

def unicode_normalize(cls, s):
    pt = re.compile('([{}]+)'.format(cls))

    def norm(c):
        return unicodedata.normalize('NFKC', c) if pt.match(c) else c

    s = ''.join(norm(x) for x in re.split(pt, s))
    s = re.sub('', '-', s)
    return s

def remove_extra_spaces(s):
    s = re.sub('[  ]+', ' ', s)
    blocks = ''.join(('\u4E00-\u9FFF',  # CJK UNIFIED IDEOGRAPHS
                      '\u3040-\u309F',  # HIRAGANA
                      '\u30A0-\u30FF',  # KATAKANA
                      '\u3000-\u303F',  # CJK SYMBOLS AND PUNCTUATION
                      '\uFF00-\uFFEF'   # HALFWIDTH AND FULLWIDTH FORMS
                      ))
    basic_latin = '\u0000-\u007F'

    def remove_space_between(cls1, cls2, s):
        p = re.compile('([{}]) ([{}])'.format(cls1, cls2))
        while p.search(s):
            s = p.sub(r'\1\2', s)
        return s

    s = remove_space_between(blocks, blocks, s)
    s = remove_space_between(blocks, basic_latin, s)
    s = remove_space_between(basic_latin, blocks, s)
    return s

def normalize_neologd(s):
    s = s.strip()
    s = unicode_normalize('----', s)

    def maketrans(f, t):
        return {ord(x): ord(y) for x, y in zip(f, t)}

    s = re.sub('[˗֊‐‑‒–⁃⁻₋−]+', '-', s)  # normalize hyphens
    s = re.sub('[﹣—―─━ヌ]+', 'ヌ', s)  # normalize choonpus
    s = re.sub('[~∌∟〜〰]', '', s)  # remove tildes
    s = s.translate(
        maketrans('!"#$%&\'()*+,-./:;<=>?@[¥]^_`{|}~',
              '”’¥〜。、・「」'))

    s = remove_extra_spaces(s)
    s = unicode_normalize('”’¥〜', s)  # keep ,・,「,」
    s = re.sub('[’]', '\'', s)
    s = re.sub('[”]', '"', s)
    return s    

Doc2Vecのモデルの生成

準備したTaggedDocument_listの孊習を実行する。
オプションの指定の仕方によっおかなり粟床は倉わる。

モデルの生成
%%time
# 孊習実行パラメヌタを調敎可胜
# documents:孊習デヌタTaggedDocumentのリスト
# min_count=1:最䜎1回出珟した単語を孊習に䜿甚する
# dm=0:孊習モデル=DBOWデフォルトはdm=1:孊習モデル=DM
# model = Doc2Vec(documents=TaggedDocument_list, min_count=10, dm=0)
# iter:トレヌニング反埩回数 デフォルトは
Doc2VecModel = Doc2Vec(documents=TaggedDocument_list, size=150, alpha=0.0015, sample=1e-4, min_count=10, workers=4, iter=30)

# 孊習したモデルを保存
Doc2VecModel.save('simple30_Doc2VecModel_150.model')

今回のポむントは、「iter」の指定。
トレヌニング反埩回数が少ないず、粟床が出なかった。

実行回数に぀いおは、もう少し耇雑な蚈算をさせお、
動的に決めおいるコヌド䟋芋受けられたが、
あたり凝ったこずをやらなくおも、䜕床かやっおみお、
良さそうな倀にすれば良いず思う。数十分皋床で終わる。
圓初、この蚭定をせずに実斜しおいお粟床が出なかった。
次に、凝ったコヌドを実斜しおいたが、
最終的にiterの数を増やすだけで、凝ったコヌドず同等以䞊の結果になった。

ここで、「粟床」ず蚀っおいるのは、Doc2Vecの粟床ではなく、
Word2Vecの結果の玍埗感のこず。
Doc2Vecモデルを䞊蚘の方法で䜜るず、合わせおWord2Vecモデルも生成される。
文章の類䌌床、を人の目で刀断するこずは難しいが、
単語の類䌌床、であれば、玍埗感があるかどうか、で䜕ずなく分かる。
具䜓的には、次の、モデルの内容確認のコマンド結果を芋お、
パラメヌタのチュヌニングを怜蚎しおいるずいうわけ。

䜜成したモデルの内容確認

䜜成したDoc2Vecモデルで、どんな成果が埗れるのか遊んでみる確認しおみる。
以䞋のコヌドによっお、
ある蚘事に䌌た蚘事を探したり、
ある単語に䌌た単語を探したりWord2Vec機胜が実斜できる。

䜜成したモデルで遊んでみる
model = Doc2VecModel
# ファむルからロヌドする堎合は以䞋
# model = Doc2Vec.load('simple30_Doc2VecModel_150.model')

# ベクトル'd1'を衚瀺型はnumpy.ndarray
# print(model.docvecs['d1'])
# 各文曞ず、最も類䌌床が高い文曞を衚瀺デフォルト倀10個
print(model.docvecs.most_similar('https://qiita.com/youwht/items/f21325ff62603e8664e6', topn=3))

print(model.most_similar(positive=u"python", topn=10))
print(model.most_similar(positive=u"プログラム", topn=10))
print(model.most_similar(positive=u"開発", topn=10))
print(model.most_similar(positive=u"アプリ", topn=10))
print(model.most_similar(positive=u"機械孊習", topn=10))

モデルの内容確認結果

コヌド䞭のURLが瀺すのは、察矩語の蚘事。
「赀の他人」の察矩語は「癜い恋人」 これを自動生成したい物語
の蚘事に䌌おいるず刀断された、ずっおもずっおも䞍名誉な蚘事TOPは・・・
※2018幎5月2017幎6月の党79072蚘事䞭から遞ばれたTOP3

意倖ず䌌おいる気がしないでもない・・・倱瀌。

たた、Word2Vecモデルも合わせお生成されるので、
それぞれ䌌おいる䞊䜍単語を瀺しおみる。

順䜍 python プログラム 開発 アプリ 機械孊習
䜍 py コヌド 構築 アプリケヌション ディヌプラヌニング
䜍 Python スクリプト 開発䞭 画面 DeepLearning
䜍 pip ゜ヌスコヌド アプリ開発 端末 自然蚀語凊理
䜍 numpy サンプル 敎備 ブラりザ 深局
䜍 pyhon ゜ヌス 導入 プロゞェクト 匷化孊習
䜍 bash むンタプリタ 敎える app デヌタサむ゚ンス
䜍 conda 実行 開発者 サヌビス 人工知胜
䜍 jupyter notebook 実行ファむル 運甹 デプロむ Deep Learning
䜍 pytest 動䜜 プロダクション ログむン 教材
10䜍 venv 動く 環境 アむコン モデリング

pythonの䜍の「pyhon」は、衝撃的なこずに、
タグずしおも利甚されおいお、2018幎7月時点で、10投皿されおいる。
回くらい芋盎しおしたった

蚘事数をもっず増やせば、Word2Vecずしおの粟床はさらに䞊げるこずが出来る印象。
ある皋床玍埗感のある類䌌怜玢結果であるため、
このモデルならば、文章の類䌌をやらせおも䞊手くやっおくれるだろう、ず刀断。

なお、コヌドブロックを考慮せずに実行しおいるのだが、
コヌドブロックは固たりになっおいるために、
自動的に䞊手く分かれおくれるず思っおいた通りの結果になった。
䟋えば「if」の類矩語は、else, return, continue, elseif・・・ず続いた

最初から良い結果を提瀺しおいるが、
䞊蚘で䜕点か䞊げたポむントを実行する前の結果は以䞋の通り。党然違う。ダメダメ。
こういったWord2Vecの結果を芋ながら、どの玍埗のいく感じになるたで調敎するのだ。

順䜍 python プログラム 開発 アプリ 機械孊習
䜍 py たず 向け アカりント 基瀎
䜍 ruby 怜蚌 ツヌル 管理 孊ぶ
䜍 pip テスト 版 ブラりザ プログラミング
䜍 numpy 導入 敎備 連携 ディヌプラヌニング
䜍 go 通り 構築 アプリケヌション 初心者
䜍 pwn 拡匵 フレヌムワヌク サヌビス 技術
䜍 #!/ 行い 開発者 プロゞェクト 知識
䜍 sh ずおり 無料 Slack 向け
䜍 keras 実際 連携 ゜ヌス AI
10䜍 pandas 操䜜 チュヌトリアル 関連 本

ここたでの結果埗られたモデルを䜿っおもいろいろ遊べるが、
今回の目的に戻っお、
「良蚘事の類䌌蚘事は良蚘事」が成り立぀のか考えおみよう。

良蚘事の類䌌蚘事のいいね数を調べる

既に認識されおいる良蚘事今回はいいね以䞊の蚘事ず眮くに察しお、
類䌌蚘事の平均いいね倀を調べおみる。

良蚘事の類䌌蚘事の平均いいね数を芋る
# URLをキヌにした蟞曞型にしおおく。
url_key_dict={}
for item_info in item_info_list:
    url_key = item_info[3]
    url_key_dict[url_key] = item_info
print(len(url_key_dict))

topnNO=30
# 党郚の蚘事URL(key)に察しお
ruiji_iine_list=[]
for kiji_url in url_key_dict.keys():
    moto_kiji_iine = url_key_dict[kiji_url][0]
    #300いいね以䞊の蚘事に察しおは、類䌌蚘事を取埗する。
    if moto_kiji_iine >299 :
        sim_kiji_list = model.docvecs.most_similar(kiji_url,topn=topnNO)
        iinesuu_list=[]
        iinesuu_list.append(moto_kiji_iine)
        for sim_kiji in sim_kiji_list:
            sim_kiji_url=sim_kiji[0]
            sim_kiji_iine=url_key_dict[sim_kiji_url][0]
            iinesuu_list.append(sim_kiji_iine)
        ruiji_iine_list.append(iinesuu_list)

print(len(ruiji_iine_list))

total_val=0
moto_total_val=0
for iinesuu_list in ruiji_iine_list:
    moto_total_val+=iinesuu_list[0]
    for val in range(topnNO):
        total_val+=iinesuu_list[val+1]

print(total_val/topnNO/len(ruiji_iine_list))
print(moto_total_val/len(ruiji_iine_list))

結果
いいね以䞊の蚘事平均いいね倀648.6の、
各類䌌蚘事TOP30の、
平均いいね数は、「35.7」になった。

ポむントは、
盎近幎のQiita蚘事分析で分かった぀の「驚愕」
の内容で芋た通り、党蚘事の平均いいね倀は「」であるため、
「35.7」はかなり高い数字である。

しかも、䞊蚘のプログラムの「䌌おいる」の範囲TOPいく぀たでかを広げるほど、
平均倀は䞋がっおいくこずも刀明した。
良蚘事に䌌おいる床が高いほど、平均倀が高いずいうこず。
さらに、平均300以䞊の蚘事ではなく、平均100以䞊の蚘事を察象にしおも、
同様の結果になる。平均倀は少し䞋がる

  • 「300以䞊」「TOP10」⇒「42.9」
  • 「300以䞊」「TOP30」⇒「35.7」
  • 「300以䞊」「TOP50」⇒「33.9」
  • 「100以䞊」「TOP10」⇒「36.2」
  • 「100以䞊」「TOP30」⇒「30.1」
  • 「100以䞊」「TOP50」⇒「28.1」

なお、いいね数の指数的な分垃状況を考えるず、本来は「平均」ではなく、
察数化した平均などを芋たほうが良いず思われるのだが、
倧きいか小さいかずいうレベルでは圱響は少ないので、単玔平均で話を進める。

぀たり、今回䜜ったモデルを䜿うず、
いいね数の高い蚘事に䌌おいる蚘事は、いいね数が高い
ずいう関係が成立しおいる。

みんながいいねをする蚘事には、特城がある、ずいうこずであり、
今回䜜成したDoc2Vecモデルが、その特城の䞀郚を捉えおいる、ずいうこずになる。

ここたで明確な傟向が出おいるず倧きな垌望だ。
あずは、逆に、
「類䌌蚘事の平均いいね倀が高いのに、自分自身のいいね倀が少ない蚘事」
を芋぀ければいいのだ

埋もれた良蚘事の発掘⇒倱敗

ここたで順調にいったかに芋えたが、
最埌の砊が埅っおいお、この方法では䞊手くいかなかった。

䞊蚘で良蚘事だけを察象にしおいた類䌌怜玢平均蚈算凊理を、
党蚘事を察象にしお実斜し、
「類䌌蚘事の平均いいね倀が高いのに、自分自身のいいね倀が少ない蚘事」
をフィルタリングしお出した。

確かに、いく぀かは、いいねが少ないのに面癜い蚘事が芋぀かったのだが、
面癜くない蚘事や、曞き方的にむマむチな蚘事もかなりヒットしおしたった。
私の䞻芳的にはダメずいうだけであり、他の人が芋れば面癜いかもしれない、
ずいうのは倚々あり぀぀も、少し考察をするず・・・

「良蚘事」でいいね数がかなり高い蚘事でも、Doc2Vecモデル䞊では、
面癜くない蚘事に近いず分類されおしたうこずもたたあるハズ。
党䜓的な平均を取れば、面癜い偎に分類されるこずが倚いのだろうが、
個別事䟋が100%の粟床になっおいるわけでは無い。
そのため逆偎から芋るず、そうした蚘事ず類䌌しおいる面癜くない蚘事は、
「類䌌蚘事の平均いいね倀」が高くなっおしたう。
そのため、面癜くない蚘事も結構出おきおしたうのではないか
平均で芋ればDco2Vecモデルは「いいね刀断」が出来おいおも、
個別事䟋で䜿おうずするず、マギレ/誀怜知が倚い
ずいうこず。

この件に関しおは、この蚘事がむマむチだった、みたいな考察は倧倉倱瀌なので、
コヌドず結果蚘茉は差し控えるこずにする。

䞀応、䞊蚘のコヌドに加えお、
「自分自身のいいね倀が平均倀以䞊である」
みたいな条件を入れればかなり粟床は良くなる面癜い蚘事が芋぀かるのだが、
自分自身のいいね倀を参照するようなロゞックでは、
「埋もれた良蚘事」発掘ずしお盞応しくないし、
それで発掘出来おもプログラムの力ず蚀いにくいため、あくたでも、
「ある蚘事の文章だけを機械が芋お、他の良蚘事のサンプルから類掚した結果」
ずいうロゞックだけで発掘出来る方向を目指す。
単玔に良蚘事を芋぀けたいだけならば、自身のいいね倀での
 フィルタを入れた方が䜿いやすいが、今回は、機械が芋぀けられるか
 の方をテヌマにしたいので、それはやらないよ、ずいうこず

じゃあどうするの

正盎、この時点では結構困っおおり、
今回の詊みは倱敗 or 面癜くないかもしれないず思っおいた。

思い぀いたアむデアは、
件件の蚘事を個別に確認しおいくのではなく、
**たずざっくりず「スゞの良さそうな蚘事」「スゞの悪そうな蚘事」
くらいに分類するこずは出来ないだろうか**ずいうもの。
「スゞの良さそうな蚘事」に絞れば、
それは「自分自身のいいね倀が平均倀以䞊である」ずいうフィルタず
同じようなフィルタずしお䜿えるだろう、ずいうこず。

第二仮説良蚘事のざっくり分類

Doc2Vecモデル自䜓は、個別に芋るず誀差が倚いものの
ある皋床の方向性を瀺すものずしおは機胜しおいるず思われる。
そのため、「クラスタリング」によっお、
蚘事を分類するずいうこずを詊しおみる。

クラスタリングは、「タグ」python、rubyなどの
自動分類などのために甚いられるこずが倚い気がする。

しかし、今回は既に、Doc2Vecのモデルにおける「類䌌床」を芋お、
「同じタグならば類䌌床が近い」ずいう状態ではなく
※そうかもしれないが、確認はしおいない、
「いいね数が近い堎合は類䌌床が近い」ずいう傟向が倚少はある、
ずいうこずは確認枈みであるため、
このたた匷匕にk-meansを適甚しお、
いいね数が高い蚘事矀、䜎い蚘事矀、に分かれるこずを期埅する。

クラスタリング凊理の実装

今回は、k-meansで、個のクラスタに分けおみお、
各クラスタの個数や、平均いいね数などを確認しおみる。
たずは、クラスタリングそのものの凊理を行う。

各蚘事をベクトル化しお、クラスタリング
from collections import defaultdict
from gensim.models.keyedvectors import KeyedVectors
from sklearn.cluster import KMeans
import pickle

key_list = range(len(model.docvecs))
print(len(key_list))

# ベクトル衚珟だけひたすら取り出しおvectorに詰め蟌む。
vectors = [vector for vector in model.docvecs]
print(len(vectors))
# print(vectors[5])

# クラスタ数は、先に指定する。ここがクラスタリング凊理
n_clusters = 30
kmeans_model = KMeans(n_clusters=n_clusters, verbose=1, random_state=42, n_jobs=-1)
kmeans_model.fit(vectors)

# pickleで出来たモデルは保存しおおく。
with open(r'doc2vec_30_kmeans_model_30_150.dump', mode='wb') as f:
    pickle.dump(kmeans_model, f)

# クラスタリングのラベルを䜜る
key_list=[]
for item_info in item_info_list:
    iine=item_info[0]
    key_list.append(item_info[3])

print(len(key_list))
# print(key_list[5])

cluster_labels = kmeans_model.labels_
cluster_to_words = defaultdict(list)
for cluster_id, word in zip(cluster_labels, key_list):
    cluster_to_words[cluster_id].append(word)

# クラスタした結果を衚瀺(各クラスタごずにURLだけサンプル衚瀺)
for words in cluster_to_words.values():
    print(words[:3])

この状態で、Doc2Vecモデルの距離が近い蚘事同士で、
個に分類されたずいうこずになる。

各クラスタの情報を確認

各クラスタに察しお、それぞれ䞋蚘を算出する。

  • そのクラスタに含たれる蚘事の個数
  • いいねの合蚈倀
  • いいねの平均倀
  • いいねの䞭倮倀
  • いいねの「log2」を取った倀の平均倀

特に、いいねの「log2」を取った平均倀が、
䞀定倀以䞊のクラスタは、良蚘事集団の可胜性がある。

今たでは、単玔平均で芋おきたが、母数が枛った集団になるず、
単玔平均は適切ではない。䟋えば、
「」「」「」「」「」⇒平均
「」「」「」「」「」⇒平均
この堎合、䞋の集団のほうが欲しい。良蚘事集団は䞋の集団
log2をずった平均で芋るず、
「」「」「」「」「」⇒平均 2.8
「」「」「」「」「」⇒平均 4.6
この䟋のように、 誀差的に入っおしたった䞀぀の高いいね蚘事により、
単玔平均は砎壊されおしたうため、log2偎で芋るのだ。

各クラスタごずに、いいね平均倀の確認
import statistics
import math
import pandas as pd

super_osusume_list=[]

for url_strs in cluster_to_words.values():
    iine_list=[]
    iine_log_list=[]
    #print(len(url_strs))
    
    #いいね数やログいいね数のリストを生成。
    for url_str in url_strs:
        iine=url_key_dict[url_str][0]
        iine_list.append(iine)
        log_2_iine=math.log(iine+1, 2)
        iine_log_list.append(log_2_iine)
    
    kosuu = len(iine_list)
    totalsum = sum(iine_list) 
    mean = statistics.mean(iine_list)
    median = statistics.median(iine_list)
    log_mean = statistics.mean(iine_log_list)
    outputlist=[kosuu,totalsum,mean,median,log_mean]

    print(outputlist)
    
    if log_mean>3.0:
        print(u"↑これが、そのクラスタ内の平均が高い")
        for url_str in url_strs:
            super_osusume_list.append(url_str)

print(len(super_osusume_list))

log2の平均倀が䞀定のクラスタがどこか芋えやすくした。
ひどいコヌドだ

蚘事の個数、いいね合蚈倀、平均倀、䞭倮倀、「log2」を取った倀の平均倀
のならびで衚瀺しおいる。

結果
[20279, 86803, 4.280437891414764, 1, 1.4025844646740377]
[732, 2150, 2.9371584699453552, 1.0, 0.9005997411336497]
[1984, 27188, 13.703629032258064, 4.0, 2.556772511011302]
[1724, 18076, 10.48491879350348, 4.0, 2.41081308764506]
[24312, 49699, 2.0442168476472524, 1.0, 0.9730674856456951]
[8187, 72085, 8.804812507634054, 2, 1.8539635079080152]
[3025, 20874, 6.900495867768595, 2, 1.8217969402674867]
[718, 11084, 15.437325905292479, 4.0, 2.594425110439478]
[1805, 30528, 16.913019390581717, 5, 2.646739678414474]
[2828, 20459, 7.234441301272985, 2.0, 1.925711294559684]
[493, 5045, 10.233265720081135, 3, 2.1077944304651517]
[492, 3747, 7.615853658536586, 2.0, 1.8214605320444002]
[426, 4190, 9.835680751173708, 2.0, 1.8648483554057411]
[2471, 18732, 7.580736543909349, 3, 1.9783958575503753]
[136, 3358, 24.691176470588236, 7.0, 3.2308068296130306]
↑これが、そのクラスタ内の平均が高い
[826, 15354, 18.588377723970943, 6.0, 2.849973539814431]
[1580, 41598, 26.327848101265822, 6.0, 3.0348010258987252]
↑これが、そのクラスタ内の平均が高い
[2307, 80924, 35.07758994364976, 5, 2.924070196663596]
[2115, 29439, 13.919148936170213, 3, 2.2782404704806263]
[633, 12045, 19.028436018957347, 5, 2.6515975462456294]
[88, 6357, 72.23863636363636, 9.0, 3.6168170882385287]
↑これが、そのクラスタ内の平均が高い
[434, 4606, 10.612903225806452, 4.0, 2.437344518113521]
[382, 42430, 111.07329842931937, 10.0, 3.9578317001193537]
↑これが、そのクラスタ内の平均が高い
[58, 177, 3.0517241379310347, 1.0, 1.4149235500639377]
[327, 11766, 35.981651376146786, 8, 3.3305086025506463]
↑これが、そのクラスタ内の平均が高い
[227, 2475, 10.90308370044053, 4, 2.439790206051181]
[32, 177, 5.53125, 2.0, 1.7983720785655]
[298, 7369, 24.72818791946309, 6.0, 3.0091577507563905]
↑これが、そのクラスタ内の平均が高い
[116, 5454, 47.01724137931034, 6.0, 3.13154297919538]
↑これが、そのクラスタ内の平均が高い
[37, 304, 8.216216216216216, 4, 2.1762433527742653]

2927

個の「良蚘事クラスタ」が存圚しおおり、
その「良蚘事クラスタ」に属する蚘事は、2927個あるずいうこず。
いいねの単玔平均倀で芋おも、結構高い。

クラスタによっお、蚘事の個数がかなり違いが出おいる点に泚目したい。
ほずんどの蚘事は「いいね」が非垞に少ない状況であり、
たた、個数が倚いクラスタは平均もあたり高くないため、そうした
「ふ぀ヌの蚘事」に分類されおしたったものが集められおいるのかもしれない。

クラスタ間の平均倀が結構差が出おいるために、
良蚘事のざっくり刀断、はある皋床成功したず考えられる。

å…š79,072蚘事䞭、2,927蚘事を、良蚘事的な分類ず刀断した。

最終実装

さあ、たたも超長い戊いになっおいるが、
いよいよ最埌の実装。
これたでのノりハりを組み合わせお、
本圓に機械が刀断した良蚘事を抜出する。

クラスタリングで刀断された良蚘事矀に察しお、
それぞれ類䌌蚘事の平均倀の蚈算を実斜し、
その数倀の高いものは、AIが刀断する良蚘事である。

これたでの凊理の組み合わせ刀断によっお、
粟床を向䞊させるずいうワケ。

自身のいいねが䜎いものが出おいれば、
それは人がいいねを぀けなかった、「埋もれた良蚘事」ずいうこず。

埋もれたものだけ衚瀺しおいるず、
「どの蚘事に䌌おいるからいいね刀断されおいるんだよ」
っおこずが分からなくなっおしたうため、
既に倚数のいいねを集めおいる蚘事も含めお、
BEST100を抜出しおみよう

AIが刀断する良蚘事BEST100の抜出凊理

  • マギレを枛らすため、類䌌TOP300ず少し範囲を広める。
  • どんなタグが付いおいるのか興味があるため、タグも衚瀺する
BEST100の抜出凊理
topNo=300
url_iine_ruiji_log_list=[]
for url_str in super_osusume_list:
    sim_kiji_list = model.docvecs.most_similar(url_str, topn=topNo)
    total_ruiji_iinesuu=0
    total_ruiji_iinesuu_log=0
    
    for sim_kiji in sim_kiji_list:
        sim_kiji_url = sim_kiji[0]
        sim_kiji_iine = url_key_dict[sim_kiji_url][0]
        total_ruiji_iinesuu += sim_kiji_iine
        
        #のログを取らないようにする察応
        sim_kiji_iine+=1
        total_ruiji_iinesuu_log += math.log(sim_kiji_iine,2)

    #通垞の平均倀、ログを取った平均倀を蚈算
    ruiji_iine_ave = total_ruiji_iinesuu/topNo
    ruiji_iine_log_ave = total_ruiji_iinesuu_log/topNo    
    moto_iine = url_key_dict[url_str][0]
    title = url_key_dict[url_str][1]
    
    tag_name_list=[]
    for tag_data in url_key_dict[url_str][2]:
        tag_name_list.append(tag_data["name"])
    
    url_iine_ruiji_log=[url_str,title,moto_iine,ruiji_iine_ave,ruiji_iine_log_ave,tag_name_list]
    url_iine_ruiji_log_list.append(url_iine_ruiji_log)
    
url_iine_ruiji_log = pd.DataFrame(url_iine_ruiji_log_list,
                  columns=['url_str', 'title', 'moto_iine', 'ruiji_iine_ave','ruiji_iine_log_ave','tag_name_list'])

url_iine_ruiji_log = url_iine_ruiji_log.sort_values(by='ruiji_iine_log_ave', ascending=False)

# カラム内の文字数の蚭定倉曎URLが途䞭で衚珟されるこずになる。デフォルトは50から倉曎する。
pd.set_option("display.max_colwidth", 120)
# 行数の蚭眮絵倉曎
pd.set_option("display.max_rows", 101)

url_iine_ruiji_log.head(100)

䞊蚘の結果は、dataframeで衚瀺しおいるが、
別途加工しお、結果発衚に進むこずにする。
ドキドキ、ワクワク

結果発衚

※埋もれおいない良蚘事も含んでいたす。

泚蚘元蚘事のいいね数は、2018幎6月末時点の倀。
もし、そこから数字が倧きく䌞びおいたずしたら、
本投皿によっお発掘された成果かもしれたせん

順䜍 類䌌蚘事log平均 元蚘事いいね数 蚘事タむトル/リンク タグ
1 3.64 1232 優秀な技術者を远い出しおしたう方法 [Git, Redmine, 開発プロセス, アンチパタヌン, ゜フトりェア開発]
2 3.57 7 プログラミング講垫が考える、プログラミング孊習に必芁な資質ず講垫偎の芏範、たた教育ずいうものに぀いお [日蚘, 教育, 新卒教育, メンタリング, 健康]
3 3.54 20 瀟䌚人10幎目になったので振り返る(䞀郚䞊堎コンテンツプロバむダヌ䌚瀟) [ポ゚ム, 転職, キャリア, 新人プログラマ応揎]
4 3.54 22 改めおRiot.jsをその他のFW・ラむブラリず比范しお客芳的に評䟡した [ポ゚ム, フロント゚ンド, riot, riot.js]
5 3.53 20 【ポ゚ム】コミュ力䜎いプログラマがサラリヌマンで生きおいくために工倫すべきず思うこず [ポ゚ム]
6 3.53 6 ゚ンゞニアがオりンドメディアを曞くずいうこず [ポ゚ム, オりンドメディア]
7 3.52 41 モグラたたき開発になる理由 [C++, デバッグ, ゜フトりェア開発, モグラたたき開発]
8 3.52 16 【むンタヌン】実際に䟝頌した仕事ず感想を列挙するよだいたい技術芁玠ベヌス [Python, JavaScript, TypeScript, むンタヌン]
9 3.51 34 ReduxずMobXの遞定芳点 [reactjs, redux, mobx]
10 3.51 6 Frontrend Vol.11 - 2017幎床フロント゚ンド倧反省䌚たずめ #frontrend [SPA, フロント゚ンド, AtomicDesign, ssr, nuxt.js]
11 3.5 22 RailsずReactでオンラむン予玄衚QRnoteを䜜っお公開した話 [Rails, React, Rails5]
12 3.5 8 NICじゃない、チヌムに必芁なチヌミング [チヌムマネゞメント]
13 3.49 21 『アドラヌの心理孊』を゚ンゞニアの目線で解釈するず [ポ゚ム, 教育, 心理孊, コミュニケヌション, 人間関係]
14 3.49 30 新卒3幎目のWeb゚ンゞニアが1・2幎目にやっおきた7぀のこず [ポ゚ム, ゚ンゞニア, 新卒゚ンゞニア]
15 3.49 5 Component Driven Development with Atomic Components [JavaScript, angular, フロント゚ンド]
16 3.49 881 JavaScriptフレヌムワヌク遞定の議論 [JavaScript]
17 3.48 4 ロンリヌQAによるJaSST '18 Tokyo レポヌト2日目 [CI, スクラム, QA, Jasst]
18 3.48 11 Rails4環境でカゞュアルにVue.jsを導入しおからのこの1幎を3぀のステップで振り返る [vue.js]
19 3.48 17 Python芚えお3ヶ月の玠人がCoursera Deep Learning Specializationを1週間で完走した話 [Python, DeepLearning, ポ゚ム, ディヌプラヌニング, coursera]
20 3.48 1017 未経隓者が認識しおなさそうなTIPS [tips, 初心者, 備忘録, コミュニケヌション, 新人プログラマ応揎]
21 3.47 32 Tech Night @ Shiodome#4 #テクシオ に参加しおきたのでざっくりレポヌトする [勉匷䌚, devops, 自動化]
22 3.46 2 瞑想する゚ンゞニア ( GoogleやFacebookもやっおいる「マむンドフルネス」のススメ ) [仕事]
23 3.46 49 真に Universal な ReactComponent を曞く [reactjs, react-native]
24 3.46 7 DevOpsを知ったかぶりしおいた私が、チヌムの人ず぀たづきながらカむれン・ゞャヌニヌしおいる話。 [devops, ポ゚ム]
25 3.46 9 PHPカンファレンス関西2017行っおきたよ [PHP, phpkansai, phpカンファレンス関西]
26 3.44 2371 開蚭埌週間で収益䞇円を埗た個人開発サむトでやったこずの党郚を公開する [Ruby, JavaScript, Heroku, AWS, 個人開発]
27 3.44 235 Angular + Firebaseで䜜ったWEBサヌビスをリリヌスしたので、たたった知芋を曞き出しおみる [JavaScript, angular, SEO, SPA, Firebase]
28 3.44 246 ムダな資栌集めずはもうサペナラ 「自分の教育マップ」の䜜り方 [教育, マネゞメント, 資栌, 新人教育, 新人プログラマ応揎]
29 3.43 2 SEに求められるコミュニケヌション力ずは ヒュヌマンスキルずしお必芁なこず [コミュニケヌション, 新卒応揎, 人間関係]
30 3.43 1 【増垭したした!!40→60】PWA Beginners 勉匷䌚 #3 に参加したした。2018/04/16(月) [AMP, PWA]
31 3.43 6 れロベヌスで考える今の叀いタむプのシステム開発珟堎、デキる゚ンゞニアになろう [仕事, ビゞネス, ゚ンゞニア, 新人プログラマ応揎, 人間関係]
32 3.42 10 プロゞェクトマネヌゞャヌになるための勉匷方法 [マネゞメント, プログラムマネゞメント]
33 3.42 16 チヌムでの趣味゜フト開発ノりハり -マむクロブログホスティングサヌビスUZOMUZOの開発を通しお- [Rails, Twitter, チヌム開発, Slack, mastodon]
34 3.42 34 ゚ンゞニアの次のステップの勉匷法 - 技術の別の道ぞの掻かし方 [アゞャむル, マネゞメント, 組織, ゚ンゞニア, プロダクトマネヌゞャヌ]
35 3.41 992 「䞭幎の危機」ど真ん䞭のオッサンがWEBサヌビス䜜っおみた。 [C#, bootstrap, オヌプンデヌタ, Webサヌビス, ASP.NET_Core]
36 3.4 13 新卒2幎目が終わったWebプログラマが転職掻動をしおいる話 [PHP, 転職, 転職掻動, 新卒゚ンゞニア]
37 3.4 606 半幎で40kg痩せたダむ゚ットでわかるリヌンなプロゞェクトマネゞメント手法 [アゞャむル, ダむ゚ット, リヌン, プロゞェクトマネゞメント]
38 3.4 8 マネゞャヌは自分の匷みを䜕におくのか [Redmine, プログラミング教育, ゜フトりェア開発]
39 3.4 1097 11ヶ月間でTOEICスコアを300点から835点に䞊げた英語孊習法 [英語, English, toeic, 英語䞊達完党マップ]
40 3.4 972 就掻のためにWEBサヌビスを䜜ったら、転職できた以䞊の䟡倀をもたらしおくれた話 [PHP, laravel, Webサヌビス, webサヌビス開発]
41 3.39 332 [React Native入門完党版]「いきなりデヌト」のアプリをReact Nativeで開発した知芋をたずめたす。 [JavaScript, Rails, es6, React, reactnative]
42 3.39 3 10幎以䞊勀めた倧手通信事業者を退職しおスタヌトアップ䌁業ぞ転職した話 [ポ゚ム, 研究, 転職, 退職]
43 3.39 40 応甚情報技術者詊隓に合栌する勉匷方法・察策 [たずめ, 資栌, 応甚情報技術者詊隓, 勉匷法]
44 3.39 42 AngularにWebComponentsがやっお来るダァ!ダァ!ダァ!〜@angular/elementsのファヌストむンプレッション〜 [JavaScript, angular, WebComponents]
45 3.38 0 🔰初めおの、Developers Summit(デブサミ) 2018 日目 行っおきた。 [メモ, 初心者, デブサミ, 感想文, DevelopersSummit]
46 3.38 327 有志の瀟内勉匷䌚を1幎で50回くらいやった結果 䌝えたいこず [勉匷䌚, ポ゚ム, 瀟内勉匷䌚, 運営]
47 3.38 194 講矩録『゚ンゞニアずしおこの先生きのこるために』@t_wada先生 [プログラミング, 初心者, キャリア, 新人プログラマ応揎, 孊習法]
48 3.38 795 䌚瀟勀めの゚ンゞニアが開発したサヌビスを買い取っお独立した話 [キャリア]
49 3.37 196 【䟿乗蚘事】゚ンゞニアがデスマヌチを生き抜くための知芋をたずめおみた [プロゞェクト管理, マネゞメント, ゚ンゞニア, 生存戊略, デスマヌチ]
50 3.36 4 (レポヌト)RSGT2018参加報告  Gathering  [スクラム, LT, ワヌクショップ]
51 3.36 1476 プロゞェクトの残業を50%削枛したタスク管理手法を惜しみなく公開する [todo, チヌム開発, プロゞェクト管理, タスク管理, プロゞェクトマネゞメント]
52 3.35 1002 ディヌプラヌニングに入門するためのリ゜ヌス集ず孊習法2018幎版 [Python, ディヌプラヌニング, 深局孊習]
53 3.35 111 盞性抜矀なVueずSVGでオンラむンマむンドマップ [JavaScript, SVG, vue.js, フロント゚ンド, Firebase]
54 3.35 80 Unity゚ンゞニアがTypeScript+WebGLで3Dダンゞョンゲヌム䜜っおみた結果 [HTML5, WebGL, Unity, three.js, TypeScript]
55 3.35 46 今曎ながらRedmineでチヌムのタスク管理した時の話これからのタスク管理 [Redmine, プロゞェクト管理, タスク管理, プロゞェクトマネゞメント]
56 3.35 16 スタヌトアップで、あえお最先端の技術を䜿うメリットずデメリット [JavaScript, ポ゚ム, angular, Firebase, スタヌトアップ]
57 3.35 109 プロダクト開発チヌムで今幎やっおみおよかったこず10遞 [マネゞメント, pm, プロダクトマネゞメント, プロダクトマネヌゞャヌ]
58 3.35 4 フリヌランスを目指すなら知っおおけ ~瀟䌚保険のお話~ [フリヌランス, 瀟䌚保険]
59 3.34 186 React 案件での面談時の質問事項 [JavaScript, React, 面談察策]
60 3.34 2 ClojureScript + re-frame 入門 [ClojureScript, re-frame]
61 3.34 1 「サヌバント リヌダヌシップ」 のたずめ [リヌダヌシップ]
62 3.34 6 続 テストガヌルRINA指教線 [テスト, adventcalendar2017]
63 3.34 0 ストレングス基瀎コヌス [ストレングスファむンダヌ]
64 3.33 4 実質3日間の勉匷で基本情報技術者詊隓に合栌した(ず思う)ので、勉匷法を公開したす【初心者忙しい人向け】 [基瀎, 勉匷, 基本情報凊理技術者詊隓, 基本情報技術者]
65 3.33 43 新人に向けおるわけでもない特に蚀っおおきたいほどでもない纏たっおすらいない話 [ポ゚ム, 新人プログラマ応揎]
66 3.33 896 「お前らのフリヌランスになるメリットは間違っおいる」ずいうお話 [プロゞェクト管理, 法埋, 法務, 新人プログラマ応揎, フリヌランス]
67 3.32 17 それでもやっぱり redux は面倒くさい [JavaScript, flux, ポ゚ム, redux]
68 3.32 141 自立自走型チヌムの構築ず心理的安党性を高める斜策 [アゞャむル, ポ゚ム, チヌム開発, マネゞメント]
69 3.32 391 5000人に聞いた、2018幎最先端のフロント゚ンドツヌルはこれだ [CSS, JavaScript, フロント゚ンド, ゚ンゞニア, 戞田奈接子蚳]
70 3.32 6 「成長頭打ち」ず感じた゚ンゞニアは筋トレに励め。 [筋トレ, ゚ンゞニア, デヌタサむ゚ンティスト, スクラムマスタヌ]
71 3.31 1 3人のgit初心者 - The git beginners of three - [Git, bitkeeper]
72 3.31 4 Flutterりィヌクリヌ #18 [Android, iOS, Dart, Flutter, FlutterWeekly]
73 3.31 14 Next.jsラむクなReact Routerを䜜っおみた [JavaScript, OSS, React, react-router, next.js]
74 3.31 39 React Nativeでの高速プロトタむピング・MVP開発のためのTips7぀ (firebase / gas / google cloud function) [reactnative, react-native, Firestore]
75 3.31 972 【保存版・初心者向け】独孊でAI゚ンゞニアになりたい人向けのオススメの勉匷方法 [Python, 機械孊習, DeepLearning, AI, AIAcademy]
76 3.3 15 芁玄 プログラマが知るべき97のこず [プログラミング, 英語, プログラマ, プログラミング䜜法, 英語孊習]
77 3.3 233 ゚ンゞニア組織がない䌚瀟で゚ンゞニア組織を立ち䞊げるためにやった3぀のこず [新人教育, 組織, ゚ンゞニア, プロダクトマネヌゞャヌ, 新人プログラマ応揎]
78 3.3 9 Chrome Dev Summit 2017たずめ [JavaScript, Chrome, カンファレンス, PWA, ProgressiveWebApps]
79 3.3 39 もし軍曹が携垯電話をいた開発したら [C++, デバッグ, ゜フトりェア開発, モグラたたき開発, デスマヌチ]
80 3.3 0 (レポヌト)Developers Summit 2018(2日目) [アゞャむル, hipchat, スクラム, VR, モブプログラミング]
81 3.3 4 (レポヌト)Navitime × NRI勉匷䌚 [スクラム, ワヌクショップ, ふりかえり, 講挔]
82 3.29 39 Microsoftの自然蚀語分類技術を本気で怜蚌しおみた。〈Microsoft Cognitive ToolkitでのChatBot実装〉 [C#, 自然蚀語凊理, 機械孊習, DeepLearning, bot]
83 3.29 6 人工芞術家//自分の代わりに機械に䜜品を䜜っおもらいたい人の話 [人工知胜, 芞術, 人工創造性]
84 3.29 3 九州(犏岡)で幎間プログラマやったらこんな感じだった [ses, 転職, キャリア, フリヌランス, 経歎]
85 3.29 415 Nuxt.jsずFirebaseを組み合わせお爆速でWebアプリケヌションを構築する [JavaScript, vue.js, Firebase, nuxt.js]
86 3.29 389 週末圚宅ワヌクの生産性を䞊げる5぀の芖点ず32の工倫 [アゞャむル, 効率化, マネゞメント, ゚ンゞニア, 働き方改革]
87 3.29 53 【サポヌタヌズCoLab勉匷䌚】20代゚ンゞニアのキャリア論 に行っおきたした [キャリア, ゚ンゞニア, 新人プログラマ応揎]
88 3.28 9 明日の開発カンファレンス 2018 に行っおきた [Security, devops, スクラム]
89 3.28 360 2018 幎 React ず Redux の゚コシステム総たずめ [JavaScript, reactjs, React, redux]
90 3.28 114 最匷のリンク集の最匷のリンク集 [JavaScript, GitHub, awesome]
91 3.27 12 ロンリヌQAによるJaSST '18 Tokyo レポヌト1日目 [CI, スクラム, QA, Jasst]
92 3.27 620 ペアプロ懐疑掟だった僕が、実務でペアプロ導入しお180床考えが倉わった話 [アゞャむル, チヌム開発, 開発プロセス, スクラム, ペアプロ]
93 3.27 7 初めおのReactで初めおのSPAを䜜りたした [JavaScript, SPA, reactjs, React]
94 3.27 2 (レポヌト)プロダクトオヌナヌ祭り2018 䞖界を創るのは俺たちだ [スクラム, set, ふりかえり]
95 3.27 15 【和田卓人氏特別講挔】若手゚ンゞニアに送る"心構え"ず"キャリア芳" / 2017幎9月23日 [初心者, 和田卓人, キャリア, ゚ンゞニア, 若手]
96 3.27 562 CTOのやるべきこずは䜕なのか翻蚳ず考察 [経営, CTO, スタヌトアップ, テクノロゞヌ・ビゞネス]
97 3.27 8 プログラミングをあたりしたこずない人がReactNativeを始めるずきに知っおおきたいこずや参考資料のたずめ [JavaScript, reactnative]
98 3.26 24 自己組織化された開発チヌムぞの道のり2017 [マネゞメント, 自己組織化, 組織, プロダクトマネヌゞャヌ, ゚ンゞニアリングマネヌゞャヌ]
99 3.26 7 「IT゚ンゞニア採甚に欠かせない原則ずは」を読んで [採甚]
100 3.26 1 1幎間の「ふりかえり」をふりかえる [スクラム, ふりかえり]

結果考察

元々いいねが高い蚘事ももちろん抜出されおいるし、
良い蚘事に芋えるのに、「いいね」が少ないものも、
かなり抜出されおいるず感じた。
詳现はもう少し時間をかけお芋ないず・・・

なお、「殿堂入り蚘事」レベルは、党䜓の**0.4%**皋床であり、
抜出凊理では、自分自身元蚘事いいね数は参照しおいないのだが、
正確にはクラスタの平均いいね蚈算で、自身のいいね数も含めおいるものの、
 その参照の仕方は、倚数の䞭の平均ずしお䜿っおいるに過ぎない
予想以䞊に、殿堂入りレベルの蚘事が入っおいる割合が高い。

䞊述の100蚘事の平均いいね数は、なんず206。

「コヌド系」より「文章系」の方が倚く抜出されおいるような気がする。
どういう分類だよ

぀けられおいる「タグ」に぀いお、
比范的マむナヌで、TOP60䜍に入っおいないものが倚い、
ような気はする。

Doc2Vec、クラスタリング、各皮粟床チュヌニングや工倫、によっお、
自身のいいね数、タグ、を考慮に入れなくおも、
これくらいの粟床で**「良蚘事の抜出」を実珟するこずが出来た**。

実際どの皋床の粟床なのか、
詳现はぜひ皆さんの感芚で蚘事を読んで確認しおいただきたい。
たた、この結果、党く知らなかった埋もれおいた䞖界が
少しでも広がるこずがあれば、倧倉うれしく思う
。

盞倉わらず難しい点は、今回抜出された蚘事が、
果たしお本圓に良蚘事なのか、その粟床をはかる方法だ。
良蚘事かどうかは「䞻芳」によっお異なるためだ。

しかし、情報が過倚である珟圚、
機械にある皋床の刀別をさせたり、
機械にオススメ蚘事を探しおもらったり、ずいう
「リコメンド」は倚く求められおいる。

たた、今回のモデル、クラスタを䜿うず、
蚘事を曞いた瞬間から、その蚘事が䜕いいねくらい぀きそうか、
分類予枬が出来る

※この蚘事自䜓を入れお予枬させおも面癜いが、
  ハズすず悲しいし、既に超長くなりすぎおいるので今回はパス

あずがき

衚のあずがき

以䞋の点の投皿は、この投皿のための助走でもあった。
しかし、「いいねが少ない良蚘事」の発掘は、
ふ぀ヌに考えおも超難しい。
かなり分かりにくくなっおしたったかもしれない。
100回くらい読み盎しおみるず良いかもしれない

繰り返し匷調しおおきたい。
Qiitaには、いいね数だけで枬れない良蚘事が沢山眠っおいる。

トレンドで、珟圚衚にあがっおくる蚘事だけでなく、
「殿堂入り」のように過去のトレンドの保存や、
今回の投皿のように、隠された良蚘事を発掘しやすくする
䜕らかの仕掛けを望む人は倚いのではないだろうか

あず、この蚘事自䜓が埋められおしたうず発掘者が埋たっおしたうため、
それだけは避けなければならない。぀たり・・・

裏のあずがき

Qiita分析に関する䞀連の投皿は、実は以䞋の点ず合わせた郚構成の目的がある。

蚀語をベクトル化する技術Word2Vecの系統が面癜いず感じた。
しかし、その実装䟋や玹介䟋ずしお、
「王」ヌ「男」「女」「女王」 をそのたた動かすだけのような情報が倚く、
それはそれで重芁で、チュヌトリアル的にもありがたい情報なのだが
真の力を匕き出せおいないように感じた。

単語、文字、文章で、それぞれもっず匷力な応甚䟋を提瀺し、
䞖の䞭の可胜性を刺激したい、ずいう䞀連のテヌマずしお蚭定した。

Word2Vec⇒「赀の他人」、
Char2Vec⇒「平成の次の元号」、
そしお、
Doc2Vec⇒「Qiita分析系の䞀連の蚘事」。

無事、䞀巡するこずが出来お、たずはホッずしおいる。
倧倉だった・・・。次は二巡目

远蚘次回のテヌマは、二巡目ではなく「しりずり」にしおみた。以䞋蚘事。
「しりずり」培底分析最匷キャラ文字解説぀の「驚愕」最長の増殖しりずりぞ挑戊
日本人なら絶察に驚くしりずりの意倖なデヌタ分析結果が明らかに埌半の衚が必芋

党蚘事どれも、昚今の投皿の䞭でも特に無駄を極めた内容に、
倚くの応揎をいただき、倧倉感謝しおいたす

人類の進化は「遊び」からはじたる。
こんな「遊び」が出来るならば、ずいうアむデアに觊発される人がでお、
生掻にも圹に立぀ような「発明」が生たれるのだ。
            Char Fuitter (18471912 オランダ) 


この物語はフィクションです。
登堎する人物・団䜓・名称等は架空であり、
実圚のものずは関係ありたせん。
Char Fuitter チャヌ・フむタヌは架空の人物です。
たた、このようなおかしな内容の蚘事からリンクしおしたった
リンク先の皆様、ご迷惑かけお申し蚳ありたせん。

935
890
7

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
935
890

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?