名詞を集める(ただし、読み情報も)

はじめに

形態素解析するとき、最初に用意された辞書だけでは固有名詞などが少なく、うまくいかないことがある。
しかし、名詞は無数に存在し、どんどん新しい言葉がでてくるので、、形態素解析器の辞書に入れておくのが難しい。

そこで、ネットにあるデータから名詞を集めたい。
普通は、表記の部分だけ集めてくれば解析上は問題ないけど、ここでは条件として「読み(ふりがな、not発音)情報も」一緒に集めることを考える。
ここでは「wikipedia」と「はてなキーワード」から。

(2013/3/5 : 固有名詞と書いてしまっていたけど、名詞なので一部修正)

収集

Wikipedia

http://ja.wikipedia.org/wiki/Wikipedia:%E3%83%87%E3%83%BC%E3%82%BF%E3%83%99%E3%83%BC%E3%82%B9%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89

  • なにを置いてもとりあえずwikipedia
  • タイトルリストなら「all-titles-in-ns0.gz」
  • 上記には読みの情報は含まれていないので、読みの情報を取り出したい
  • ここでは本文中から「ほげほげ(ふがふが)」形式の部分を取り出して、読みっぽいものを取り出す
  • 本文データは「pages-articles.xml.bz2」
    • 展開すると6.7GBぐらい
  • ざっくばらんに取り出すスクリプト(かなり粗い)
    • 人名がある程度取れているので、ここではよしとする(逃げ)
#!/usr/bin/perl
use strict;
use warnings;
use Encode;
use utf8;
use Data::Dumper;

binmode STDIN, ":utf8";
binmode STDERR, ":utf8";
binmode STDOUT, ":utf8";

sub includeHan {
  my ($str) = @_;
  if($str =~ m/.*\p{Han}.*/){ return 1; }
  return 0;
}

sub includeLatin {
  my ($str) = @_;
  if($str =~ m/.*\p{Latin}.*/){ return 1; }
  return 0;
}

#ハイフンは削除するのではなく、ない部分を補完できるようにしたい
sub includeSymbol {
  my ($str) = @_;
  if($str =~ m/.*[\-‐―].*/){ return 1; }
  return 0;
}


while(<>){
  chomp;

  my $line = $_;
  $line =~ s/<.*?>//g; #タグの削除
  $line =~ s/[「」『』]//g; #カッコの削除
  $line =~ s/\[\[(.+?)\|.+?\]\]/$1/g; #カッコの削除
  $line =~ s/\[\[(.+?)\]\]/$1/g; #カッコの削除
  $line =~ s/\{\{(.+?)\}\}//g; #カッコの削除
  $line =~ s/\&amp;/\&/g; #アンドの置き換え
  $line =~ s/\s//g; #スペースの削除
  
  if($line =~ m/\'\'\'(.+?)\'\'\'(.+?)/){
    my $hyoki = $1;
    my $yomi_tmp = $2;
    $yomi_tmp =~ s/\{\{.+?\}\}//g; #カッコの削除
    my @yomi = split(/[、,]/,$yomi_tmp);
    if(defined($yomi[0])){
      $yomi[0] =~ s/\'\'\'//g; #クオートの削除
      $yomi[0] =~ s/\'\'//g; #クオートの削除
      if($yomi[0] ne '' && !includeHan($yomi[0]) && !includeLatin($yomi[0]) && !includeSymbol($yomi[0])){

        #「または」「もしくは」などが読みのところに入る場合も...
        if($hyoki =~ m/\'\'\'/){
          $hyoki = '\'\'\'' . $hyoki . '\'\'\'';
          while($hyoki =~ m/\'\'\'(.+?)\'\'\'/g){
            print $1,"\t",$yomi[0],"\n";
          }
        }else{
          print $hyoki,"\t",$yomi[0],"\n";
        }
      }
    }
  }
}
  • 実行
$ grep '<text' jawiki-20120826-pages-articles.xml | perl extract.pl > komeilist.txt

$  wc -l komei.list.txt
167805 komei.list.txt

$ head komeilist.txt
著作権の保護期間        ちょさくけんのほごきかん
情報工学        じょうほうこうがく
文脈自由言語    ぶんみゃくじゆうげんご
正規言語        せいきげんご
社会学者        しゃかいがくしゃ
文脈自由文法    ぶんみゃくじゆうぶんぽう
液晶    えきしょう
ネマティック液晶        ネマティックえきしょう
音楽のジャンル一覧      おんがくのジャンルいちらん
音楽家  おんがくか
  • そこそこ取れた
  • これにタイトルデータも合わせて登録しておけばよさそうか
はてなキーワード

http://developer.hatena.ne.jp/ja/documents/keyword/misc/catalog

ーーー	○ー○ー○ー○
ーーー	○ー○。
ぁ	(ぁ
ぁまのじゃく	ぁまのじゃく
ぁみにぃ	ぁみにぃ
ぁみみ	ぁみみ
ぁゃゃ	ぁゃゃ
あーう゛ぃんかーしゅなー	アーヴィン・カーシュナー
あーう゛ぇう゛ぇ	a.v.v
その他
  • 権利上問題があるかもしれないけど、IMEの辞書・ユーザー辞書なども使えそう