ぼろぼろ平原

困った

gensim.corpora.Dictionaryの単語IDを辞書順にする

gensimのcorpora.Dictionaryは単語IDがランダムに振られてしまい困るのでSortableDictionaryというものを作った。

from gensim import corpora

class SortableDictionary(corpora.Dictionary):
    def __init__(self, *arg, **kwargs):
        super().__init__(*arg, **kwargs)

    def sort(self):
        idmap = dict(zip((v for k, v in sorted(self.token2id.items())), range(len(self.token2id))))
        self.token2id = dict((token, idmap[tokenid]) for token, tokenid in self.token2id.items())
        self.id2token = {}
        self.dfs = dict((idmap[tokenid], freq) for tokenid, freq in self.dfs.items())


### 使い方
# corpora.Dictionary(documents) としていたところをこのように置き換える
dictionary = SortableDictionary(documents)

# 辞書順にソートしたいときにsort()を呼び出す
dictionary.sort()

# 元のcorpora.Dictionaryと同じようにファイルに保存できる
dictionary.save_as_text("foo.txt")

# 保存したファイルは元のcorpora.Dictionaryでも読み込める
dictionary = corpora.Dictionary.load_from_text("foo.txt")

Pythonで大きいファイルを読み込む時にプログレスバーを表示

プログレスバーの表示には tqdm を使う。

tqdmのインストール

$ pip install tqdm

プログレスバーを表示するプログラム

from tqdm import tqdm
import os

# ファイル名
filename = "sugoku_dekai_file.txt"

# ファイルサイズを取得
filesize = os.path.getsize(filename)

# ファイルを開く
with open(filename) as f:
    read_size = 0
    # ファイルのサイズを使用しプログレスバーを作成
    with tqdm(total=filesize) as pbar:
        # 行ごとに処理
        for line in f:
            # lineに対して何か処理
            foo(line)
            # 読み込んだサイズを取得して足す
            read_size += len(line.encode('utf-8'))
            # プログレスバーを更新
            pbar.update(read_size)

mecabコマンドの結果をparseしやすい形式にする

MeCabの出力はデフォルトで以下のようになるが、 これが意外と扱いづらい。

$ echo 新しいスクエニのゲームを買った。 | mecab
新しい   形容詞,自立,*,*,形容詞・イ段,基本形,新しい,アタラシイ,アタラシイ
スクエニ    名詞,一般,*,*,*,*,*
の 助詞,連体化,*,*,*,*,の,ノ,ノ
ゲーム   名詞,一般,*,*,*,*,ゲーム,ゲーム,ゲーム
を 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
買っ  動詞,自立,*,*,五段・ワ行促音便,連用タ接続,買う,カッ,カッ
た 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。 記号,句点,*,*,*,*,。,。,。
EOS

LTSV形式での出力

MeCabのオプションを変更すると、以下のようにLTSV形式で出力できる。

$ echo 新しいスクエニのゲームを買った。 | mecab -F "surface:%m\tpos:%f[0]\tpos1:%f[1]\tpos2:%f[2]\tpos3:%f[3]\tcform:%f[4]\tctype:%f[5]\tbase:%f[6]\tread:%f[7]\tpron:%f[8]\n" -U "surface:%m\tpos:%f[0]\tpos1:%f[1]\tpos2:%f[2]\tpos3:%f[3]\tcform:%f[4]\tctype:%f[5]\tbase:%f[6]\tread:\tpron:\n" -E ""
surface:新しい   pos:形容詞   pos1:自立 pos2:   pos3:   cform:形容詞・イ段    ctype:基本形 base:新しい  read:アタラシイ    pron:アタラシイ
surface:スクエニ    pos:名詞  pos1:一般 pos2:   pos3:   cform:  ctype:  base:   read:   pron:
surface:の pos:助詞  pos1:連体化  pos2:   pos3:   cform:  ctype:  base:の    read:ノ    pron:ノ
surface:ゲーム   pos:名詞  pos1:一般 pos2:   pos3:   cform:  ctype:  base:ゲーム  read:ゲーム  pron:ゲーム
surface:を pos:助詞  pos1:格助詞  pos2:一般 pos3:   cform:  ctype:  base:を    read:ヲ    pron:ヲ
surface:買っ  pos:動詞  pos1:自立 pos2:   pos3:   cform:五段・ワ行促音便  ctype:連用タ接続   base:買う read:カッ pron:カッ
surface:た pos:助動詞   pos1:   pos2:   pos3:   cform:特殊・タ  ctype:基本形 base:た    read:タ    pron:タ
surface:。 pos:記号  pos1:句点 pos2:   pos3:   cform:  ctype:  base:。    read:。    pron:。

Touch Bar付きのMacBookでMinecraftをプレイするときに常にファンクションキーを表示する

MacBookのTouch Bar搭載モデルでMinecraftをプレイするときに、ファンクションキーを表示しておく方法です。

f:id:tatzyr:20161120234004g:plain

手順

  1. Minecraftを起動する
  2. Dockにある作業台アイコンをcommandキーを押しながらクリックするf:id:tatzyr:20161120222205p:plain
  3. Finderでjavaが選択されるので、右クリックして["java"をコピー]をクリックするf:id:tatzyr:20161120213927p:plain
  4. Minecraftを終了させる
  5. ターミナルをLaunchpadから起動する。(Launchpadで「te」と検索すると見つかる)f:id:tatzyr:20161120213555p:plain
  6. ターミナルでcommand+Vを押す。すると、 /Applications/Minecraft.app/Contents/runtime/jre-x64/1.8.0_74/bin/javaのような文字列が貼り付けられるf:id:tatzyr:20161120214533p:plain
  7. 先頭にcd を追加(cdの後のスペースも重要!)して、末尾の/javaを削除するf:id:tatzyr:20161120214549p:plain
  8. Enterキーを押して実行する
  9. 以下のコマンドを順に入力し、Enterキーを押して実行する
    • mv java java.app
    • ln -s java.app java f:id:tatzyr:20161120214856p:plain
  10. [システム環境設定]→[キーボード]→[ショートカット]→[ファンクションキー]→[+ボタン]をクリックする f:id:tatzyr:20161120221134p:plain
  11. 出てきたウインドウに、2で開いたFinderにある「java」をドラッグアンドドロップする(ショートカットの矢印がついていないほう) f:id:tatzyr:20161120224533p:plain
  12. 追加ボタンをクリックする

元に戻す手順

  1. 上の手順の8までを実行する
  2. 以下のコマンドを入力し、Enterキーを押して実行する
    • mv java.app java
  3. [システム環境設定]→[キーボード]→[ショートカット]→[ファンクションキー]→[−ボタン]をクリックする

以上。

関連記事

tatzyr.hatenablog.com

tatzyr.hatenablog.com

Linuxbrewでsqliteを入れたのにgem install sqlite3が失敗した時の対処法

Linuxbrewsqliteを入れたあと、 $ gem install sqlite3を実行すると「sqlite3.hが見つからない」というエラーメッセージが出て失敗する。

$ gem install sqlite3
Building native extensions.  This could take a while...
ERROR:  Error installing sqlite3:
    ERROR: Failed to build gem native extension.

そういう時は以下のようにLinuxbrewで入れたsqliteのパスを指定してあげればOK。

$ gem install sqlite3 -- --with-opt-dir=`brew --prefix sqlite`

Rubyで大きいファイルを読み込む時に進捗を表示

f:id:tatzyr:20160713144219g:plain

ruby-progressbar というgemを使うとプログレスバーを表示できる。

ruby-progressbarのインストール

$ gem install ruby-progressbar

進捗を表示しつつファイルを読むプログラム

require "ruby-progressbar"

# ファイル名
filename = "sugoku_dekai_file.txt"

# ファイルサイズを取得しプログレスバーを作成
progressbar = ProgressBar.create(total: FileTest.size(filename))

# ファイルを開いて行ごとに処理
open(filename) do |f|
  f.each_line do |line|
    # lineに対してなにか処理
    foo(line)

    # プログレスバーを更新
    progressbar.progress = f.pos
  end
end

# 最後にプログレスバーを100%にする
progressbar.finish

ぼっちWikiに最適なGollum

GollumはデータベースにGitを使い、Markdownで書けるWiki

Gollumの特徴は以下の通り。

  • シンタックスハイライト数式に対応している
  • 様々な記法で書ける
  • gemコマンドで簡単にインストールできる
  • データベースとしてGitを使うのでMySQLなどが不要
  • RubySinatraで実装されている
  • Rubyでマクロを書いて拡張できる

Gollumのインストール

ICUという文字コード変換ライブラリに依存しているのでまずはそれをインストール。

# OS Xの場合
$ brew install icu4c

# Debian/Ubuntuの場合
$ sudo apt-get install libicu-dev

続いて、Gollum本体をインストール。

$ gem install github-markdown gollum

Gollumの起動

$ git init # 初回だけ
$ gollum --mathjax --config auth.rb --allow-uploads

認証の設定

ぼっちWikiなので、他人に内容を見られてしまっては困る。

Gollumは普通のSinatraアプリと同じように、認証をつけることができる。

たとえばこんな感じのauth.rbを作成するとBasic認証を追加できる。

module Precious
  class App < Sinatra::Base
    use Rack::Auth::Basic, "Restricted Area" do |username, password|
      [username, password] == ["foo", "bar"]
    end
  end
end

Basic認証&ファイルにパスワード直書きなので、盗聴やパスワード漏洩の可能性がある。あくまでも気休め。