Hatena::ブログ(Diary)

はけの徒然日記 このページをアンテナに追加 RSSフィード

2005 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 04 | 05 | 08 | 09 | 10 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 | 11 |
2011 | 01 | 02 | 03 | 04 | 11 | 12 |
2012 | 02 | 03 | 05 |
2014 | 02 | 03 | 04 | 05 | 12 |
2015 | 05 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 04 | 05 | 08 | 09 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 |
2018 | 02 | 03 | 04 | 05 |

2016-01-18(Mon)

Rubyで形態素解析

最初MeCab+nattoで試したのですが、MeCabサイトで公開されているライブラリは64bit Rubyでは動作しませんでした。他はないのかと検索したところ、こちらRubyによる形態要素エンジンokura(注:ocraではない)が公開されていましたので早速インストール

公開サイトでは、ruby1.9専用と書かれていますが、こちらの動作環境Windows 10 64bit / ruby 2.2.3p173 (2015-08-18 revision 51636) [x64-mingw32])でも問題は無い様です。



公開サイトおよび入手先


導入

gem install okura
okura compile mecab-naist-jdic-0.6.3b-20111013/ okura-dic

公開サイトのサンプルプログラムの実行

okuraは文字コードutf-8使用するので、入出力でcp932(Windows-31J)とのエンコード必要

#coding: cp932
require 'okura/serializer'

dict_dir='./okura-dic' # コンパイルした辞書フォルダの置き場所
tagger=Okura::Serializer::FormatInfo.create_tagger dict_dir

str='すもももももももものうち'.encode('utf-8')

# 文字列から単語候補を計算
nodes=tagger.parse(str)

# 単語候補の中で、一番最もらしい組み合わせを選択
nodes.mincost_path.each{|node|
  word=node.word
  s = ('     ' + word.surface.encode('cp932'))[-5..-1] # 空白は全角スペース
  s << ' '
  s << word.left.text.encode('cp932')
  puts s

# word.surface        # : 単語の表記
# puts word.left.text # : 品詞
# 品詞はword.leftとword.rightがありますが、一般的に使われる辞書(IPA辞書やNAIST辞書)では
# 両方同じデータが入ってます
}

実行結果

C:\okura>ruby test.rb
1589586
S/EOS BOS/EOS
  すもも 名詞,一般,*,*,*,*,*
    も 助詞,係助詞,*,*,*,*,も
   もも 名詞,一般,*,*,*,*,*
    も 助詞,係助詞,*,*,*,*,も
   もも 名詞,一般,*,*,*,*,*
    の 助詞,連体化,*,*,*,*,の
   うち 名詞,非自立,副詞可能,*,*,*,*
S/EOS BOS/EOS

2014-12-14(Sun)

RubyGemsが使用できない

RubyGems使用しようとして、ここ数日使用できなくなっていることに気が付きました。

発生を確認したのはRubyInstallerのruby2.1.4とRumix2のruby2.0.0です。

C:\>gem search rails

*** REMOTE GEMS ***
(結果が表示されない)


C:\>gem update --system
ERROR:  While executing gem ... (Gem::RemoteFetcher::FetchError)
    SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (https://api.rubygems.org/specs.4.8.gz)

軽く検索したら12月の頭頃にサーバが落ちたみたいな記録がみつかったので、それが継続しているのかと思いましたが、どうもそうではないらしい。

エラーメッセージ検索したらSSLアップデートに関する変更があったらしいです。とりあえずここ記述に従って、new trust certificateファイルを入手して指定ディレクトリコピーしたら使用できるようになりました。

2014-05-11(Sun)

Ruby/Tk サブウィンドウの作成

サブウィンドウ用のメソッドopen_sub_windowを作成して、このメソッド内でサブウィンドウのウィジェットを配置して作成します

ルートウィンドウ側との情報のやり取りについて、最初はメソッドの引数と返り値で行おうとしましたが、メソッド自体は直ぐに終了してしまうため不可でした。この為グローバル変数$swによって行う様にします

サブウィンドウのベースはTkToplevelを使用ます。またサブウィンドウを開いている間にルートウィンドウへの操作を不可にするために、TkToplevel#grab_setを実行します。サブウィンドウ閉じるときは、TkToplevel#destroyを実行。


#coding: Windows-31J
require "tk"

# サブウィンドの設定を保存する変数
$sw = TkVariable.new_hash
# 初期設定
$sw[:status] = :INIT
$sw[:entry]  = ''
#$sw[:radio]  = 'item_r0'
$sw[:radio]  = ''
$sw[:check0] = '1'
$sw[:check1] = '0'
$sw[:check2] = '0'

#
# Sub Window
#
def open_sub_window
p 'method start'

  $sw[:status] = :OPEN
  base = TkToplevel.new(nil, title: 'Sub Window')
  # Root Windowの操作を禁止する
  base.grab_set

  e = TkEntry.new(base).pack(side: :top, fill: :x)
  e.value = $sw[:entry]
  flame = TkFrame.new(base).pack
  f_left  = TkLabelFrame.new(flame) do
    text('RadioButton')
    pack(side: :left)
  end
  f_right = TkLabelFrame.new(flame) do
    text('CheckButton')
    pack(side: :left)
  end
  TkButton.new(base) do
    text('close')
    # Entry入力文字を$swにコピーしてから、ウィンドウを閉じる
    command( proc do
               $sw[:entry]  = e.value
               $sw[:status] = :CLOSE
               base.destroy
             end
    )
    pack(fill: :x)
  end

  3.times.each do |i|
    TkRadioButton.new(f_left) do
      text  "item_r#{i}"
      value "item_r#{i}"
      variable $sw.ref(:radio)
      select if i == 0          # 初期設定
      pack(side: :top)
    end
  end

  TkCheckButton.new(f_right, text:'item_c0', variable: $sw.ref(:check0)).pack
  TkCheckButton.new(f_right, text:'item_c1', variable: $sw.ref(:check1)).pack
  TkCheckButton.new(f_right, text:'item_c2', variable: $sw.ref(:check2)).pack
  
p 'method end'
end

#
# Root Window
#

TkRoot.new.title('サブウィンドウへのアクセス')

txt = TkText.new
txt.pack(side: :top)

btn1 = TkButton.new do
  text('Open Sub Window')
  # サブウィンドウを開く
  command(
    proc do
      open_sub_window
    end
  )
  pack(side: :left, fill: :x)
end

btn2 = TkButton.new do
  text('Result')
  # $swの値を表示する
  command(
    proc do
      txt.value  = "入力した文字は、#{$sw[:entry]}です。\n"
      txt.value += "ラジオボタンは、#{$sw[:radio]}が選択されています。\n"
      txt.value += "item_c0が選択されています。\n" if $sw[:check0] == '1'
      txt.value += "item_c1が選択されています。\n" if $sw[:check1] == '1'
      txt.value += "item_c2が選択されています。\n" if $sw[:check2] == '1'
    end
  )
  pack(side: :left, fill: :x)
end

Tk.mainloop