wikipediaのデータでdoc2vec

doc2vecでWikipediaを学習する - TadaoYamaokaの日記

を参考に、wikipediaのデータをdoc2vecでトレーニングし、類似単語を調べてみました。

総単語数 2,890,010
頻度10以下 2,364,440
残り単語数 525,570

doc2vecは、トレーニングした単語をmodel.wv.vocabで参照することができます。 単語数が、残り単語数の約半分になっているのは、出現頻度が少ない単語が出現している文を削除した時に別の単語も削除しているからでしょう。

>>> len(model.wv.vocab)
266732

トレーニングした単語は、word_vector(keyedvectors)に辞書形式で保存されます。

>>> model.wv.vocab
'カウンダ': <gensim.models.keyedvectors.Vocab object at 0x1143776d8>,
'持ち場': <gensim.models.keyedvectors.Vocab object at 0x10d97e208>,

結果は、(当然ですが)参考にした記事とほぼ同じになりました。

>>> model.most_similar('リンゴ')
[('花', 0.6139837503433228),
 ('トマト', 0.6134904623031616),
 ('ワイン', 0.6084833145141602),
 ('酒', 0.5981301665306091),
 ('果物', 0.5930838584899902),
 ('コーヒー', 0.5895085334777832),
 ('子供', 0.5830855965614319),
 ('果実', 0.5804908275604248),
 ('ビール', 0.5784652233123779),
 ('食べ物', 0.5778894424438477)]

>>> model.most_similar(positive=["ザク", "ガンダム"])
[('ms', 0.7442907094955444),
 ('モビルスーツ', 0.6582286357879639),
 ('モンスター', 0.652472734451294),
 ('x', 0.6502348184585571),
 ('機体', 0.6486747860908508),
 ('マシン', 0.6468290090560913),
 ('ロボット', 0.6423962712287903),
 ('cpu', 0.6389658451080322),
 ('戦闘機', 0.6290717124938965),
 ('ゲーム', 0.6265822649002075)]

>>> model.most_similar(positive=["猫"], negative=["フレンズ"])
[('動物', 0.6338815689086914),
 ('子供', 0.6299443244934082),
 ('人間', 0.6273439526557922),
 ('親', 0.6224128007888794),
 ('ネズミ', 0.6112015247344971),
 ('犬', 0.6050996780395508),
 ('自分', 0.598896324634552),
 ('魚', 0.5975416302680969),
 ('家族', 0.5973026752471924),
 ('が', 0.5970552563667297)]

ひらがなにすると結果が異なるもが興味深いです。リンゴの場合、カタカナ表記する語彙(トマト、ワイン、コーヒー、ビール)を使うコンテキストで用いられるのでしょうか?

>>> model.most_similar('りんご')
[('みかん', 0.5127906203269958), 
 ('桃', 0.479043573141098), 
 ('さくら', 0.45111995935440063), 
 ('リンゴ', 0.44701433181762695), 
 ('ラーメン', 0.42265254259109497), 
 ('梅', 0.4148010015487671), 
 ('ひまわり', 0.41388049721717834), 
 ('夏祭り', 0.3995071053504944), 
 ('弥生', 0.396240234375), 
 ('祭り', 0.3920435905456543)]

リンク

collection型のソート(Python)

Pythonでcollection型のソートにはOrderedDicを使う。

>>> from collections import OrderedDict
>>> # regular unsorted dictionary
>>> d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}

>>> # dictionary sorted by key
>>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])

>>> # dictionary sorted by value
>>> OrderedDict(sorted(d.items(), key=lambda t: t[1]))
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])

リンク

wikipediaのデータでdoc2vec(UnicodeDecodeError)

doc2vecを使ってとあるコーパスのドキュメント類似度を取得してみましたが、思ったような結果が得られませんでした。

そこで、doc2vecの記事が同じように検証できるのか調べてみました。 まずは、これです。

doc2vecでWikipediaを学習する - TadaoYamaokaの日記

手順「頻度の少ない単語を除外する」でUnicodeDecodeErrorが発生しました。

Mecab分かち書きしたwikipediaのデータをpythonで読み込む時に、UnicodeDecodeErrorが発生しました。

$ python ../../../../extract_low_freq_terms.py wiki_wakati.error wiki_lf_terms.1
Traceback (most recent call last):
  File "../../../../extract_low_freq_terms.py", line 12, in <module>
    for line in open(args.input, "r", encoding="utf-8"):
  File "/Users/unokun/.pyenv/versions/anaconda3-4.1.1/lib/python3.5/codecs.py", line 321, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe3 in position 5844: invalid continuation byte

python、UnicodeDecodeErrorで検索しましたが、それらしい記事は見つかりませんでした。

原因は、mecabによる分かち書きで、バッファサイズが足らなかったことが原因でした。バッファサイズを多くとるとそれ以降の処理を問題なく実行することができました。

mecabはバッファサイズを越えた時点で処理をするため、1文字分のデータを出力していないのだと思います。

変更前
$ mecab -O wakati wiki -o wiki_wakati.error
input-buffer overflow. The line is split. use -b #SIZE option.

変更後
$ mecab -b 100000 -O wakati wiki -o wiki_wakati.error

同じくwikipediaのデータを使っている

word2vecで遊ぶ – Eyepod touch

が参考になりました。

リンク

Xamarinをアンインストールしました(MacOS X)

ディスクの空き容量が少なくなってきたので、不要なファイルを削除しました。

インストールしたVisual Studio for Macはすぐ削除したのだけれど、残党(Xamarin)が残っていました。

以下のリンクを参考に手動!削除しました。 ディスク空き容量が10GBくらい増えました。

Android SDKも削除しようかな〜。

リンク

seleniumを使ったスクレイピング(Python)

手順

seleniumのインストール

pip install selenium

WebDriverのインストール

Seleniumのサイトから各種ブラウザのWebDriverをダウンロードすることができます。

Google Chrome Driverを使いましたが、 自動テストにはPhantomJSの方が便利かもしれません。

Downloads - ChromeDriver - WebDriver for Chrome

使う

ボタン押下などの操作を記述することもできます。

driver = webdriver.Chrome(ダウンロードしたWebDriverのパス)

# Web APIを使ってDOMアクセスする
# driver.open(アクセスする対象URL)
# elem = driver.find_element_by_id(ID)
# テキスト要素取得
#elem.text

# ブラウザを閉じる
driver.quit()

Tips

XPathの書き方

# ドキュメントルートから要素を検索します
driver. find_elements_by_xpath(‘//div[@class=“container”])

element = driver.find_element_by_id(‘top’)
# 子要素から対象のXPath要素を検索します
element.find_elements_by_xpath(‘.//div[@class=“container”])

# ドキュメントルートから対象のXPath要素を検索します
element.find_elements_by_xpath(‘//div[@class=“container”])

要素がない場合の処理

要素がない場合は、NoSuchElementExceptionがストーされるので処理します。

    # 例外のimportが必要
    from selenium.common.exceptions import NoSuchElementException

    try:
        elemement = driver.find_element_by_class_name(クラス名)
        処理
    except NoSuchElementException:
        例外発生時の処理

スクリーンショット

エビデンスを残す場合に便利です。不具合が発生した時に確認するのには便利ですが、開発時にチェックするのは…あれですね。

driver.save_screenshot(“scenario_1-1")

ソース取得

回帰テストに使えます。

driver. page_source

リンク

ファイル保存時にディレクトリがなければ作成する(Python)

ファイル保存時にディレクトリがなければ作成する処理は以下のように書く。

def save_text(path, text):
    # ディレクトリが存在しなければ作成する
    path_dir = os.path.dirname(path)
    if not os.path.exists(path_dir):
        # makedirsは途中のディレクトがない場合作成します
        os.makedirs(path_dir)

    # ファイル保存(上書き)
    f = open(path,'w')
    f.write(text)
    f.close()

リンク

MacOSXにMecabインストール

fasttextを試すため、Mac OS X(Sierra)にMecabをインストールした。

pythonのバージョンは3.5.2

$ python --version
Python 3.5.2 :: Anaconda 4.1.1 (x86_64)

手順

mecab-python3をインストール

pip install mecab-python3

mecab+ipadicをインストール

brew install mecab-ipadic

辞書(mecab-ipadic-NEologd)もインストールした。

多数のWeb上の言語資源から得た新語を追加することでカスタマイズした MeCab 用のシステム辞書

ネット上で流行した単語や慣用句やハッシュタグをエントリ化したデータ

実行

$ mecab -d /usr/local/lib/mecab/dic/mecab-ipadic-neologd
ピコ太郎
ピコ太郎    名詞,固有名詞,人名,一般,*,*,ピコ太郎,ピコタロウ,ピコタロー
$ python
Python 3.5.2 |Anaconda 4.1.1 (x86_64)| (default, Jul  2 2016, 17:52:12)
[GCC 4.2.1 Compatible Apple LLVM 4.2 (clang-425.0.28)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import MeCab
>>> mecab = MeCab.Tagger()
>>> print(mecab.parse("ピコ太郎"))
ピコ太郎    名詞,固有名詞,人名,一般,*,*,ピコ太郎,ピコタロウ,ピコタロー
EOS

Links