見出し画像

Zipf’s law

物事は本当にZipfの法則に従うのか調べてみましょう.

Zipf’s lawとは

言語学者Zipfが普及させた,自然言語における各単語の出現回数に関する法則です.
出現頻度の順位がn位の単語の出現頻度は,1/nに比例する」というもので,簡単に書くと
出現頻度1位の単語の出現回数をxとすると,出現頻度2位の単語の出現回数はx/2となり,3位の単語の出現回数はx/3となり,n位の単語の出現回数はx/nとなる,というものです.
厳密には拡張され,「出現頻度の順位がn位の単語の出現頻度は,1/(n^s)に比例する」となています.n^sは「nのs乗」です.
Zipfが発見したわけではないようです.

調査結果

英文における単語の出現回数を調査してみます.
(当然ながら、調べている人は沢山います)

データ1 における単語の出現頻度順位と出現頻度. 出現頻度2以上のみ
データ2 における単語の出現頻度順位と出現頻度. 出現頻度2以上のみ
データ3 における単語の出現頻度順位と出現頻度. 出現頻度2以上のみ

綺麗に Zipf's lawに従いました.特にデータ1とデータ2.

調査方法

調査対象データ

gutenberg.org に無料公開されている書籍のテキストデータを使用.

データ1
https://www.gutenberg.org/ebooks/1 より
https://www.gutenberg.org/cache/epub/1/pg1.txt を使用

データ2, 3
https://www.gutenberg.org/browse/scores/top#books-last30 より
https://www.gutenberg.org/files/84/84-0.txt データ2
https://www.gutenberg.org/files/1342/1342-0.txt データ3

データの加工

以下を行いました.
・全文字を小文字化
・" を削除
・単語末尾の . , ; を削除

数え方

文を 半角スペース と 改行 で単語に分割し,同じ文字列は同じ単語としました.出現頻度2以上の語のみを集計しました.

数えるコマンド

ruby words.rb | sort | uniq -c | sort -n -r | awk '$1>1{print $1}' > cnt.txt

words.rbはこちら

while l=gets do
  l.chomp!.split.each do | w |
    w.downcase!
    w.gsub!(/"/,"")
    w.gsub!(/[\.,;]$/,"")
    print w, "\n"
  end
end

参考

Zipf's law Wikipedia(English) Wikipedia(和) 英語記事の方が充実しています.
https://www.gutenberg.org/


この記事が気に入ったらサポートをしてみませんか?