質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

Q&A

1回答

600閲覧

形態素解析のIDF値の求める方法について

green2021

総合スコア16

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

0グッド

0クリップ

投稿2021/11/08 07:45

編集2021/11/08 08:13

前提・実現したいこと

形態素解析のIDF値の求める方法を教えていただきたいです。
テキストから形態素解析をし、「テキストの文章のそれぞれの品詞を振り分けること」、「出現した名詞の個数」、「TF値」を出力できるのですが、IDF値の求める方法には至りませんでした。
どなたかご教授よろしくお願いします。

また、TF値、IDF値とはどのようなものか存じ上げていますが、pythonをはじめて日が浅いためIDF値の求め方がわかりませんでした。

発生している問題・エラーメッセージ

ソースコードからIDF値の求める方法には至りませんでした。

該当のソースコード

# text-mining.py # coding: shift_jis # python解析器janomeをインポート - 1 from janome.tokenizer import Tokenizer # 形態素解析用オブジェクトの生成 - 2 text = Tokenizer() # txtファイルからデータの読み込み - 3 text_file = open("./src/text_1.txt",encoding="shift_jis") # encoding="utf-8"を加えることで、読み込めるようになった。 # "test1.txt"の部分で読み込みたいテキストファイルを書く。 bindata = text_file.read() txt = bindata # txtから読み込んだデータを形態素解析 - 4 lines = txt.split("\r\n") for i in lines: print(i) print("\n") text_c = text.tokenize(i) for j in text_c: print(j) print("\n") # テキストを一行ごとに処理 - 5 word_dic = {} lines_1 = txt.split("\r\n") print(lines_1) print("\n") for line in lines_1: malist = text.tokenize(line) for w in malist: word = w.surface ps = w.part_of_speech # 品詞 - 6 if ps.find("名詞") < 0: continue # 名詞だけをカウント - 7 if not word in word_dic: word_dic[word] = 0 word_dic[word] += 1 count = [] wordlist = [] # よく使われる単語を表示 - 8 keys = sorted(word_dic.items(), key=lambda x:x[1], reverse=True) for word, cnt in keys[:50]: print("{0}({1})".format(word,cnt), end="") wordlist.append(word) count.append(cnt) print("\n") sum_count = sum(count) # TF値 for keyword , keyword_num in zip(wordlist,count): print(keyword,keyword_num) print(keyword_num/sum_count) ##text_1.txt 私の名前は太郎です。 自然言語処理を行っています。 自然言語処理は難しいです。 私はプログラミング初心者ですが、頑張りたいと思います。 自然言語処理の中でも、形態素解析を最初に学んでます。

試したこと

TF値は配列などを用いて、求めることができたのですが、IDF値の求めることができませんでした。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

quickquip

2021/11/08 08:07 編集

末尾に ##text_1.txt #私の名前は太郎です。自然言語処理を行っています。 と書いてありますが、これはどういう意図ですか? (改行コード判断で)1文しか入ってないテキストを扱っているんでしょうか?
green2021

2021/11/08 08:10

ご質問ありがとうございます。 こちらも説明不足ですいません。 質問の返答ですが、実際にはもっと長い文章を扱います。 なので、今回は短い文に設定しました。 (IDF値であれば、複数行必要でしたよね) text_1.txtの内容は修正したいと思います。
guest

回答1

0

以下です。

python

1from janome.tokenizer import Tokenizer 2from math import log 3tknzr = Tokenizer() 4 5def get_nouns(src): 6 return [t.surface for t in tknzr.tokenize(src) if t.part_of_speech.split(',')[0] == '名詞'] 7 8def get_noun_lists(sources): 9 return [get_nouns(src) for src in sources] 10 11def get_idf(noun, noun_lists): 12 return log(len(noun_lists)/(1 + len([nl for nl in noun_lists if noun in nl])))

実行結果

python

1>>> data = '''私の名前は太郎です。 2... 自然言語処理を行っています。 3... 自然言語処理は難しいです。 4... 私はプログラミング初心者ですが、頑張りたいと思います。 5... 自然言語処理の中でも、形態素解析を最初に学んでます。''' 6>>> 7>>> sources = data.split('\n') 8>>> 9>>> noun_lists = get_noun_lists(sources) 10>>> 11>>> get_idf('名前', noun_lists) 120.9162907318741551 13>>> get_idf('自然', noun_lists) 140.22314355131420976 15

投稿2021/11/08 23:54

ppaul

総合スコア24666

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問