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
|