Closed5

キーワード抽出手法(TF/IDF/TF-IDF)を実際に試してみる

kun432kun432

サンプルはwikipediaの文章から。
Colaboratoryで。形態素解析にはSudachiを使う。

!pip install sudachipy

辞書はとりあえず全部入れておく。

!pip install sudachidict-core sudachidict-small sudachidict-full

https://ja.wikipedia.org/wiki/トウカイテイオー

今回のサンプルはやや特定分野寄りなのでsudachidict-fullを使用、またなるべく単語を広く取りたいので複数粒度分割はC、

from sudachipy import tokenizer
from sudachipy import dictionary
from pprint import pprint

text = "トウカイテイオー(欧字名:Tokai Teio、1988年4月20日 - 2013年8月30日)は、日本の競走馬、種牡馬。七冠馬シンボリルドルフの初年度産駒の一頭であり、日本調教馬として最初の国際G1競走優勝馬である。1991年度JRA賞年度代表馬、最優秀4歳牡馬および最優秀父内国産馬、1993年度JRA賞特別賞受賞。 1995年、顕彰馬に選出。主な勝ち鞍は1991年皐月賞、東京優駿(日本ダービー)、1992年ジャパンカップ、1993年有馬記念など。「皇帝」と称された父から連想して付けられた馬名より「帝王」、幾度もの骨折から復活の勝利を挙げた競走生活から「奇跡の名馬」とも呼ばれる。"

tokenizer_obj = dictionary.Dictionary(dict="full").create()
mode = tokenizer.Tokenizer.SplitMode.C

tokens = tokenizer_obj.tokenize(text, mode)
pprint(tokens)

こんな感じで分割される。

<MorphemeList[
  <Morpheme(トウカイテイオー, 0:8, (0, 223669))>,
  <Morpheme((, 8:9, (0, 5248))>,
  <Morpheme(欧字, 9:11, (0, 522062))>,
  <Morpheme(名, 11:12, (0, 343778))>,
  <Morpheme(:, 12:13, (0, 217))>,
  <Morpheme(Tokai, 13:18, (0, 780675))>,
  <Morpheme( , 18:19, (0, 0))>,
  <Morpheme(Teio, 19:23, (-1, 4))>,
  <Morpheme(、, 23:24, (0, 6911))>,
  <Morpheme(1988, 24:28, (-1, 268435455))>,
  <Morpheme(年, 28:29, (0, 407986))>,
  <Morpheme(4, 29:30, (0, 120))>,
  <Morpheme(月, 30:31, (0, 508010))>,
  <Morpheme(20, 31:33, (-1, 268435455))>,
  <Morpheme(日, 33:34, (0, 497892))>,
  <Morpheme( , 34:35, (0, 0))>,
  <Morpheme(-, 35:36, (0, 17))>,
  <Morpheme( , 36:37, (0, 0))>,
  <Morpheme(2013, 37:41, (-1, 268435455))>,
  <Morpheme(年, 41:42, (0, 407986))>,
  <Morpheme(8, 42:43, (0, 187))>,
  <Morpheme(月, 43:44, (0, 508010))>,
  <Morpheme(30, 44:46, (-1, 268435455))>,
  <Morpheme(日, 46:47, (0, 497892))>,
  <Morpheme(), 47:48, (0, 5465))>,
  <Morpheme(は, 48:49, (0, 121601))>,
  <Morpheme(、, 49:50, (0, 6911))>,
  <Morpheme(日本, 50:52, (0, 498220))>,
  <Morpheme(の, 52:53, (0, 119137))>,
  <Morpheme(競走馬, 53:56, (0, 1455632))>,
  <Morpheme(、, 56:57, (0, 6911))>,
  <Morpheme(種牡馬, 57:60, (0, 2748903))>,
  <Morpheme(。, 60:61, (0, 6912))>,
  <Morpheme(七, 61:62, (-1, 268435455))>,
  <Morpheme(冠, 62:63, (0, 306392))>,
  <Morpheme(馬, 63:64, (0, 754147))>,
  <Morpheme(シンボリルドルフ, 64:72, (0, 207763))>,
  <Morpheme(の, 72:73, (0, 119137))>,
  <Morpheme(初, 73:74, (0, 315364))>,
  <Morpheme(年度, 74:76, (0, 408115))>,
  <Morpheme(産駒, 76:78, (0, 575899))>,
  <Morpheme(の, 78:79, (0, 119137))>,
  <Morpheme(一, 79:80, (-1, 268435455))>,
  <Morpheme(頭, 80:81, (0, 745383))>,
  <Morpheme(で, 81:82, (0, 101428))>,
  <Morpheme(あり, 82:84, (0, 12509))>,
  <Morpheme(、, 84:85, (0, 6911))>,
  <Morpheme(日本, 85:87, (0, 498220))>,
  <Morpheme(調教, 87:89, (0, 684844))>,
  <Morpheme(馬, 89:90, (0, 754147))>,
  <Morpheme(と, 90:91, (0, 102129))>,
  <Morpheme(し, 91:92, (0, 67503))>,
  <Morpheme(て, 92:93, (0, 100503))>,
  <Morpheme(最初, 93:95, (0, 507921))>,
  <Morpheme(の, 95:96, (0, 119137))>,
  <Morpheme(国際, 96:98, (0, 364547))>,
  <Morpheme(G, 98:99, (0, 5812))>,
  <Morpheme(1, 99:100, (0, 32))>,
  <Morpheme(競走, 100:102, (0, 610111))>,
  <Morpheme(優勝, 102:104, (0, 299854))>,
  <Morpheme(馬, 104:105, (0, 754147))>,
  <Morpheme(で, 105:106, (0, 101428))>,
  <Morpheme(ある, 106:108, (0, 12718))>,
  <Morpheme(。, 108:109, (0, 6912))>,
  <Morpheme(1991, 109:113, (-1, 268435455))>,
  <Morpheme(年度, 113:115, (0, 408115))>,
  <Morpheme(JRA賞, 115:119, (0, 1646545))>,
  <Morpheme(年度代表馬, 119:124, (0, 2566708))>,
  <Morpheme(、, 124:125, (0, 6911))>,
  <Morpheme(最優秀, 125:128, (0, 1279105))>,
  <Morpheme(4, 128:129, (0, 119))>,
  <Morpheme(歳, 129:130, (0, 525754))>,
  <Morpheme(牡馬, 130:132, (0, 566770))>,
  <Morpheme(および, 132:135, (0, 33974))>,
  <Morpheme(最優秀父内国産馬, 135:143, (0, 2610549))>,
  <Morpheme(、, 143:144, (0, 6911))>,
  <Morpheme(1993, 144:148, (-1, 268435455))>,
  <Morpheme(年度, 148:150, (0, 408115))>,
  <Morpheme(JRA賞特別賞, 150:157, (0, 1646558))>,
  <Morpheme(受賞, 157:159, (0, 337504))>,
  <Morpheme(。, 159:160, (0, 6912))>,
  <Morpheme( , 160:161, (0, 0))>,
  <Morpheme(1995, 161:165, (-1, 268435455))>,
  <Morpheme(年, 165:166, (0, 407986))>,
  <Morpheme(、, 166:167, (0, 6911))>,
  <Morpheme(顕彰馬, 167:170, (0, 1589624))>,
  <Morpheme(に, 170:171, (0, 113653))>,
  <Morpheme(選出, 171:173, (0, 722172))>,
  <Morpheme(。, 173:174, (0, 6912))>,
  <Morpheme(主な, 174:176, (0, 276097))>,
  <Morpheme(勝ち鞍, 176:179, (0, 324459))>,
  <Morpheme(は, 179:180, (0, 121601))>,
  <Morpheme(1991, 180:184, (-1, 268435455))>,
  <Morpheme(年, 184:185, (0, 407986))>,
  <Morpheme(皐月賞, 185:188, (0, 2725649))>,
  <Morpheme(、, 188:189, (0, 6911))>,
  <Morpheme(東京優駿, 189:193, (0, 2627574))>,
  <Morpheme((, 193:194, (0, 5248))>,
  <Morpheme(日本ダービー, 194:200, (0, 2600043))>,
  <Morpheme(), 200:201, (0, 5465))>,
  <Morpheme(、, 201:202, (0, 6911))>,
  <Morpheme(1992, 202:206, (-1, 268435455))>,
  <Morpheme(年, 206:207, (0, 407986))>,
  <Morpheme(ジャパンカップ, 207:214, (0, 820849))>,
  <Morpheme(、, 214:215, (0, 6911))>,
  <Morpheme(1993, 215:219, (-1, 268435455))>,
  <Morpheme(年, 219:220, (0, 407986))>,
  <Morpheme(有馬記念, 220:224, (0, 2613060))>,
  <Morpheme(など, 224:226, (0, 111926))>,
  <Morpheme(。, 226:227, (0, 6912))>,
  <Morpheme(「, 227:228, (0, 6954))>,
  <Morpheme(皇帝, 228:230, (0, 583736))>,
  <Morpheme(」, 230:231, (0, 6960))>,
  <Morpheme(と, 231:232, (0, 102129))>,
  <Morpheme(称さ, 232:234, (0, 598028))>,
  <Morpheme(れ, 234:235, (0, 168475))>,
  <Morpheme(た, 235:236, (0, 83564))>,
  <Morpheme(父, 236:237, (0, 566015))>,
  <Morpheme(から, 237:239, (0, 43490))>,
  <Morpheme(連想, 239:241, (0, 717333))>,
  <Morpheme(し, 241:242, (0, 67503))>,
  <Morpheme(て, 242:243, (0, 100503))>,
  <Morpheme(付け, 243:245, (0, 285698))>,
  <Morpheme(られ, 245:247, (0, 168093))>,
  <Morpheme(た, 247:248, (0, 83564))>,
  <Morpheme(馬名, 248:250, (0, 754206))>,
  <Morpheme(より, 250:252, (0, 167125))>,
  <Morpheme(「, 252:253, (0, 6954))>,
  <Morpheme(帝王, 253:255, (0, 405900))>,
  <Morpheme(」, 255:256, (0, 6960))>,
  <Morpheme(、, 256:257, (0, 6911))>,
  <Morpheme(幾度, 257:259, (0, 1192649))>,
  <Morpheme(も, 259:260, (0, 156944))>,
  <Morpheme(の, 260:261, (0, 119137))>,
  <Morpheme(骨折, 261:263, (0, 758658))>,
  <Morpheme(から, 263:265, (0, 43490))>,
  <Morpheme(復活, 265:267, (0, 426124))>,
  <Morpheme(の, 267:268, (0, 119137))>,
  <Morpheme(勝利, 268:270, (0, 324581))>,
  <Morpheme(を, 270:271, (0, 170877))>,
  <Morpheme(挙げ, 271:273, (0, 466301))>,
  <Morpheme(た, 273:274, (0, 83564))>,
  <Morpheme(競走, 274:276, (0, 610111))>,
  <Morpheme(生活, 276:278, (0, 575289))>,
  <Morpheme(から, 278:280, (0, 43490))>,
  <Morpheme(「, 280:281, (0, 6954))>,
  <Morpheme(奇跡, 281:283, (0, 378311))>,
  <Morpheme(の, 283:284, (0, 119137))>,
  <Morpheme(名馬, 284:286, (0, 344326))>,
  <Morpheme(」, 286:287, (0, 6960))>,
  <Morpheme(と, 287:288, (0, 102129))>,
  <Morpheme(も, 288:289, (0, 156944))>,
  <Morpheme(呼ば, 289:291, (0, 350816))>,
  <Morpheme(れる, 291:293, (0, 168567))>,
  <Morpheme(。, 293:294, (0, 6912))>,
  <Morpheme(
, 294:295, (-1, 0))>,
]>
sudachipy.morphemelist.MorphemeList

個々の形態素はこういう感じで取得できる。

for t in tokens:
    print("{}\t{}\t{}\t{}\t{}\t{}".format(
        t.surface(),
        t.part_of_speech(),
        t.normalized_form(),
        t.dictionary_form(),
        t.reading_form(),
        t.dictionary_id(),
    ))
トウカイテイオー	('名詞', '固有名詞', '一般', '*', '*', '*')	トウカイテイオー	トウカイテイオー	トウカイテイオー	0
(	('補助記号', '括弧開', '*', '*', '*', '*')	(	(	キゴウ	0
欧字	('名詞', '普通名詞', '一般', '*', '*', '*')	欧字	欧字	オウジ	0
名	('名詞', '普通名詞', '助数詞可能', '*', '*', '*')	名	名	メイ	0
:	('補助記号', '一般', '*', '*', '*', '*')	:	:	キゴウ	0
Tokai	('名詞', '固有名詞', '一般', '*', '*', '*')	TOKAI	TOKAI	トーカイ	0
 	('空白', '*', '*', '*', '*', '*')	 	 	キゴウ	0
Teio	('名詞', '普通名詞', '一般', '*', '*', '*')	teio	teio	teio	-1
、	('補助記号', '読点', '*', '*', '*', '*')	、	、	、	0
1988	('名詞', '数詞', '*', '*', '*', '*')	1988	1988	イチキュウハチハチ	-1
年	('名詞', '普通名詞', '助数詞可能', '*', '*', '*')	年	年	ネン	0
4	('名詞', '数詞', '*', '*', '*', '*')	4	4	シ	0
月	('名詞', '普通名詞', '助数詞可能', '*', '*', '*')	月	月	ガツ	0
20	('名詞', '数詞', '*', '*', '*', '*')	20	20	ニレイ	-1
日	('名詞', '普通名詞', '助数詞可能', '*', '*', '*')	日	日	ニチ	0
 	('空白', '*', '*', '*', '*', '*')	 	 	キゴウ	0
-	('補助記号', '一般', '*', '*', '*', '*')	-	-	-	0
 	('空白', '*', '*', '*', '*', '*')	 	 	キゴウ	0
2013	('名詞', '数詞', '*', '*', '*', '*')	2013	2013	ニレイイチサン	-1
年	('名詞', '普通名詞', '助数詞可能', '*', '*', '*')	年	年	ネン	0
8	('名詞', '数詞', '*', '*', '*', '*')	8	8	ハチ	0
月	('名詞', '普通名詞', '助数詞可能', '*', '*', '*')	月	月	ガツ	0
30	('名詞', '数詞', '*', '*', '*', '*')	30	30	サンレイ	-1
日	('名詞', '普通名詞', '助数詞可能', '*', '*', '*')	日	日	ニチ	0
)	('補助記号', '括弧閉', '*', '*', '*', '*')	)	)	キゴウ	0
は	('助詞', '係助詞', '*', '*', '*', '*')	は	は	ハ	0
、	('補助記号', '読点', '*', '*', '*', '*')	、	、	、	0
日本	('名詞', '固有名詞', '地名', '国', '*', '*')	日本	日本	ニッポン	0
の	('助詞', '格助詞', '*', '*', '*', '*')	の	の	ノ	0
競走馬	('名詞', '普通名詞', '一般', '*', '*', '*')	競走馬	競走馬	キョウソウバ	0
、	('補助記号', '読点', '*', '*', '*', '*')	、	、	、	0
種牡馬	('名詞', '固有名詞', '一般', '*', '*', '*')	種牡馬	種牡馬	シュボバ	0
。	('補助記号', '句点', '*', '*', '*', '*')	。	。	。	0
七	('名詞', '数詞', '*', '*', '*', '*')	7	七	ナナ	-1
冠	('接尾辞', '名詞的', '一般', '*', '*', '*')	冠	冠	カン	0
馬	('接尾辞', '名詞的', '一般', '*', '*', '*')	馬	馬	バ	0
シンボリルドルフ	('名詞', '固有名詞', '一般', '*', '*', '*')	シンボリルドルフ	シンボリルドルフ	シンボリルドルフ	0
の	('助詞', '格助詞', '*', '*', '*', '*')	の	の	ノ	0
初	('名詞', '普通名詞', '一般', '*', '*', '*')	初	初	ハツ	0
年度	('名詞', '普通名詞', '一般', '*', '*', '*')	年度	年度	ネンド	0
産駒	('名詞', '普通名詞', '一般', '*', '*', '*')	産駒	産駒	サンク	0
の	('助詞', '格助詞', '*', '*', '*', '*')	の	の	ノ	0
一	('名詞', '数詞', '*', '*', '*', '*')	1	一	イチ	-1
頭	('接尾辞', '名詞的', '助数詞', '*', '*', '*')	頭	頭	トウ	0
で	('助動詞', '*', '*', '*', '助動詞-ダ', '連用形-一般')	だ	だ	デ	0
あり	('動詞', '非自立可能', '*', '*', '五段-ラ行', '連用形-一般')	有る	ある	アリ	0
、	('補助記号', '読点', '*', '*', '*', '*')	、	、	、	0
日本	('名詞', '固有名詞', '地名', '国', '*', '*')	日本	日本	ニッポン	0
調教	('名詞', '普通名詞', 'サ変可能', '*', '*', '*')	調教	調教	チョウキョウ	0
馬	('接尾辞', '名詞的', '一般', '*', '*', '*')	馬	馬	バ	0
と	('助詞', '格助詞', '*', '*', '*', '*')	と	と	ト	0
し	('動詞', '非自立可能', '*', '*', 'サ行変格', '連用形-一般')	為る	する	シ	0
て	('助詞', '接続助詞', '*', '*', '*', '*')	て	て	テ	0
最初	('名詞', '普通名詞', '副詞可能', '*', '*', '*')	最初	最初	サイショ	0
の	('助詞', '格助詞', '*', '*', '*', '*')	の	の	ノ	0
国際	('名詞', '普通名詞', '一般', '*', '*', '*')	国際	国際	コクサイ	0
G	('名詞', '普通名詞', '助数詞可能', '*', '*', '*')	g	g	グラム	0
1	('名詞', '数詞', '*', '*', '*', '*')	1	1	イチ	0
競走	('名詞', '普通名詞', 'サ変可能', '*', '*', '*')	競走	競走	キョウソウ	0
優勝	('名詞', '普通名詞', 'サ変可能', '*', '*', '*')	優勝	優勝	ユウショウ	0
馬	('接尾辞', '名詞的', '一般', '*', '*', '*')	馬	馬	バ	0
で	('助動詞', '*', '*', '*', '助動詞-ダ', '連用形-一般')	だ	だ	デ	0
ある	('動詞', '非自立可能', '*', '*', '五段-ラ行', '終止形-一般')	有る	ある	アル	0
。	('補助記号', '句点', '*', '*', '*', '*')	。	。	。	0
1991	('名詞', '数詞', '*', '*', '*', '*')	1991	1991	イチキュウキュウイチ	-1
年度	('名詞', '普通名詞', '一般', '*', '*', '*')	年度	年度	ネンド	0
JRA賞	('名詞', '固有名詞', '一般', '*', '*', '*')	JRA賞	JRA賞	ジェーアールエーショウ	0
年度代表馬	('名詞', '固有名詞', '一般', '*', '*', '*')	年度代表馬	年度代表馬	ネンドダイヒョウバ	0
、	('補助記号', '読点', '*', '*', '*', '*')	、	、	、	0
最優秀	('名詞', '普通名詞', '一般', '*', '*', '*')	最優秀	最優秀	サイユウシュウ	0
4	('名詞', '数詞', '*', '*', '*', '*')	4	4	ヨン	0
歳	('接尾辞', '名詞的', '助数詞', '*', '*', '*')	歳	歳	サイ	0
牡馬	('名詞', '普通名詞', '一般', '*', '*', '*')	牡馬	牡馬	ボバ	0
および	('接続詞', '*', '*', '*', '*', '*')	及び	および	オヨビ	0
最優秀父内国産馬	('名詞', '固有名詞', '一般', '*', '*', '*')	最優秀父内国産馬	最優秀父内国産馬	サイユウシュウチチナイコクサンバ	0
、	('補助記号', '読点', '*', '*', '*', '*')	、	、	、	0
1993	('名詞', '数詞', '*', '*', '*', '*')	1993	1993	イチキュウキュウサン	-1
年度	('名詞', '普通名詞', '一般', '*', '*', '*')	年度	年度	ネンド	0
JRA賞特別賞	('名詞', '固有名詞', '一般', '*', '*', '*')	JRA賞特別賞	JRA賞特別賞	ジェーアールエーショウトクベツショウ	0
受賞	('名詞', '普通名詞', 'サ変可能', '*', '*', '*')	受賞	受賞	ジュショウ	0
。	('補助記号', '句点', '*', '*', '*', '*')	。	。	。	0
 	('空白', '*', '*', '*', '*', '*')	 	 	キゴウ	0
1995	('名詞', '数詞', '*', '*', '*', '*')	1995	1995	イチキュウキュウゴ	-1
年	('名詞', '普通名詞', '助数詞可能', '*', '*', '*')	年	年	ネン	0
、	('補助記号', '読点', '*', '*', '*', '*')	、	、	、	0
顕彰馬	('名詞', '普通名詞', '一般', '*', '*', '*')	顕彰馬	顕彰馬	ケンショウバ	0
に	('助詞', '格助詞', '*', '*', '*', '*')	に	に	ニ	0
選出	('名詞', '普通名詞', 'サ変可能', '*', '*', '*')	選出	選出	センシュツ	0
。	('補助記号', '句点', '*', '*', '*', '*')	。	。	。	0
主な	('連体詞', '*', '*', '*', '*', '*')	主な	主な	オモナ	0
勝ち鞍	('名詞', '普通名詞', '一般', '*', '*', '*')	勝ち鞍	勝ち鞍	カチクラ	0
は	('助詞', '係助詞', '*', '*', '*', '*')	は	は	ハ	0
1991	('名詞', '数詞', '*', '*', '*', '*')	1991	1991	イチキュウキュウイチ	-1
年	('名詞', '普通名詞', '助数詞可能', '*', '*', '*')	年	年	ネン	0
皐月賞	('名詞', '固有名詞', '一般', '*', '*', '*')	皐月賞	皐月賞	サツキショウ	0
、	('補助記号', '読点', '*', '*', '*', '*')	、	、	、	0
東京優駿	('名詞', '固有名詞', '一般', '*', '*', '*')	東京優駿	東京優駿	トウキョウユウシュン	0
(	('補助記号', '括弧開', '*', '*', '*', '*')	(	(	キゴウ	0
日本ダービー	('名詞', '固有名詞', '一般', '*', '*', '*')	日本ダービー	日本ダービー	ニッポンダービー	0
)	('補助記号', '括弧閉', '*', '*', '*', '*')	)	)	キゴウ	0
、	('補助記号', '読点', '*', '*', '*', '*')	、	、	、	0
1992	('名詞', '数詞', '*', '*', '*', '*')	1992	1992	イチキュウキュウニ	-1
年	('名詞', '普通名詞', '助数詞可能', '*', '*', '*')	年	年	ネン	0
ジャパンカップ	('名詞', '固有名詞', '一般', '*', '*', '*')	ジャパンカップ	ジャパンカップ	ジャパンカップ	0
、	('補助記号', '読点', '*', '*', '*', '*')	、	、	、	0
1993	('名詞', '数詞', '*', '*', '*', '*')	1993	1993	イチキュウキュウサン	-1
年	('名詞', '普通名詞', '助数詞可能', '*', '*', '*')	年	年	ネン	0
有馬記念	('名詞', '固有名詞', '一般', '*', '*', '*')	有馬記念	有馬記念	アリマキネン	0
など	('助詞', '副助詞', '*', '*', '*', '*')	など	など	ナド	0
。	('補助記号', '句点', '*', '*', '*', '*')	。	。	。	0
「	('補助記号', '括弧開', '*', '*', '*', '*')	「	「	キゴウ	0
皇帝	('名詞', '普通名詞', '一般', '*', '*', '*')	皇帝	皇帝	コウテイ	0
」	('補助記号', '括弧閉', '*', '*', '*', '*')	」	」	キゴウ	0
と	('助詞', '格助詞', '*', '*', '*', '*')	と	と	ト	0
称さ	('動詞', '一般', '*', '*', '五段-サ行', '未然形-一般')	称する	称す	ショウサ	0
れ	('助動詞', '*', '*', '*', '助動詞-レル', '連用形-一般')	れる	れる	レ	0
た	('助動詞', '*', '*', '*', '助動詞-タ', '連体形-一般')	た	た	タ	0
父	('名詞', '普通名詞', '一般', '*', '*', '*')	父	父	チチ	0
から	('助詞', '格助詞', '*', '*', '*', '*')	から	から	カラ	0
連想	('名詞', '普通名詞', 'サ変可能', '*', '*', '*')	連想	連想	レンソウ	0
し	('動詞', '非自立可能', '*', '*', 'サ行変格', '連用形-一般')	為る	する	シ	0
て	('助詞', '接続助詞', '*', '*', '*', '*')	て	て	テ	0
付け	('動詞', '非自立可能', '*', '*', '下一段-カ行', '未然形-一般')	付ける	付ける	ツケ	0
られ	('助動詞', '*', '*', '*', '助動詞-レル', '連用形-一般')	られる	られる	ラレ	0
た	('助動詞', '*', '*', '*', '助動詞-タ', '連体形-一般')	た	た	タ	0
馬名	('名詞', '普通名詞', '一般', '*', '*', '*')	馬名	馬名	バメイ	0
より	('助詞', '格助詞', '*', '*', '*', '*')	より	より	ヨリ	0
「	('補助記号', '括弧開', '*', '*', '*', '*')	「	「	キゴウ	0
帝王	('名詞', '普通名詞', '一般', '*', '*', '*')	帝王	帝王	テイオウ	0
」	('補助記号', '括弧閉', '*', '*', '*', '*')	」	」	キゴウ	0
、	('補助記号', '読点', '*', '*', '*', '*')	、	、	、	0
幾度	('名詞', '普通名詞', '一般', '*', '*', '*')	幾度	幾度	イクド	0
も	('助詞', '係助詞', '*', '*', '*', '*')	も	も	モ	0
の	('助詞', '格助詞', '*', '*', '*', '*')	の	の	ノ	0
骨折	('名詞', '普通名詞', 'サ変可能', '*', '*', '*')	骨折	骨折	コッセツ	0
から	('助詞', '格助詞', '*', '*', '*', '*')	から	から	カラ	0
復活	('名詞', '普通名詞', 'サ変可能', '*', '*', '*')	復活	復活	フッカツ	0
の	('助詞', '格助詞', '*', '*', '*', '*')	の	の	ノ	0
勝利	('名詞', '普通名詞', 'サ変可能', '*', '*', '*')	勝利	勝利	ショウリ	0
を	('助詞', '格助詞', '*', '*', '*', '*')	を	を	ヲ	0
挙げ	('動詞', '非自立可能', '*', '*', '下一段-ガ行', '連用形-一般')	上げる	挙げる	アゲ	0
た	('助動詞', '*', '*', '*', '助動詞-タ', '連体形-一般')	た	た	タ	0
競走	('名詞', '普通名詞', 'サ変可能', '*', '*', '*')	競走	競走	キョウソウ	0
生活	('名詞', '普通名詞', 'サ変可能', '*', '*', '*')	生活	生活	セイカツ	0
から	('助詞', '格助詞', '*', '*', '*', '*')	から	から	カラ	0
「	('補助記号', '括弧開', '*', '*', '*', '*')	「	「	キゴウ	0
奇跡	('名詞', '普通名詞', '一般', '*', '*', '*')	奇跡	奇跡	キセキ	0
の	('助詞', '格助詞', '*', '*', '*', '*')	の	の	ノ	0
名馬	('名詞', '普通名詞', '一般', '*', '*', '*')	名馬	名馬	メイバ	0
」	('補助記号', '括弧閉', '*', '*', '*', '*')	」	」	キゴウ	0
と	('助詞', '格助詞', '*', '*', '*', '*')	と	と	ト	0
も	('助詞', '係助詞', '*', '*', '*', '*')	も	も	モ	0
呼ば	('動詞', '一般', '*', '*', '五段-バ行', '未然形-一般')	呼ぶ	呼ぶ	ヨバ	0
れる	('助動詞', '*', '*', '*', '助動詞-レル', '終止形-一般')	れる	れる	レル	0
。	('補助記号', '句点', '*', '*', '*', '*')	。	。	。	0

各メソッドは以下ドキュメントにある。

https://worksapplications.github.io/sudachi.rs/python/api/sudachipy.html#sudachipy.Morpheme

ざっくりこんな感じらしい(ChatGPT調べ)

メソッド 説明
surface() 形態素の表層形(文字列)を取得します。つまり、テキスト中の実際の単語や形態素です。
part_of_speech() 形態素の品詞情報を取得します。例えば、名詞、動詞、助詞などの品詞が含まれます。
normalized_form() 形態素の正規化された形を取得します。日本語の動詞の場合、辞書形に変換されます。
dictionary_form() 形態素の辞書形を取得します。この形は、動詞の場合、基本的な辞書の形式になります。
reading_form() 形態素の読みを取得します。カタカナなどの読み仮名が含まれることがあります。
is_oov() 形態素が辞書に登録されていない未知語(Out of Vocabulary)かどうかを判定します。
dictionary_id() 形態素が属する辞書のIDを取得します。SudachiPyでは複数の辞書がサポートされており、このメソッドでどの辞書から形態素が取得されたかを確認できます。

part_of_speech()で返されるのはこういうことらしい。

https://worksapplications.github.io/sudachi.rs/python/api/sudachipy.html#sudachipy.Morpheme.part_of_speech

ChatGPT調べ

Sudachiのpart_of_speech()メソッドが返す情報は、6つの要素から成るタプルで、品詞情報を詳細に示しています。これらの要素は、4つの品詞のレベル、活用型(conjugation type)、および活用形(conjugation form)を表しています。各要素の詳細な説明は以下の通りです:

  1. 4つの品詞のレベル:
  • 第1要素: 品詞 (part of speech)
  • 第2要素: 品詞細分類1 (part of speech level 1)
  • 第3要素: 品詞細分類2 (part of speech level 2)
  • 第4要素: 品詞細分類3 (part of speech level 3)
  1. 活用型(conjugation type):
  • 第5要素: 動詞や形容詞などの活用型を示します。
  1. 活用形(conjugation form):
  • 第6要素: 活用された形(活用の詳細な情報)を示します。

これらの要素は、日本語の形態素解析において非常に詳細な情報を提供します。特定の文脈やタスクに応じて、これらの情報を使用して形態素を正確に分類したり、解釈したりすることができます。一般的なテキスト処理では、品詞情報の最初の4つの要素が主に利用されますが、特定のニーズに応じて詳細な情報を利用することができます。

kun432kun432

TF (Term Frequency)

TFは文書内での単語の出現頻度を示す。

TF(t, d) = \frac{n_{t}}{N_{d}}
  • TF(t, d): 単語 t の文書 d におけるTerm Frequency(用語の出現頻度)
  • {n_{t}}: 単語 t の文書 d における出現回数(単語 t の文書 d 内で何回出現したか)
  • {N_{d}}: 文書 d の単語の総数

とりあえず名詞だけに絞って算出してみる。ChatGPTに書かせてみる

from collections import Counter

noun_counts = Counter([t.normalized_form() for t in tokens if '名詞' in t.part_of_speech()[0]])

total_nouns = sum(noun_counts.values())
tf = {noun: count / total_nouns for noun, count in noun_counts.items()}

for noun, tf_value in tf.items():
    print("{}: {:.4f}".format(noun, tf_value))

こんな感じになる。

年: 0.0800
年度: 0.0400
4: 0.0267
月: 0.0267
日: 0.0267
日本: 0.0267
1: 0.0267
競走: 0.0267
1991: 0.0267
1993: 0.0267
トウカイテイオー: 0.0133
欧字: 0.0133
名: 0.0133
TOKAI: 0.0133
teio: 0.0133
1988: 0.0133
20: 0.0133
2013: 0.0133
8: 0.0133
30: 0.0133
競走馬: 0.0133
種牡馬: 0.0133
7: 0.0133
シンボリルドルフ: 0.0133
初: 0.0133
産駒: 0.0133
調教: 0.0133
最初: 0.0133
国際: 0.0133
g: 0.0133
優勝: 0.0133
JRA賞: 0.0133
年度代表馬: 0.0133
最優秀: 0.0133
牡馬: 0.0133
最優秀父内国産馬: 0.0133
JRA賞特別賞: 0.0133
受賞: 0.0133
1995: 0.0133
顕彰馬: 0.0133
選出: 0.0133
勝ち鞍: 0.0133
皐月賞: 0.0133
東京優駿: 0.0133
日本ダービー: 0.0133
1992: 0.0133
ジャパンカップ: 0.0133
有馬記念: 0.0133
皇帝: 0.0133
父: 0.0133
連想: 0.0133
馬名: 0.0133
帝王: 0.0133
幾度: 0.0133
骨折: 0.0133
復活: 0.0133
勝利: 0.0133
生活: 0.0133
奇跡: 0.0133
名馬: 0.0133

もうちょっと条件を絞りこんでもいいかもね。

kun432kun432

IDF (Inverse Document Frequency)

ある単語が出現する文書の数に反比例する値。よく出てくる単語(例:「the」や「is」のような一般的な単語)に低い重要度を与えるために使用される。

IDF(t)=log(\frac{N}{df(t)})
  • N: 文書の総数
  • df(t): 単語 t が出現する文書の数

上記の通り、こちらの場合は複数の文書が必要になる。wikipediaから複数拾ってきた。

https://ja.wikipedia.org/wiki/ナリタブライアン

https://ja.wikipedia.org/wiki/エアグルーヴ

https://ja.wikipedia.org/wiki/タイキシャトル

docs = [
    "トウカイテイオー(欧字名:Tokai Teio、1988年4月20日 - 2013年8月30日)は、日本の競走馬、種牡馬。七冠馬シンボリルドルフの初年度産駒の一頭であり、日本調教馬として最初の国際G1競走優勝馬である[注 1]。1991年度JRA賞年度代表馬、最優秀4歳牡馬および最優秀父内国産馬、1993年度JRA賞特別賞受賞。 1995年、顕彰馬に選出。主な勝ち鞍は1991年皐月賞、東京優駿(日本ダービー)、1992年ジャパンカップ、1993年有馬記念など。「皇帝」と称された父から連想して付けられた馬名より「帝王」[6]、幾度もの骨折から復活の勝利を挙げた競走生活から「奇跡の名馬」とも呼ばれる。",
    "ナリタブライアン(欧字名:Narita Brian、1991年5月3日 - 1998年9月27日)は、日本の競走馬、種牡馬。中央競馬史上5頭目のクラシック三冠馬であり、そのトレードマークから「シャドーロールの怪物」という愛称で親しまれた。1993年8月にデビューし、同年11月から1995年3月にかけてクラシック三冠を含むGI5連勝、10連続連対を達成し、1993年JRA賞最優秀3歳牡馬、1994年JRA賞年度代表馬および最優秀4歳牡馬に選出された。1995年春に故障(股関節炎)を発症したあとは低迷し、6戦して重賞を1勝するにとどまったが(GIは5戦して未勝利)、第44回阪神大賞典におけるマヤノトップガンとのマッチレースや短距離戦である第26回高松宮杯への出走によってファンの話題を集めた。第26回高松宮杯出走後に発症した屈腱炎が原因となって1996年10月に競走馬を引退した。引退後は種牡馬となったが、1998年9月に胃破裂を発症し、安楽死の措置がとられた。半兄に1993年のJRA賞年度代表馬ビワハヤヒデがいる。1997年日本中央競馬会 (JRA) の顕彰馬に選出。",
    "エアグルーヴ(欧字名:Air Groove、1993年4月6日 - 2013年4月23日)は、日本の競走馬、繁殖牝馬。1996年に優駿牝馬(オークス、GI)を優勝し、1983年の同レースを制した母・ダイナカールとの母娘2代での制覇を成し遂げた。1997年には天皇賞(秋)(GI)を優勝し、同年、牝馬としては1971年のトウメイ以来26年ぶりとなる年度代表馬に選出された。牡馬と互角以上に渡り合った戦績から「女帝」と称される[4]。その他の勝ち鞍に、1996年のチューリップ賞(GIII)、1997年の札幌記念(GII)、マーメイドステークス(GIII)、1998年の札幌記念(GII)、産経大阪杯(GII)。現役引退後には繁殖牝馬となり、2003年・2004年のエリザベス女王杯勝ち馬アドマイヤグルーヴ(父サンデーサイレンス)、2012年のクイーンエリザベス2世カップ勝ち馬のルーラーシップ(父キングカメハメハ)と2頭のGI勝ち馬を輩出した。",
    "タイキシャトル(欧字名:Taiki Shuttle、1994年3月23日 - 2022年8月17日)は、日本の競走馬、種牡馬。主戦騎手は岡部幸雄(ただし2戦は横山典弘が騎乗)。フランスのジャック・ル・マロワ賞を含め国内外でGI競走5勝を挙げ、1998年に短距離路線で活躍した競走馬として、また外国産馬として中央競馬史上初めて年度代表馬に選出され、同年フランスの年度代表馬顕彰(エルメス賞)において最優秀古馬に選出された。引退後の1999年1月28日には、史上25頭目の顕彰馬に選出された。"
]
from sudachipy import Dictionary, Tokenizer
from math import log

def tokenize(text):
    tokenizer = Dictionary(dict_type="full").create()
    mode = Tokenizer.SplitMode.C
    return [t.normalized_form() for t in tokenizer.tokenize(text, mode)]

def calculate_idf(docs):
    N = len(docs)
    df = {}

    for doc in docs:
        terms = set(tokenize(doc))
        for term in terms:
            df[term] = df.get(term, 0) + 1

    idf = {}
    for term, count in df.items():
        idf[term] = log(N / count)

    return idf

idf_values = calculate_idf(docs)
sorted_idf_values = sorted(idf_values.items(), key=lambda x: x[1], reverse=True)

for term, value in sorted_idf_values:
    print(f"{term}: {value}")

結果

年度: 1.3862943611198906
産駒: 1.3862943611198906
JRA賞特別賞: 1.3862943611198906
日本ダービー: 1.3862943611198906
有馬記念: 1.3862943611198906
より: 1.3862943611198906
1992: 1.3862943611198906
も: 1.3862943611198906
名馬: 1.3862943611198906
g: 1.3862943611198906
幾度: 1.3862943611198906
初: 1.3862943611198906
30: 1.3862943611198906
帝王: 1.3862943611198906
奇跡: 1.3862943611198906
られる: 1.3862943611198906
注: 1.3862943611198906
馬: 1.3862943611198906
連想: 1.3862943611198906
馬名: 1.3862943611198906
皇帝: 1.3862943611198906
受賞: 1.3862943611198906
呼ぶ: 1.3862943611198906
皐月賞: 1.3862943611198906
調教: 1.3862943611198906
国際: 1.3862943611198906
7: 1.3862943611198906
ジャパンカップ: 1.3862943611198906
東京優駿: 1.3862943611198906
最優秀父内国産馬: 1.3862943611198906
teio: 1.3862943611198906
骨折: 1.3862943611198906
生活: 1.3862943611198906
シンボリルドルフ: 1.3862943611198906
1988: 1.3862943611198906
主な: 1.3862943611198906
付ける: 1.3862943611198906
復活: 1.3862943611198906
20: 1.3862943611198906
など: 1.3862943611198906
最初: 1.3862943611198906
トウカイテイオー: 1.3862943611198906
TOKAI: 1.3862943611198906
へ: 1.3862943611198906
トレードマーク: 1.3862943611198906
半: 1.3862943611198906
クラシック: 1.3862943611198906
10: 1.3862943611198906
達成: 1.3862943611198906
取る: 1.3862943611198906
後: 1.3862943611198906
愛称: 1.3862943611198906
重賞: 1.3862943611198906
デビュー: 1.3862943611198906
連続: 1.3862943611198906
典: 1.3862943611198906
brian: 1.3862943611198906
り: 1.3862943611198906
怪物: 1.3862943611198906
含む: 1.3862943611198906
阪神: 1.3862943611198906
親しむ: 1.3862943611198906
故障: 1.3862943611198906
話題: 1.3862943611198906
マヤノトップガン: 1.3862943611198906
連勝: 1.3862943611198906
や: 1.3862943611198906
ファン: 1.3862943611198906
春: 1.3862943611198906
高松宮: 1.3862943611198906
シャドーロール: 1.3862943611198906
措置: 1.3862943611198906
兄: 1.3862943611198906
居る: 1.3862943611198906
9: 1.3862943611198906
胃: 1.3862943611198906
回: 1.3862943611198906
出走: 1.3862943611198906
ビワハヤヒデ: 1.3862943611198906
11: 1.3862943611198906
連対: 1.3862943611198906
発症: 1.3862943611198906
引退: 1.3862943611198906
留まる: 1.3862943611198906
安楽死: 1.3862943611198906
ナリタブライアン: 1.3862943611198906
三冠馬: 1.3862943611198906
股: 1.3862943611198906
屈腱炎: 1.3862943611198906
よる: 1.3862943611198906
原因: 1.3862943611198906
第: 1.3862943611198906
JRA: 1.3862943611198906
日本中央競馬会: 1.3862943611198906
マッチ: 1.3862943611198906
低迷: 1.3862943611198906
未: 1.3862943611198906
narita: 1.3862943611198906
集める: 1.3862943611198906
関節炎: 1.3862943611198906
言う: 1.3862943611198906
44: 1.3862943611198906
大賞: 1.3862943611198906
破裂: 1.3862943611198906
かける: 1.3862943611198906
27: 1.3862943611198906
2004: 1.3862943611198906
世: 1.3862943611198906
成し遂げる: 1.3862943611198906
トウメイ: 1.3862943611198906
アドマイヤグルーブ: 1.3862943611198906
ルーラーシップ: 1.3862943611198906
オークス: 1.3862943611198906
ダイナ: 1.3862943611198906
エリザベス女王: 1.3862943611198906
他: 1.3862943611198906
互角: 1.3862943611198906
エアー: 1.3862943611198906
女帝: 1.3862943611198906
牝馬: 1.3862943611198906
天皇賞: 1.3862943611198906
2003: 1.3862943611198906
勝ち馬: 1.3862943611198906
クイーン・エリザベス: 1.3862943611198906
輩出: 1.3862943611198906
GII: 1.3862943611198906
戦績: 1.3862943611198906
母娘: 1.3862943611198906
秋: 1.3862943611198906
優駿牝馬: 1.3862943611198906
カール: 1.3862943611198906
グルーブ: 1.3862943611198906
振り: 1.3862943611198906
代: 1.3862943611198906
Sunday Silence: 1.3862943611198906
制する: 1.3862943611198906
産経: 1.3862943611198906
カップ: 1.3862943611198906
マーメイドステークス: 1.3862943611198906
以来: 1.3862943611198906
1983: 1.3862943611198906
同: 1.3862943611198906
以上: 1.3862943611198906
母: 1.3862943611198906
チューリップ賞: 1.3862943611198906
2012: 1.3862943611198906
大阪杯: 1.3862943611198906
渡り合う: 1.3862943611198906
繁殖牝馬: 1.3862943611198906
札幌記念: 1.3862943611198906
エアグルーヴ: 1.3862943611198906
キングカメハメハ: 1.3862943611198906
1971: 1.3862943611198906
GIII: 1.3862943611198906
現役引退後: 1.3862943611198906
制覇: 1.3862943611198906
TAIKI: 1.3862943611198906
国内外: 1.3862943611198906
外国産馬: 1.3862943611198906
25: 1.3862943611198906
シャトル: 1.3862943611198906
活躍: 1.3862943611198906
含める: 1.3862943611198906
2022: 1.3862943611198906
マロワ: 1.3862943611198906
賞: 1.3862943611198906
顕彰: 1.3862943611198906
初めて: 1.3862943611198906
又: 1.3862943611198906
タイキシャトル: 1.3862943611198906
岡部幸雄: 1.3862943611198906
17: 1.3862943611198906
騎乗: 1.3862943611198906
但し: 1.3862943611198906
ル: 1.3862943611198906
フランス: 1.3862943611198906
1999: 1.3862943611198906
主戦騎手: 1.3862943611198906
28: 1.3862943611198906
路線: 1.3862943611198906
史上: 1.3862943611198906
エルメス: 1.3862943611198906
ジャック: 1.3862943611198906
横山典弘: 1.3862943611198906
古馬: 1.3862943611198906
1991: 0.6931471805599453
2013: 0.6931471805599453
有る: 0.6931471805599453
勝ち鞍: 0.6931471805599453
優勝: 0.6931471805599453
歳: 0.6931471805599453
]: 0.6931471805599453
上げる: 0.6931471805599453
冠: 0.6931471805599453
1995: 0.6931471805599453
競走: 0.6931471805599453
及び: 0.6931471805599453
[: 0.6931471805599453
JRA賞: 0.6931471805599453
勝利: 0.6931471805599453
だ: 0.6931471805599453
父: 0.6931471805599453
称する: 0.6931471805599453
1994: 0.6931471805599453
引退後: 0.6931471805599453
26: 0.6931471805599453
勝: 0.6931471805599453
レース: 0.6931471805599453
中央競馬: 0.6931471805599453
1997: 0.6931471805599453
1996: 0.6931471805599453
上: 0.6931471805599453
杯: 0.6931471805599453
おく: 0.6931471805599453
目: 0.6931471805599453
5: 0.6931471805599453
其の: 0.6931471805599453
成る: 0.6931471805599453
史: 0.6931471805599453
戦: 0.6931471805599453
が: 0.6931471805599453
3: 0.6931471805599453
短距離: 0.6931471805599453
・: 0.6931471805599453
23: 0.6931471805599453
2: 0.6931471805599453
4: 0.28768207245178085
6: 0.28768207245178085
から: 0.28768207245178085
種牡馬: 0.28768207245178085
1: 0.28768207245178085
顕彰馬: 0.28768207245178085
」: 0.28768207245178085
牡馬: 0.28768207245178085
最優秀: 0.28768207245178085
8: 0.28768207245178085
「: 0.28768207245178085
1993: 0.28768207245178085
同年: 0.28768207245178085
GI: 0.28768207245178085
で: 0.28768207245178085
1998: 0.28768207245178085
日: 0.0
に: 0.0
。: 0.0
競走馬: 0.0
月: 0.0
年: 0.0
 : 0.0
た: 0.0
(: 0.0
頭: 0.0
): 0.0
を: 0.0
、: 0.0
日本: 0.0
れる: 0.0
:: 0.0
は: 0.0
て: 0.0
為る: 0.0
-: 0.0
年度代表馬: 0.0
名: 0.0
と: 0.0
選出: 0.0
の: 0.0
欧字: 0.0

上位ほど全体で珍しい単語ということになる。

kun432kun432

TF-IDF

TFとIDFを乗算する。この値が高いほど、

  • 特定の文書内で重要
  • かつ、文書集合全体においても希少

ということになるらしい。

from collections import defaultdict
import math

# トークン化関数
def tokenize(text):
    from sudachipy import Dictionary
    tokenizer = Dictionary(dict="full").create()
    mode = Tokenizer.SplitMode.C
    return [t.normalized_form() for t in tokenizer.tokenize(text, mode)]

# IDFを計算する関数
def compute_idf(docs):
    idf = defaultdict(float)
    all_tokens_set = set()
    tokens_list = []
    
    for doc in docs:
        tokens = set(tokenize(doc))
        tokens_list.append(tokens)
        all_tokens_set.update(tokens)
    
    for token in all_tokens_set:
        contains_token = sum(1 for _doc in tokens_list if token in _doc)
        idf[token] = math.log(len(docs) / (contains_token + 1))
    
    return idf

# TFを計算する関数
def compute_tf(tokenized_doc):
    tf = defaultdict(float)
    for token in tokenized_doc:
        tf[token] += 1.0
    total_tokens = len(tokenized_doc)
    for token in tf:
        tf[token] /= total_tokens
    return tf

# TF-IDFを計算する関数
def compute_tf_idf(docs):
    idf = compute_idf(docs)
    tf_idfs = []
    
    for doc in docs:
        tf = compute_tf(tokenize(doc))
        tf_idf = {}
        for token, tf_val in tf.items():
            tf_idf[token] = tf_val * idf[token]
        tf_idfs.append(tf_idf)
    
    return tf_idfs

# 実際にTF-IDFを計算
tf_idfs = compute_tf_idf(docs)

# 結果を表示(各ドキュメントのTF-IDFの上位5語とその値を表示)
for index, tf_idf in enumerate(tf_idfs):
    print(f"Document {index + 1}:")
    sorted_tf_idf = sorted(tf_idf.items(), key=lambda x: x[1], reverse=True)
    for token, value in sorted_tf_idf[:10]:
        print(f"{token}: {value}")
    print("\n")

結果

Document 1:
馬: 0.012757310071655436
年度: 0.012757310071655436
も: 0.008504873381103624
トウカイテイオー: 0.004252436690551812
TOKAI: 0.004252436690551812
teio: 0.004252436690551812
1988: 0.004252436690551812
20: 0.004252436690551812
30: 0.004252436690551812
7: 0.004252436690551812


Document 2:
発症: 0.007480005545610921
第: 0.007480005545610921
回: 0.007480005545610921
が: 0.005174137993737065
9: 0.0049866703637406135
クラシック: 0.0049866703637406135
10: 0.0049866703637406135
後: 0.0049866703637406135
高松宮: 0.0049866703637406135
出走: 0.0049866703637406135


Document 3:
GII: 0.009627044174443685
勝ち馬: 0.009627044174443685
繁殖牝馬: 0.006418029449629123
GIII: 0.006418029449629123
札幌記念: 0.006418029449629123
2: 0.003995584339608067
エアグルーヴ: 0.0032090147248145613
エアー: 0.0032090147248145613
グルーブ: 0.0032090147248145613
優駿牝馬: 0.0032090147248145613


Document 4:
フランス: 0.010118936942480953
賞: 0.010118936942480953
タイキシャトル: 0.0050594684712404765
TAIKI: 0.0050594684712404765
シャトル: 0.0050594684712404765
2022: 0.0050594684712404765
17: 0.0050594684712404765
主戦騎手: 0.0050594684712404765
岡部幸雄: 0.0050594684712404765
但し: 0.0050594684712404765
kun432kun432

もう少しデータ量が大きい方がいいかなと思って、wikipediaの該当ページをまるっと読むようにしてみた。

!pip install wikipedia
import wikipedia
from pprint import pprint
wikipedia.set_lang("ja")

horses = ["トウカイテイオー","ナリタブライアン","エアグルーヴ","タイキシャトル"]
docs = []

for h in horses:
    page = wikipedia.page(h)
    docs.append(page.content)

で先程のコードを実行してみたところ以下のエラー。

Exception: Tokenization error: Input is too long, it can't be more than 49149 bytes, was 64423

Sudachiの内部処理的に制限がかけてあるらしい。

https://zenn.dev/hyga2c/articles/ginza5_largetext

ということで"。"で分割しながら処理するように変えてみた。

# トークン化関数
def tokenize(text):
    tokenizer = Dictionary(dict_type="full").create()
    mode = Tokenizer.SplitMode.C

    # "。" でテキストを分割
    sentences = text.split("。")

    tokens = []
    for sentence in sentences:
        # 各文をトークナイズし、結果をtokensに追加
        tokens.extend([t.normalized_form() for t in tokenizer.tokenize(sentence, mode)])

    return tokens

で再度TF-IDFを求めてみる。

Document 1:
テイオー: 0.0043001906128660025
トウカイテイオー: 0.0016040071575370222
松元: 0.0014152526067660262
安田: 0.0009253574736547094
東海: 0.0008164918885188613
生: 0.0007076263033830131
雄: 0.0005443279256792408
センター: 0.0005196079524415705
田原: 0.0004898951331113167
スタリオン: 0.0004898951331113167


Document 2:
ナリタブライアン: 0.006674666827654116
大久保: 0.0024322938439756527
南井: 0.001131299462314257
シャドーロール: 0.0010181695160828314
早田: 0.0007919096236199799
批判: 0.0007919096236199799
兄: 0.0006222147042728414
ブライアン: 0.0006222147042728414
ビワハヤヒデ: 0.0005869146247180123
高松宮: 0.0005656497311571285


Document 3:
伊藤: 0.0032368447391058156
早来: 0.0013872191739024923
札幌記念: 0.0011560159782520768
アドマイヤグルーブ: 0.0011560159782520768
エアグルーヴ: 0.0009595799614802563
ダイナ: 0.0006936095869512462
カール: 0.0006936095869512462
伊藤雄二: 0.0006936095869512462
バブルガムフェロー: 0.0006936095869512462
交わす: 0.0006936095869512462


Document 4:
タイキシャトル: 0.005056629263344157
藤沢: 0.0018152002483799539
産: 0.001076251673968503
スプリンターズS: 0.0010372572847885452
安田記念: 0.0007779429635914089
マイラー: 0.0007779429635914089
賞: 0.000699563588079527
シャトル: 0.0006482858029928407
マイルチャンピオンシップ: 0.0006457510043811019
フランス: 0.0005919384206826767

それっぽい感じになっている

このスクラップは2023/10/15にクローズされました