読者です 読者をやめる 読者になる 読者になる

専門用語の辞書の加工

Ruby R

こんな感じになっている辞書から

zygoma	(解剖)頬骨
zygomatic	頬骨の
zygomycete	(生物)接合菌
zygomycosis	(病名)接合菌症
zygote	接合体, 接合子
zygote nuclei	(解剖)《複》接合体核
zygote nucleus	(解剖)接合体核
zygotene	合糸期, ザイゴテン期
zygotene stage	合糸期, ザイゴテン期
zygotic	接合子の, 接合体の
zygotic effect	接合体効果
zymogen	酵素前駆体, 酵素原, チモーゲン
zymogram	酵素電気泳動像, ザイモグラム
zymograph	酵素電気泳動, ザイモグラフ
zymographic	酵素電気泳動の, 酵素電気泳動法の, ザイモグラフの
zymography	酵素電気泳動法, ザイモグラフィ

日本語のやつを使える形で加工するRubyスクリプト。

# -*- coding: utf-8 -*-

f = File.open("/Users/yasuhisa/Desktop/lsd/Lsd4-EJ.txt","r")

words = []

f.each{|line|
  str = line.split(/\t/)[1]
  if str =~ /.*?/
    str.gsub!(/.*?/){}
  end
  if str =~ /.*?/
    str.gsub!(/.*?/){}
  end 
  str.split(/, /).each{|item|
   words.push item 
  }
}
f.close

words.each{|item|
  puts item
}

ファイルに結果を送って

/tmp% ruby split.rb > ~/Desktop/lsd.txt

MeCabの辞書には登録されていないけど、こっちの辞書では持っている、というものの量がどれくらいあるのかを見てみる。

> d <- scan("~/Desktop/lsd.txt",what="character")
Read 50847 items
> sum(sapply(d,function(x){
+   length(RMeCabC(x)) == 1
+ })) / length(d) * 100
[1] 28.83356

約3割くらいは突っこんで意味がありそうな感じだなーということが分かった。

追記

辞書側に「地衣地衣類苔癬苔癬状の」というような*1形容詞がかなり含まれているっぽいので、「〜の」というような形容詞を取り除くことにした。日本語を一文字として扱うのにKCODEがいるということを思い出すのに時間がかかった。。。

# -*- coding: utf-8 -*-
$KCODE = "UTF-8"

f = File.open("/Users/yasuhisa/Desktop/lsd/Lsd4-EJ.txt","r")

words = []

f.each{|line|
  str = line.split(/\t/)[1]
  if str =~ /.*?/
    str.gsub!(/.*?/){}
  end
  if str =~ /.*?/
    str.gsub!(/.*?/){}
  end 
  str.split(/, /).each{|item|
   words.push item 
  }
}
f.close

words.each{|item|
  if item.chomp.split("").pop == ""
    words.delete(item)    
  end
}

words.each{|item|
  print item
}

これをやった上で、MeCabのと比較すると

> d <- scan("~/Desktop/lsd.txt",what="character")
Read 33080 items
> sum(sapply(d,function(x){
+   length(RMeCabC(x)) == 1
+ })) / length(d) * 100
[1] 23.53386

5%くらい下がった。あとは「〜する」とかいうような動詞もあったりするんだけど、とりあえずあとはこれの応用か。

*1:なんて読むのかは分からないけど