ITの隊長のブログ

ITの隊長のブログです。Rubyを使って仕事しています。最近も色々やっているお(^ω^ = ^ω^)

Twitter APIでトレンドを取得するまでに調べたことの雑メモ

まずここを参考

syncer.jp

WOEID なるものがよくわからず、ぐぐるのに苦労したけどこのQiitaの記事に助けられた。

qiita.com

また、取得できる値で tweet_volume がnullなケースが多い。なんでだろうと思い、ブラウザで確認できるトレンド情報と比較してみると、どうやら1万件未満のトレンドは0に丸められるっぽい。なんだと・・・

Cabochaの構造がよくわからなかった件

f:id:aipacommander:20210616031914p:plain

よくみるフォーマットですね。コマンドで実行するとどの単語のまとまり(chunk)に係っているか確認できます。

で、こいつをPythonから使ってみるといまいちクラスのインターフェースがよくわからず四苦八苦していましたが、先に組んでくれた人のコードをみたらだいたい理解できた。

github.com

簡略版でこんな感じ。

import CaboCha
from collections import defaultdict

option = '-d /usr/lib/mecab/dic/mecab-ipadic-neologd'
parser = CaboCha.Parser(option)
tree = cabocha.parse('昔、わたしが飼っていた猫は、とても美味しそうな缶詰を食べていた。')
prev_links_dic = defaultdict(list)
for chunk_id in range(tree.chunk_size()):
    chunk = tree.chunk(chunk_id)
    print('chunk_id:', chunk_id, ', chunk_link:', chunk.link)
    for j in range(chunk.token_size):
        token_id = chunk.token_pos + j
        token = tree.token(token_id)
        print(token.surface, '\t', token.feature)
    
    if chunk.link >= 0:
        prev_links_dic[chunk.link].append(chunk_id) 

# chunk_id: 0 , chunk_link: 2
# 昔   名詞,副詞可能,*,*,*,*,昔,ムカシ,ムカシ
# 、   記号,読点,*,*,*,*,、,、,、
# chunk_id: 1 , chunk_link: 2
# わたし     名詞,代名詞,一般,*,*,*,わたし,ワタシ,ワタシ
# が   助詞,格助詞,一般,*,*,*,が,ガ,ガ
# chunk_id: 2 , chunk_link: 3
# 飼っ    動詞,自立,*,*,五段・ワ行促音便,連用タ接続,飼う,カッ,カッ
# て   助詞,接続助詞,*,*,*,*,て,テ,テ
# い   動詞,非自立,*,*,一段,連用形,いる,イ,イ
# た   助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
# chunk_id: 3 , chunk_link: 7
# 猫   名詞,一般,*,*,*,*,猫,ネコ,ネコ
# は   助詞,係助詞,*,*,*,*,は,ハ,ワ
# 、   記号,読点,*,*,*,*,、,、,、
# chunk_id: 4 , chunk_link: 5
# とても     副詞,助詞類接続,*,*,*,*,とても,トテモ,トテモ
# chunk_id: 5 , chunk_link: 6
# 美味し     形容詞,自立,*,*,形容詞・イ段,ガル接続,美味しい,オイシ,オイシ
# そう    名詞,接尾,助動詞語幹,*,*,*,そう,ソウ,ソー
# な   助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ
# chunk_id: 6 , chunk_link: 7
# 缶詰    名詞,一般,*,*,*,*,缶詰,カンヅメ,カンズメ
# を   助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
# chunk_id: 7 , chunk_link: -1
# 食べ    動詞,自立,*,*,一段,連用形,食べる,タベ,タベ
# て   助詞,接続助詞,*,*,*,*,て,テ,テ
# い   動詞,非自立,*,*,一段,連用形,いる,イ,イ
# た   助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
# 。   記号,句点,*,*,*,*,。,。,。

for chunk_id in prev_links_dic.keys():
    print(chunk_id, prev_links_dic[chunk_id])
# 2 [0, 1]
# 3 [2]
# 7 [3, 6]
# 5 [4]
# 6 [5]

「クチコミ分析システムの作り方 実践・自然言語処理シリーズ」を読んでる

memo

Seleniumを使って、dl > dt, ddのフォーマットでddが複数あるときのスクレイピング

こういうやつ

<dl>
    <dt></dt>
    <dd></dd>
    <dd></dd>
    <dt></dt>
    <dd></dd>
</dl>

dtとddで1対1かしらとか思ってたけど、そうじゃなかったねめんどくさい。

というわけでゴリ押してみた

def add_values(values, _values):
    if len(_values) > 0:
        values.append(_values)


def get_data(driver):
    ds = driver.find_elements_by_css_selector('dl > *')
    keys = []
    values = []
    _values = []
    n = len(ds)
    i = 0
    while n > i:
        d = ds[i]
        if d.tag_name == 'dt':
            keys.append(d.text)
            add_values(values, _values)
            _values = []
            i += 1
            continue

        if d.tag_name == 'dd':
            _values.append(d.text)
            i += 1
            continue

    add_values(values, _values) 
    return dict(zip(keys, values))

途中でddがきたら、dtが来るまでため続けて、dtがきたらddをvaluesのlistに追加してクリアするを繰り返す。

jqueryみたいにnextとか使えたら。。。って思うけどまぁいいや(多分これで大丈夫なはず)。さっと作ったので多分ボロいはず