【ゆるプロ!番外編】文字列で使われている文字を走査する、その2
今回は和文で使用されている文字を走査していく
前回
対象
設計
着想としては、和文の単語を全て列挙してから検証することに意味はあるのかと考えた上でこのような結果となった
調べてみた結果、使用されている文字は、文字列から形態素解析を用いてリスト(文節)を作成して、文字列を改めて文節毎にヒットした数を数えることにした
実装
設計に基づいて作成したコードは以下の通り。今回は形態素解析でspaCyとspaCyのモデルを使用している
import spacy
# モデルのロード
nlp = spacy.load("ja_core_news_sm")
# 走査対象
string = """
それは最高の時代であり、最悪の時代であり、知恵の時代であり、愚かさの時代であり、信仰の時代であり、不信の時代であり、光の季節でした。それは暗闇の季節でした、それは希望の春でした、それは絶望の冬でした、私たちは目の前にすべてを持っていました、私たちの前には何もありませんでした、私たちは皆天国にまっすぐに行きました、そして私たちは皆反対方向にまっすぐに行きました--要するに、この時代は現代とあまりにも似ており、最もうるさい権威者の一部は、良くも悪くも、この時代を最上級の比較においてのみ受け入れようと主張した。
"""
doc = nlp(string)
# 走査するリストを作る
tmp_list = set() # 重複を省く
tmp_list2 = []
scanning_list = []
# 辞書に格納する
for token in doc:
tmp_list.add(token.text)
# 文節(形態素解析の結果)
# print("走査に使う文節一覧(ソート前)↓")
# print(tmp_list)
# リスト化
tmp_list2 = list(tmp_list)
# ソート
scanning_list = sorted(tmp_list2)
# 結果の表示
print("走査に使う文節一覧(昇順)↓")
print(scanning_list)
# 結果を格納する辞書を用意する
japanese_dictionary = {}
# カウンターを準備する
count = 0
for s_token in scanning_list:
for d_token in doc:
if s_token == d_token.text:
count = count + 1
japanese_dictionary[s_token] = count
count = 0
# ヒット数で降順でソートする
japanese_dictionary_sorted = {}
japanese_dictionary_sorted = dict(
sorted(japanese_dictionary.items(), key=lambda item: item[1], reverse=True)
)
# 結果の表示
print("文節毎の使用頻度(降順)↓")
for japanese_dictionary_sorted_key in japanese_dictionary_sorted:
print(japanese_dictionary_sorted_key + ": " + str(japanese_dictionary_sorted[japanese_dictionary_sorted_key]))
結果
文節毎に結果が表示される
結果を見ると、句読点 や助詞に意味はあまりないと考えると、名詞である「時代」が目に付くので、ここでの主張は時代を重要なキーワードとして捉えたらよいのではないかと
走査に使う文節一覧(昇順)↓
['\n', '、', '。', 'あまり', 'あり', 'い', 'うるさい', 'おい', 'おり', 'この', 'さ', 'し', 'すべて', 'そして', 'それ', 'た', 'た--', 'たち', 'て', 'で', 'でし', 'と', 'に', 'の', 'のみ', 'は', 'まし', 'ませ', 'まっすぐ', 'も', 'を', 'ん', '一部', '不信', '主張', '似', '何', '信仰', '光', '入れよう', '冬', '前', '反対', '受け', '天国', '季節', '希望', '悪く', '愚か', '持っ', '方向', '春', '時代', '暗闇', '最も', '最上', '最悪', '最高', '権威', '比較', '現代', '皆', '目', '知恵', '私', '級', '絶望', '者', '良く', '行き', '要する']
文節毎の使用頻度(降順)↓
、: 16
の: 14
は: 10
に: 9
た: 8
時代: 8
あり: 7
で: 6
でし: 5
それ: 4
たち: 4
も: 4
私: 4
て: 3
まし: 3
: 2
。: 2
この: 2
と: 2
まっすぐ: 2
を: 2
前: 2
季節: 2
皆: 2
行き: 2
あまり: 1
い: 1
うるさい: 1
おい: 1
おり: 1
さ: 1
し: 1
すべて: 1
そして: 1
た--: 1
のみ: 1
ませ: 1
ん: 1
一部: 1
不信: 1
主張: 1
似: 1
何: 1
信仰: 1
光: 1
入れよう: 1
冬: 1
反対: 1
受け: 1
天国: 1
希望: 1
悪く: 1
愚か: 1
持っ: 1
方向: 1
春: 1
暗闇: 1
最も: 1
最上: 1
最悪: 1
最高: 1
権威: 1
比較: 1
現代: 1
目: 1
知恵: 1
級: 1
絶望: 1
者: 1
良く: 1
要する: 1
課題
コードの話ではあるが、型の変換を何度か行っていることと、走査対象の文字列から文節一覧を取得するタイミングで数えることは出来ないのか?また、大量の文字列を処理する場合は適切かなど。とりあえず、次回はnoteの文字列から検索を試みる
参考
形態素解析出来そうなツールを列挙しておく
MeCab
NLTK
GINZA
spaCy
spaCyとモデルのインストール
yahoo、日本語形態素解析
昔、ビジネス向けだとは思うがNTT COTOHAや、形態素解析ではないがGMOではConoHaがいた。ネーミングセンスというかLLMもそうだが製品名には似た名前を付けるよね
過去に他の人が取り組んでいた記事など
書籍
辞書をソート
lambda
lambdaの実行
setオブジェクト
おわり!