Rで解析:便利!Rで読み込むxmlファイル

Rの解析に役に立つ記事
スポンサーリンク

PubMedは文献検索サイトで検索結果をxmlで出力できます。xmlはRで編集が可能なので、PubMed検索結果のxmlから論文タイトルとアブストラクトを読み込み、タグプロットと単語の出現数をまとめたcsvを出力するコードを作成しました。なお、PubMed以外のxmlファイルでもRで操作が可能なので参考例としてご覧ください。


スポンサーリンク

解析の前準備

パッケージの導入

  • XMLファイルの操作に必要な”XML”
  • 英語のテキストマイニングに必要な”tm”
  • タグクラウドに必要な”wordcloud”
  • 色の設定に必要な”RColorBrewer”

*パッケージの一括導入は下記コードで可能です。

install.packages(c("XML", "tm", "wordcloud", "RColorBrewer"))

なお、install.packages(パッケージ名)にすることで個別にインストールができます。

xmlファイルのダウンロード

  1. PubMedにアクセスする。http://www.ncbi.nlm.nih.gov/pubmed
  2. 検索する。
  3. 検索結果の右上に表示されるSend toをクリックしFile→FormatをxmlとしCreate Filを押す。そうすると、xmlファイルがダウンロードできます。

コードの実行

コードを実行すると、読み込むxmlファイルと保存先フォルダの確認があります。結果は保存先フォルダに、論文タイトルとアブストラクトそれぞれの単語出現数をまとめたcsvファイルとタグプロットが出力されます。詳細はコードにコメントを記述していますのでご確認ください。

###ライブラリーの読み込み#####
library("tcltk")
library("XML")
library("tm")
library("wordcloud")
library("RColorBrewer")
########

###タグクラウドのテキストの色を設定#####
Col <- brewer.pal(8, "Dark2") #&#25991;&#23383;&#33394;&#12398;&#25351;&#23450;
########

###&#12503;&#12525;&#12483;&#12488;&#12377;&#12427;&#21336;&#35486;&#12398;&#20986;&#29694;&#25968;&#35373;&#23450;&#12290;"&#35542;&#25991;&#12479;&#12452;&#12488;&#12523;", "&#12450;&#12502;&#12473;&#12488;&#12521;&#12463;&#12488;"&#12398;&#35373;&#23450;&#12391;&#12377;&#12290;&#20197;&#19978;&#12391;&#12398;&#25277;&#20986;&#32080;&#26524;&#12392;&#12394;&#12426;&#12414;&#12377;&#12290;#####
WordFreq <- c(5, 15)
########

###&#12487;&#12540;&#12479;&#12398;&#35501;&#12415;&#36796;&#12415;#####
selectAXlm <- paste(as.character(tkgetOpenFile(title = "xml&#12501;&#12449;&#12452;&#12523;&#12434;&#36984;&#25246;",filetypes = '{"xml&#12501;&#12449;&#12452;&#12523;" {".xml"}}',initialfile = "*.xml")), sep = "", collapse =" ")
MasterAnaData <- xmlInternalTreeParse(selectAXlm)
########

###&#32080;&#26524;&#20445;&#23384;&#20808;&#12398;&#12501;&#12457;&#12523;&#12480;&#12434;&#35373;&#23450;#####
SaveDir <- as.data.frame(paste(as.character(tkchooseDirectory(title = "&#12487;&#12540;&#12479;&#20445;&#23384;&#12501;&#12457;&#12523;&#12480;&#12434;&#36984;&#25246;"), sep = "", collapse =" "))) #&#21021;&#26399;dirpath&#12398;&#21462;&#24471;&#28310;&#20633;
SaveDir <- paste(SaveDir[1:(nrow(SaveDir)),], sep = " ", collapse = "/" ) #&#20445;&#23384;path&#12398;&#21462;&#24471;
setwd(SaveDir)
########

###xml&#12501;&#12449;&#12452;&#12523;&#12363;&#12425;&#35542;&#25991;&#12479;&#12452;&#12488;&#12523;&#12392;&#12450;&#12502;&#12473;&#12488;&#12521;&#12463;&#12488;&#12434;&#25277;&#20986;#####
###xml&#12398;&#25805;&#20316;&#12399;&#35201;&#32032;&#21517;&#12434;&#25277;&#20986;&#12375;&#12289;&#12381;&#12398;&#20516;&#12434;&#12414;&#12392;&#12417;&#12427;&#12371;&#12392;&#12364;&#22810;&#12356;&#12392;&#24605;&#12356;&#12414;&#12377;&#12290;&#22810;&#12367;&#12399;xpathSApply()&#12391;&#35036;&#12360;&#12427;&#12392;&#24605;&#12356;&#12414;&#12377;&#12290;&#22810;&#12367;&#12398;&#35201;&#26395;&#12364;&#12354;&#12428;&#12400;xml&#12521;&#12452;&#12502;&#12521;&#12522;&#12398;&#12467;&#12510;&#12531;&#12489;&#12434;&#12414;&#12392;&#12417;&#12424;&#12358;&#12363;&#12394;&#12392;&#24605;&#12356;&#12414;&#12377;&#12290;#####

Title <- as.data.frame(xpathSApply(MasterAnaData, "//ArticleTitle", xmlValue)) #&#35542;&#25991;&#12479;&#12452;&#12488;&#12523;&#12398;&#25277;&#20986;
Abstract <-as.data.frame(xpathSApply(MasterAnaData, "//AbstractText", xmlValue)) #&#12450;&#12502;&#12473;&#12488;&#12521;&#12463;&#12488;&#12398;&#25277;&#20986;
########

AnaList <- c("Title", "Abstract") #&#25277;&#20986;&#12377;&#12427;&#12487;&#12540;&#12479;&#21517;&#12395;&#12424;&#12426;&#22793;&#26356;

for(i in seq(AnaList)){
  
  ###&#12486;&#12461;&#12473;&#12488;&#12510;&#12452;&#12491;&#12531;&#12464;&#12398;&#35373;&#23450;&#12289;&#12362;&#22909;&#12415;&#12395;&#21512;&#12431;&#12379;&#12390;&#12367;&#12384;&#12373;&#12356;#####
  CorMaster <- Corpus(DataframeSource(eval(parse(text = AnaList[i])))) #&#12467;&#12540;&#12497;&#12473;&#12398;&#20316;&#25104;
  CorMaster <- tm_map(CorMaster, stripWhitespace) #&#31354;&#30333;&#12398;&#21066;&#38500;
  CorMaster <- tm_map(CorMaster, removeNumbers) #&#25968;&#23383;&#12398;&#21066;&#38500;
  CorMaster <- tm_map(CorMaster, removePunctuation) #&#21477;&#35501;&#28857;&#12398;&#21066;&#38500;
  CorMaster <- tm_map(CorMaster, removeWords, stopwords("english")) #and, or&#31561;&#12398;&#21066;&#38500;
  TermVec <- DocumentTermMatrix(CorMaster) #&#12479;&#12540;&#12512;&#12510;&#12488;&#12522;&#12483;&#12463;&#12473;&#12398;&#38598;&#35336;
  ########
  
  ###&#21336;&#35486;&#35299;&#26512;&#32080;&#26524;&#12434;&#12487;&#12540;&#12479;&#12501;&#12524;&#12540;&#12512;&#21270;#####
  AnalyticsAllWords <- as.data.frame(apply(TermVec, 2, sum)) #&#21336;&#35486;&#12398;&#20986;&#29694;&#29575;&#12434;&#38598;&#35336;
  AnalyticsAllWords <- cbind(rownames(AnalyticsAllWords), AnalyticsAllWords)
  AnalyticsAllWords <- subset(AnalyticsAllWords, !(AnalyticsAllWords[, 1] %in% c("chlorella", "the", "this", "can", "thus", "these")) )#&#38500;&#21435;&#12375;&#12383;&#12356;&#21336;&#35486;&#12434;&#35373;&#23450;
  AnalyticsAllWords <- AnalyticsAllWords[sort.list(AnalyticsAllWords[, 2], decreasing=TRUE),] #&#20986;&#29694;&#25968;&#12434;&#38477;&#38918;&#12391;&#20006;&#12403;&#26367;&#12360;
  AnalyticsWords <- subset(AnalyticsAllWords, AnalyticsAllWords[, 2] &gt;= WordFreq[i]) #&#25351;&#23450;&#12375;&#12383;&#25968;&#20197;&#19978;&#12391;&#25277;&#20986;
  colnames(AnalyticsAllWords) <- c("&#21336;&#35486;", "&#20986;&#29694;&#25968;") #&#34892;&#21517;&#12398;&#35373;&#23450;
  ########
  
  png(paste(AnaList[i], ".png", seq = ""), width = 1280, height = 800) #plot&#12434;png&#12391;&#20445;&#23384;
  ###&#12479;&#12464;&#12463;&#12521;&#12454;&#12489;&#12398;&#12503;&#12525;&#12483;&#12488;#####
  wordcloud(AnalyticsWords[, 1], AnalyticsWords[, 2], scale=c(8,.2),
            random.order = FALSE, rot.per = .15, colors = Col)
  ########
  dev.off()
  
  write.csv(AnalyticsAllWords, paste(AnaList[i], "_&#32080;&#26524;.csv", seq = ""), row.names = FALSE) #&#32080;&#26524;&#12434;csv&#12391;&#20445;&#23384;
}

出力結果

図のようなタグクラウドとcsvファイルが保存先に指定したフォルダに出力されます。補足ですが、紹介したコードでは出力する単語の出現数を論文タイトルは5以上, アブストラクトは15以上にしています。適時変更してください。なお、PubMed以外のxmlファイルでもRで操作が可能です。統計情報はxmlで公開されているものもあります。ぜひ試してください。


少しでも、あなたのウェブ解析が楽になりますように!!

タイトルとURLをコピーしました