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:「>」とかはタグの記号なので、たくさんある