2016年5月3日火曜日

Rでtwitterの検索結果から同表記異義語をフィルタする その2 Wikipediaの記事抽出

この記事はRでtwitterの検索結果から同表記異義語をフィルタする その1のつづきです。

RでWikipediaの記事を抽出する

WikipediR という便利なRパッケージがあったため、それを使う。WikipediR が提供する text というプロパティを使うと、Wikipediaの記事のヘッダやサイドバーを取り除いたHTMLが簡単に取得できるので便利。

それでも text が返却する文字には<a></a>の様なタグが含まれ、文章が途切れるので、xml2 パッケージを使い、テキストのみを抽出した。

この後、RMeCabパッケージを使い、各記事に書かれた文書の特徴となる語彙リスト(tf-idf)を作成するが、この作業では対象となる文書をファイルで指定する必要があるため、変数texts に記憶されたデータをファイルに書き出した。

install.packages("WikipediR")
install.packages("xml2")

library(WikipediR)
library(xml2)

page_name <- "小笠原諸島"

wp_html <- page_content("ja", "wikipedia", page_name=page_name)
# page_content関数は独自のpccontentクラスを返すため、
# その中のparse->text->"*"プロパティを明示しxml2ライブラリに文字列を渡す
tree <- read_html(wp_html$parse$text$"*", encoding="UTF-8")
content_text <- xml_find_all(tree, "//body//text()")
# content_text はxmlnode型のリストなので、テキストに変換する
# (xml2パッケージが提供するxml_text関数を使用)
texts <- sapply(content_text, xml_text)
# 改行のみ含まれる要素を削除する
texts <- texts[texts != "\n"]

# 保存先パスを生成する
file_path_and_name = file.path(WIKIPEDIA_CONTENT_DIR,
                                       # 保存先ファイル名
                                       paste(page_name, ".txt", sep=""))
# ファイルに保存する
write.table(texts, file=file_path_and_name, row.names=FALSE, quote=FALSE)

備忘

  • 最初はWikipediRを使わず、Wikimediaが提供する記事一覧のアーカイブ(ここの jawiki-latest-pages-articles.xml.bz2)をダウンロードし、それを使用する予定であったが、Wiki文法を取り除き平文にするシンプルな方法がみつからなかった。
  • 最終的にファイルに書き出すのであれば、ここの部分だけpythonなどで書いたほうが早かった気がする。

RでWikipediaの記事をランダムに抽出する

扱う文書量が少ない場合、一般的な名詞、たとえば「りんご」がたまたまクラスAの文書だけに出現していると、たとえ「りんご」とクラスAとの関連が弱い場合でも「りんご」が出現するツイートはクラスAに重み付けされて評価されてしまう。

こういった事態を避けるため、収集する文書を増やし、各クラスに含まれる一般的な語彙はなるべく打ち消されるようにした(tf-idf)。

WikipediRはランダムにWikipediaの記事を取得する random_page という関数を提供しており、これを利用した。はじめ namespace 引数の指定を省略して実行すると、Wikipediaの改版履歴など意図とは異なるページも取得したため、Built-in namespaces を参考に、記事(0)のみを指定するようにした。

wp_html <- random_page("ja", "wikipedia", 
           # 記事のみを対象とする(会話ノートやテンプレートページを含めない)
           namespaces = list(0))

Rでtwitterの検索結果から同表記異義語をフィルタする その3 集計とRStudio Projectファイルに続きます。

0 件のコメント:

コメントを投稿