tfidf_ja 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.rdoc +84 -11
- data/Rakefile +2 -0
- data/VERSION +1 -1
- data/lib/dictionary.rb +30 -9
- data/lib/tfidf_ja/igo_extension.rb +6 -8
- data/lib/tfidf_ja.rb +10 -9
- data/lib/utility.rb +13 -7
- metadata +4 -4
    
        data/README.rdoc
    CHANGED
    
    | @@ -1,16 +1,89 @@ | |
| 1 1 | 
             
            = tfidf_ja
         | 
| 2 2 |  | 
| 3 | 
            -
             | 
| 4 | 
            -
             | 
| 5 | 
            -
            ==  | 
| 6 | 
            -
             | 
| 7 | 
            -
             | 
| 8 | 
            -
             | 
| 9 | 
            -
            *  | 
| 10 | 
            -
            *  | 
| 11 | 
            -
            *  | 
| 12 | 
            -
            *  | 
| 13 | 
            -
            *  | 
| 3 | 
            +
            tfidf_jaは与えられた単語の配列の {TF-IDF}[http://ja.wikipedia.org/wiki/Tf-idf] を算出し、単語をキー、TF-IDF値をバリューとするハッシュテーブルを返却するライブラリです。
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            == 特徴
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            tfidf_jaには以下の特徴があります。
         | 
| 8 | 
            +
             | 
| 9 | 
            +
            * IDF辞書
         | 
| 10 | 
            +
              * IPADIC辞書に収録されている日本語の形態素(約32万語)を使用し、TF値をYahoo!のインデックス数としてあらかじめ算出。
         | 
| 11 | 
            +
              * 算出したTF値からIDF値を算出し、IDF辞書としてライブラリに包含し、ライブラリ使用時の算出コストを減らしています。
         | 
| 12 | 
            +
            * 形態素解析
         | 
| 13 | 
            +
              * {igo-ruby}[https://rubygems.org/gems/igo-ruby]を使用した形態素解析を行なった上で、TF-IDFを算出することも可能です。
         | 
| 14 | 
            +
             | 
| 15 | 
            +
            == インストール方法
         | 
| 16 | 
            +
             | 
| 17 | 
            +
            コマンドプロンプトより以下を実行してください。
         | 
| 18 | 
            +
              $ gem install tfidf_ja
         | 
| 19 | 
            +
             | 
| 20 | 
            +
            == サンプル
         | 
| 21 | 
            +
            === 単語の配列からTF-IDFを取得
         | 
| 22 | 
            +
             | 
| 23 | 
            +
              require 'rubygems'
         | 
| 24 | 
            +
              require 'tfidf_ja'
         | 
| 25 | 
            +
              
         | 
| 26 | 
            +
              ti = TfIdf::Ja.new
         | 
| 27 | 
            +
              p ti.tfidf(['この', '文章', 'から', 'TFIDF', '値', 'を', '取得', 'する'])
         | 
| 28 | 
            +
             | 
| 29 | 
            +
            === 形態素解析を行なったあと、TF-IDFを取得
         | 
| 30 | 
            +
             | 
| 31 | 
            +
              require 'rubygems'
         | 
| 32 | 
            +
              require 'tfidf_ja'
         | 
| 33 | 
            +
              require 'tfidf_ja/igo_extension'
         | 
| 34 | 
            +
              
         | 
| 35 | 
            +
              dir = './ipadic' # igo-rubyに渡す辞書ファイルのディレクトリ
         | 
| 36 | 
            +
              tie = TfIdf::IgoExtension.new(dir)
         | 
| 37 | 
            +
              p tie.tfidf('この文章を形態素解析し、TFIDF値を取得する')
         | 
| 38 | 
            +
             | 
| 39 | 
            +
            === インスタンスを使い回し
         | 
| 40 | 
            +
             | 
| 41 | 
            +
            インスタンスを使い回すことにより、TF-IDF値は加算されていきます。
         | 
| 42 | 
            +
            複数のテキストから連続して算出する場合に便利です。
         | 
| 43 | 
            +
             | 
| 44 | 
            +
              tie = TfIdf::IgoExtension.new(dir)
         | 
| 45 | 
            +
              tie.tfidf('この文章を形態素解析し、TFIDF値を取得する').each_pair { |k, v|
         | 
| 46 | 
            +
                puts "#{k}=>#{v}"
         | 
| 47 | 
            +
              }
         | 
| 48 | 
            +
              # =>
         | 
| 49 | 
            +
              解析=>7.33823815006559
         | 
| 50 | 
            +
              値=>7.61579107203583
         | 
| 51 | 
            +
              TFIDF=>13.3689578610795
         | 
| 52 | 
            +
              形態素=>13.0477195694085
         | 
| 53 | 
            +
              文章=>7.2152399787301
         | 
| 54 | 
            +
              取得=>7.24992553671799
         | 
| 55 | 
            +
              
         | 
| 56 | 
            +
              # インスタンスを使い回し
         | 
| 57 | 
            +
              tie.tfidf('インスタンスを使い回し、再度TFIDF値を取得する').each_pair { |k, v|
         | 
| 58 | 
            +
                puts "#{k}=>#{v}"
         | 
| 59 | 
            +
              }
         | 
| 60 | 
            +
              # =>
         | 
| 61 | 
            +
              解析=>7.33823815006559
         | 
| 62 | 
            +
              値=>15.2315821440717           # 両方のテキストに出現する形態素のTFIDFは大きくなる
         | 
| 63 | 
            +
              TFIDF=>26.737915722159         # 両方のテキストに出現する形態素のTFIDFは大きくなる
         | 
| 64 | 
            +
              形態素=>13.0477195694085
         | 
| 65 | 
            +
              文章=>7.2152399787301
         | 
| 66 | 
            +
              インスタンス=>11.7873551106461 # 両方のテキストに出現する形態素のTFIDFは大きくなる
         | 
| 67 | 
            +
              取得=>14.499851073436          # 両方のテキストに出現する形態素のTFIDFは大きくなる
         | 
| 68 | 
            +
             | 
| 69 | 
            +
            リセットする場合はresetメソッドを使用します。
         | 
| 70 | 
            +
             | 
| 71 | 
            +
              # resetメソッドでリセット
         | 
| 72 | 
            +
              tie.reset
         | 
| 73 | 
            +
              tie.tfidf('インスタンスを使い回し、再度TFIDF値を取得する').each_pair { |k, v|
         | 
| 74 | 
            +
                puts "#{k}=>#{v}"
         | 
| 75 | 
            +
              }
         | 
| 76 | 
            +
              # =>
         | 
| 77 | 
            +
              値=>7.61579107203583
         | 
| 78 | 
            +
              TFIDF=>13.3689578610795
         | 
| 79 | 
            +
              インスタンス=>11.7873551106461
         | 
| 80 | 
            +
              取得=>7.24992553671799
         | 
| 81 | 
            +
             | 
| 82 | 
            +
            == 付録
         | 
| 83 | 
            +
            === 公開場所
         | 
| 84 | 
            +
             | 
| 85 | 
            +
            * {RubyGems}[https://rubygems.org/gems/tfidf_ja]
         | 
| 86 | 
            +
            * {ソースコード}[https://github.com/kyow/tfidf_ja]
         | 
| 14 87 |  | 
| 15 88 | 
             
            == Copyright
         | 
| 16 89 |  | 
    
        data/Rakefile
    CHANGED
    
    
    
        data/VERSION
    CHANGED
    
    | @@ -1 +1 @@ | |
| 1 | 
            -
            0.1. | 
| 1 | 
            +
            0.1.1
         | 
    
        data/lib/dictionary.rb
    CHANGED
    
    | @@ -1,39 +1,60 @@ | |
| 1 1 | 
             
            # coding: utf-8
         | 
| 2 2 | 
             
            #
         | 
| 3 | 
            -
            #Copyright:: Copyright (c) kyow, 2010
         | 
| 4 | 
            -
            #Authors:: K.Nishi
         | 
| 3 | 
            +
            # Copyright:: Copyright (c) kyow, 2010
         | 
| 4 | 
            +
            # Authors:: K.Nishi
         | 
| 5 5 |  | 
| 6 | 
            -
            #
         | 
| 7 | 
            -
            #
         | 
| 8 | 
            -
            #
         | 
| 9 6 | 
             
            module TfIdf
         | 
| 7 | 
            +
              #
         | 
| 8 | 
            +
              # 辞書基底クラス
         | 
| 9 | 
            +
              #
         | 
| 10 10 | 
             
              class Dictionary
         | 
| 11 | 
            +
                # コンストラクタ
         | 
| 11 12 | 
             
                def initialize
         | 
| 12 13 | 
             
                  @map = {}
         | 
| 13 14 | 
             
                end
         | 
| 14 | 
            -
             | 
| 15 | 
            +
                
         | 
| 16 | 
            +
                # 辞書にkeyとvalueを設定する
         | 
| 17 | 
            +
                # k:: key
         | 
| 18 | 
            +
                # v:: value
         | 
| 15 19 | 
             
                def set(k, v)
         | 
| 16 20 | 
             
                  @map[k] = v
         | 
| 17 21 | 
             
                end
         | 
| 18 | 
            -
             | 
| 22 | 
            +
                
         | 
| 23 | 
            +
                # keyからvalueを取得する
         | 
| 24 | 
            +
                # k:: key
         | 
| 25 | 
            +
                # return:: value
         | 
| 19 26 | 
             
                def get(k)
         | 
| 20 27 | 
             
                  return @map[k]
         | 
| 21 28 | 
             
                end
         | 
| 22 29 |  | 
| 30 | 
            +
                # 辞書全体を返却する
         | 
| 31 | 
            +
                # value:: ハッシュテーブル
         | 
| 23 32 | 
             
                def all
         | 
| 24 33 | 
             
                  return @map
         | 
| 25 34 | 
             
                end
         | 
| 26 | 
            -
             | 
| 35 | 
            +
                
         | 
| 36 | 
            +
                # keyが存在するか検査する
         | 
| 37 | 
            +
                # k:: 検査するkey
         | 
| 38 | 
            +
                # return:: true=存在する faluse=存在しない
         | 
| 27 39 | 
             
                def exists?(k)
         | 
| 28 40 | 
             
                  return @map.key?(k)
         | 
| 29 41 | 
             
                end
         | 
| 30 42 | 
             
              end
         | 
| 31 43 |  | 
| 44 | 
            +
              #
         | 
| 45 | 
            +
              # DF辞書クラス
         | 
| 46 | 
            +
              #
         | 
| 32 47 | 
             
              class DFs < Dictionary
         | 
| 33 48 | 
             
              end
         | 
| 34 | 
            -
             | 
| 49 | 
            +
              
         | 
| 50 | 
            +
              #
         | 
| 51 | 
            +
              # IDF辞書クラス
         | 
| 52 | 
            +
              #
         | 
| 35 53 | 
             
              class IDFs < Dictionary
         | 
| 54 | 
            +
                # 収録形態素数
         | 
| 36 55 | 
             
                attr_accessor :size
         | 
| 56 | 
            +
                
         | 
| 57 | 
            +
                # 平均IDF値
         | 
| 37 58 | 
             
                attr_accessor :average
         | 
| 38 59 | 
             
              end
         | 
| 39 60 | 
             
            end
         | 
| @@ -1,34 +1,32 @@ | |
| 1 1 | 
             
            # coding: utf-8
         | 
| 2 2 | 
             
            #
         | 
| 3 | 
            -
            #Copyright:: Copyright (c) kyow, 2011
         | 
| 4 | 
            -
            #Authors:: K.Nishi
         | 
| 3 | 
            +
            # Copyright:: Copyright (c) kyow, 2011
         | 
| 4 | 
            +
            # Authors:: K.Nishi
         | 
| 5 5 |  | 
| 6 6 | 
             
            $:.unshift(File.dirname(__FILE__))
         | 
| 7 7 |  | 
| 8 8 | 
             
            require 'rubygems'
         | 
| 9 9 | 
             
            require 'igo-ruby'
         | 
| 10 10 |  | 
| 11 | 
            -
            #
         | 
| 12 | 
            -
            #
         | 
| 13 | 
            -
            #
         | 
| 14 11 | 
             
            module TfIdf
         | 
| 15 12 | 
             
              #
         | 
| 16 | 
            -
              #
         | 
| 13 | 
            +
              # 形態素解析に{igo-ruby}[https://rubygems.org/gems/igo-ruby]を使用するための拡張クラス
         | 
| 17 14 | 
             
              #
         | 
| 18 15 | 
             
              class IgoExtension
         | 
| 19 16 | 
             
                # コンストラクタ
         | 
| 20 17 | 
             
                def initialize(dir)
         | 
| 21 | 
            -
            #     dir = File::expand_path(dir)
         | 
| 22 18 | 
             
                  @tagger = Igo::Tagger.new(dir)
         | 
| 23 19 | 
             
                  @tfidf = TfIdf::Ja.new
         | 
| 24 20 | 
             
                end
         | 
| 25 21 |  | 
| 22 | 
            +
                # インスタンスのリセット
         | 
| 26 23 | 
             
                def reset
         | 
| 27 24 | 
             
                  @tfidf.reset
         | 
| 28 25 | 
             
                end
         | 
| 29 26 |  | 
| 30 27 | 
             
                # igo-rubyを利用して形態素解析を行ない、その結果のTF-IDFを返却する
         | 
| 31 | 
            -
                #text::  | 
| 28 | 
            +
                # text:: 形態素解析を行なうテキスト
         | 
| 29 | 
            +
                # return:: key=形態素、value=TF-IDFのハッシュテーブル
         | 
| 32 30 | 
             
                def tfidf(text)
         | 
| 33 31 | 
             
                  t = @tagger.parse(text)
         | 
| 34 32 | 
             
                  words = []
         | 
    
        data/lib/tfidf_ja.rb
    CHANGED
    
    | @@ -1,18 +1,15 @@ | |
| 1 1 | 
             
            # coding: utf-8
         | 
| 2 2 | 
             
            #
         | 
| 3 | 
            -
            #Copyright:: Copyright (c) kyow, 2011
         | 
| 4 | 
            -
            #Authors:: K.Nishi
         | 
| 3 | 
            +
            # Copyright:: Copyright (c) kyow, 2011
         | 
| 4 | 
            +
            # Authors:: K.Nishi
         | 
| 5 5 |  | 
| 6 6 | 
             
            $:.unshift(File.dirname(__FILE__))
         | 
| 7 7 |  | 
| 8 8 | 
             
            require 'dictionary'
         | 
| 9 9 |  | 
| 10 | 
            -
            #
         | 
| 11 | 
            -
            #
         | 
| 12 | 
            -
            #
         | 
| 13 10 | 
             
            module TfIdf
         | 
| 14 11 | 
             
              #
         | 
| 15 | 
            -
              #
         | 
| 12 | 
            +
              # 日本語辞書を使用してTFIDFを算出するクラス
         | 
| 16 13 | 
             
              #
         | 
| 17 14 | 
             
              class Ja
         | 
| 18 15 | 
             
                # コンストラクタ
         | 
| @@ -21,13 +18,14 @@ module TfIdf | |
| 21 18 | 
             
                  reset
         | 
| 22 19 | 
             
                end
         | 
| 23 20 |  | 
| 21 | 
            +
                # インスタンスのリセット
         | 
| 24 22 | 
             
                def reset
         | 
| 25 23 | 
             
                  @tfs = {}
         | 
| 26 24 | 
             
                end
         | 
| 27 25 |  | 
| 28 | 
            -
                #
         | 
| 29 | 
            -
                #words:: 形態素配列
         | 
| 30 | 
            -
                 | 
| 26 | 
            +
                # TF-IDFを算出する
         | 
| 27 | 
            +
                # words:: 形態素配列
         | 
| 28 | 
            +
                # return:: key = 形態素、value = TF-IDF値のハッシュテーブル
         | 
| 31 29 | 
             
                def tfidf(words)
         | 
| 32 30 | 
             
                  tfidfs = {}
         | 
| 33 31 | 
             
                  set_tf_map(words)
         | 
| @@ -37,6 +35,9 @@ module TfIdf | |
| 37 35 | 
             
                  return tfidfs
         | 
| 38 36 | 
             
                end
         | 
| 39 37 |  | 
| 38 | 
            +
                # IDFを取得する
         | 
| 39 | 
            +
                # word:: 形態素
         | 
| 40 | 
            +
                # return:: IDF
         | 
| 40 41 | 
             
                def idf(word)
         | 
| 41 42 | 
             
                  idf = @idfs.get(word)
         | 
| 42 43 | 
             
                  if(idf.nil?)
         | 
    
        data/lib/utility.rb
    CHANGED
    
    | @@ -1,20 +1,19 @@ | |
| 1 1 | 
             
            # coding: utf-8
         | 
| 2 2 | 
             
            #
         | 
| 3 | 
            -
            #Copyright:: Copyright (c) kyow, 2011
         | 
| 4 | 
            -
            #Authors:: K.Nishi
         | 
| 3 | 
            +
            # Copyright:: Copyright (c) kyow, 2011
         | 
| 4 | 
            +
            # Authors:: K.Nishi
         | 
| 5 5 |  | 
| 6 6 | 
             
            $:.unshift(File.dirname(__FILE__))
         | 
| 7 7 | 
             
            require 'dictionary'
         | 
| 8 8 |  | 
| 9 | 
            -
            #
         | 
| 10 | 
            -
            #
         | 
| 11 | 
            -
            #
         | 
| 12 9 | 
             
            module TfIdf
         | 
| 13 10 | 
             
              #
         | 
| 14 | 
            -
              #  | 
| 11 | 
            +
              # ユーティリティクラス
         | 
| 15 12 | 
             
              #
         | 
| 16 13 | 
             
              class Utility
         | 
| 17 | 
            -
             | 
| 14 | 
            +
                # (仮の)インデックス数
         | 
| 15 | 
            +
                N = 20000000000
         | 
| 16 | 
            +
                
         | 
| 18 17 | 
             
                # df.dicからidf.dicを生成する
         | 
| 19 18 | 
             
                def self.create_dic
         | 
| 20 19 | 
             
                  dfs = self.df_load()
         | 
| @@ -24,12 +23,17 @@ module TfIdf | |
| 24 23 | 
             
                  puts "size=#{idfs.size} average=#{idfs.average}"
         | 
| 25 24 | 
             
                end
         | 
| 26 25 |  | 
| 26 | 
            +
                # DF値からiDF値を取得する
         | 
| 27 | 
            +
                # IDF = log(N / DF)
         | 
| 28 | 
            +
                # df_value:: DF値
         | 
| 27 29 | 
             
                def self.get_inverse(df_value)
         | 
| 28 30 | 
             
                  return df_value > 0 ? Math::log(N / df_value) : 0
         | 
| 29 31 | 
             
                end
         | 
| 30 32 |  | 
| 31 33 | 
             
                private
         | 
| 32 34 |  | 
| 35 | 
            +
                # DFsオブジェクトからIDFsオブジェクトを生成する
         | 
| 36 | 
            +
                # dfs:: DFsオブジェクト
         | 
| 33 37 | 
             
                def self.create_idf(dfs)
         | 
| 34 38 | 
             
                  idfs = IDFs.new
         | 
| 35 39 | 
             
                  total = 0
         | 
| @@ -43,6 +47,7 @@ module TfIdf | |
| 43 47 | 
             
                  return idfs
         | 
| 44 48 | 
             
                end
         | 
| 45 49 |  | 
| 50 | 
            +
                # df.dicを読み込む
         | 
| 46 51 | 
             
                def self.df_load()
         | 
| 47 52 | 
             
                  df_dic  = File.dirname(__FILE__) + '/../dic/df.dic'
         | 
| 48 53 | 
             
                  unless File::exists?(df_dic)
         | 
| @@ -53,6 +58,7 @@ module TfIdf | |
| 53 58 | 
             
                  }
         | 
| 54 59 | 
             
                end
         | 
| 55 60 |  | 
| 61 | 
            +
                # idf.dicを保存する
         | 
| 56 62 | 
             
                def self.idf_save(idfs)
         | 
| 57 63 | 
             
                  idf_dic  = File.dirname(__FILE__) + '/../dic/idf.dic'
         | 
| 58 64 | 
             
                  File::open(idf_dic, 'wb') { |f|
         | 
    
        metadata
    CHANGED
    
    | @@ -1,13 +1,13 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification 
         | 
| 2 2 | 
             
            name: tfidf_ja
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 4 | 
            -
              hash:  | 
| 4 | 
            +
              hash: 25
         | 
| 5 5 | 
             
              prerelease: false
         | 
| 6 6 | 
             
              segments: 
         | 
| 7 7 | 
             
              - 0
         | 
| 8 8 | 
             
              - 1
         | 
| 9 | 
            -
              -  | 
| 10 | 
            -
              version: 0.1. | 
| 9 | 
            +
              - 1
         | 
| 10 | 
            +
              version: 0.1.1
         | 
| 11 11 | 
             
            platform: ruby
         | 
| 12 12 | 
             
            authors: 
         | 
| 13 13 | 
             
            - K.Nishi
         | 
| @@ -15,7 +15,7 @@ autorequire: | |
| 15 15 | 
             
            bindir: bin
         | 
| 16 16 | 
             
            cert_chain: []
         | 
| 17 17 |  | 
| 18 | 
            -
            date: 2011-01- | 
| 18 | 
            +
            date: 2011-01-11 00:00:00 +09:00
         | 
| 19 19 | 
             
            default_executable: 
         | 
| 20 20 | 
             
            dependencies: 
         | 
| 21 21 | 
             
            - !ruby/object:Gem::Dependency 
         |