今日の作業log

igraphのようにグラフを表示してくれるパッケージがあるようなので使ってみる。文章間の関係性をごにょごにょするのに、なんかやってみようかと思っている。この前のターム文章行列から何かできれば、という感じです。

source("http://bioconductor.org/biocLite.R")
biocLite(c("graph","Rgraphviz","RBGL"))
library(graph)
library(Rgraphviz)

描画に使うgraphviz自体は別にインストールが必要らしいので、Macだとここから落としてくる。

品詞に限って、登場順で抽出

この前のところでは品詞とか全く考えないで、ヒストグラムを書いていたので、名詞に限ってやってみる。あと登場回数が多いような単語がどういうのかを調べる。

まず名詞だけ取ってくる。listの中から名詞のやつだけを引っぱってくるのにFilter関数とかがどんぴしゃだった。

setwd("~/dbcls/txt")
l <- list()

for(file in list.files(".")){
  for(text_i in unlist(lapply(Filter(function(x){
    ifelse(x[2]=="名詞",TRUE,FALSE)
  },RMeCabText(file)),function(x){
    x[1]
  }))){
    if(is.null(unlist(l[text_i]))){
      l[text_i] <- file
    }else{
      l[text_i] <- list(c(unlist(l[text_i],use.names=FALSE),file))
    }
  }
}

で、どういう名詞が登場回数が多いか見てみる。

> tail(sort(unlist(lapply(Filter(function(x){
+   length(x) > 100
+ },l),length))),30)
    性   文中 見出し      3   分子   蛋白     質 遺伝子   分裂     中     ^< 
   296    299    299    299    306    319    327    330    361    365    365 
    .,     的    Wnt      /      :      2</      <1 
   411    416    423    488    495    505    542    610    630    681    774 
  こと      -      >      (      )   細胞      .      , 
   825   1269   1283   1361   1381   2011   3344   6391 

記号とかその辺がまだまじっているし*1、蛋白質とかがちぎれてしまっているのがあれだなあ。まあ、MeCabの辞書を使っているから仕方ないといえば仕方ないんだけど。専門単語がぶちぎれてしまうやつの解決策としては

  • MeCabの辞書を専門用語を入れてupdateする
  • N-gramでやる

とかが考えられるかなあ。MeCabにさらにつっこむ用の辞書が必要だったり、N-gramだと名詞だけ取ってくるとかが難しくなりそうなど、それはそれで問題にはなりそうなんだけど。

txtから適当なところを取り出すRubyスクリプト

タイトルと要旨と本文を抜き出す。

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

def extract(str)
  title = ""
  abstract = ""
  body = ""
  str.gsub!(/\n/,"")
  if str =~ /<日本語タイトル>(.*?)<\/日本語タイトル>/
    title = $1
  end
  if str =~ /<要旨>(.*?)<\/要旨>/
    abstract = $1
  end
  if str =~ /<本文>(.*?)<\/本文>/
    body = $1
    body.gsub!(/<.*?>.*?<\/.*?>/,"")
  end
  return {"title"=>title, "abstract"=>abstract, "body"=>body}
end

Dir.chdir("/Users/yasuhisa/dbcls/txt")

Dir.glob("*.txt").each{|f|
  new_txt = File.basename(f,".txt").sub("\.txt","") + "_extract" + ".txt"
  puts new_txt
  content = extract(File.open(f,"r").read)
  new_txt = File.open(new_txt,"w")
  new_txt.puts content["title"] + content["abstract"] + content["body"]
  new_txt.close
}

pneのpdfとtxtが20年分あるやつからtxtを収集すべく、Rubyででっちあげる。

(1985..2006).each{|year|
  puts "mkdir #{year}"
}

(1985..2006).each{|year|
  puts "cp #{year}*/**/*.txt ~/dbcls/pne/#{year}"
}

memo

  • online life science dictionary
    • 専門用語用の辞書
  • 取ってくるフィールド:日本語タイトル、要旨、本文→キャプションとかのフィールドを取り除く
    • Rubyの正規表現とかでextractしてくる
  • 年度ごとに特徴のあるような単語を探ってくる

おわた\(^o^)/

テキストの量が多くてRが落ちてしまうという自体が発生。。。一年分とかでそうなので、使えるメモリを増やしても根本的な解決にならないと思われる。。。

うーん、PythonとかC++でやってみるかなあ。。。

*1:「>」とかはタグの記号なので、たくさんある