2009-06-28
■[Programming] Wikipediaのリダイレクトを使って同義語とれるかな
wikipediaは同義語の単語(「ASIA」と「アジア」とか)は、代表的な単語にリダイレクトするようになっています。つまりリダイレクト関係にある単語は、大抵は同じ意味であることが期待されます。そこでこのリダイレクト関係を使って、同義語を抽出してみようと思います。
実際に作成したスクリプトは以下の通りです。
#!/usr/bin/perl # # wikipediaのリダイレクトを使って同義語を抽出 # # Usage: # % bzcat jawiki-latest-pages-articles.xml.bz2 | ./redirect_words.pl > result.tsv # # 参考ページ: # [を] Wikipediaのキーワードリンクを使って関連語データを作ってみた # http://chalow.net/2007-06-09-3.html # use strict; use warnings; use Encode qw(encode decode); sub word_ok { my $word = shift; return unless $word; return if $word =~ m{[:\|\n\t\[\]]};; return if $word =~ m{^[\#\s]};; $word =~ s/\s*\(.+?\)$//; return if $word =~ /一覧$/; return if $word =~ /\d+月\d+日$/; return if $word =~ /^\d{4}年$/; return if $word =~ /Wikipedia:/; return if $word =~ /Portal:/; return if $word =~ /その他/; return if $word =~ /の比較/; return if $word =~ /(曖昧さ回避)/; return if $word =~ /#/; return $word; } my $flag = 0; my $content; while (my $line = <STDIN>) { chomp $line; if (!$flag && $line =~ m{<page>}) { $flag = 1 } if ($flag) { $content .= $line; } if ($flag && $line =~ m{</page>}) { my ($title) = $content =~ m{<title>([^<]+)<}; $title = word_ok($title); if ($title) { my @words; push @words, $title; my ($redirect_large) = $content =~ m/#REDIRECT \[\[(.+?)\]\]/; $redirect_large = word_ok($redirect_large); push @words, $redirect_large if $redirect_large; my ($redirect_small) = $content =~ m/{{[Rr]edirect\|(.+?)}}/; if ($redirect_small) { my @redirects; foreach my $word (split /\|/, decode 'utf-8', $redirect_small) { $word = word_ok(encode 'utf-8', $word); push @words, $word if $word; } } if (scalar(@words) > 1) { print join "\t", @words; print "\n"; } } $flag = 0; $content = ''; } }
抽出結果はこちら。(ファイルサイズが9M近くあるので注意)
AFTA ASEAN自由貿易地域 AFTC 自動車公正取引協議会 AFU アフリナット国際航空
こんなのとか、
明石焼き 玉子焼 明石西公園 兵庫県立明石西公園 明石西高等学校 兵庫県立明石西高等学校 明石中宮 明石の姫君
こんなのが取れてます。まあ大抵は1文字違いの単語とかで、編集距離で判定した方が良さそうなものばかりですが。
使い道はなさそうですが、メモとして置いておきます。
- 6 http://reader.livedoor.com/reader/
- 5 http://www.google.co.jp/search?hl=ja&q=pasmo+バス+割引&lr=&aq=0&oq=PASMO+バス
- 5 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4GGLL_jaJP329JP329&q=森友治
- 4 http://fastladder.com/reader/
- 4 http://www.google.co.jp/search?hl=ja&q=墜落遺体?御巣鷹山の日航機123便+&btnG=Google+検索&lr=&aq=f&oq=
- 3 http://d.hatena.ne.jp/yto/20090629/p15
- 3 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&q=TFIDF&btnG=検索&lr=lang_ja
- 2 http://b.hatena.ne.jp/t/k-means
- 2 http://cgi.search.biglobe.ne.jp/cgi-bin/search2-b?search=検索&btop_f=on&q=Hits+アルゴリズム
- 2 http://d.hatena.ne.jp/download_takeshi/20090318/1237400906