🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

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

Mecab

Mecabは、オープンソースの形態素解析エンジンです。 言語、辞書、コーパスに依存しない汎用的な設計を基本方針としています。 Mecabの由来は、開発者の好物である和布蕪(めかぶ)から名づけられました。

自然言語処理

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

Q&A

解決済

1回答

356閲覧

idfが計算できない

farinelli

総合スコア61

Python 3.x

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

Mecab

Mecabは、オープンソースの形態素解析エンジンです。 言語、辞書、コーパスに依存しない汎用的な設計を基本方針としています。 Mecabの由来は、開発者の好物である和布蕪(めかぶ)から名づけられました。

自然言語処理

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

0グッド

0クリップ

投稿2019/10/23 02:57

テキストファイルから特定の文字列を除去した後,形態素解析によりストップワードを含まない2文字以上の名詞を抽出し.抽出した名詞毎にtf-idfを表示したいと考えています.
又,tf-idfを構成する4要素(下記参照)は個別に取得するものとします.
・ある単語t の文書d 内での出現回数
・文書d内のすべての単語の出現回数の和
・全文書数(N)
・ある単語t が出現する文書の数(df)
プログラムを組んでみたのですが,dfが単語と対応する性質を持つことからリストや辞書の類でまとめる必要があり,int型を持つNと除算ができず,困っています.

この件に関しまして,解決策をご存知の方に是非ご教示頂きたいです.
宜しくお願いします.

テキスト

protein.txt

1全ゲノム配列決定が容易になった結果,多くの新規遺伝子(タンパク質)の存在や機能を配列情報から予測することはかなり容易になった. 2とはいえ,どの生物種でも全遺伝子の1/3~1/2はその配列からだけでは機能を予測できない「機能未知タンパク質」をコードしている. 3生命現象の全体像を分子レベルから理解するためには,それら機能未知タンパク質の機能の解明も必要である. 4又,タンパク質配列のうち全くもって未知なものもあれば,多くの種で保存されている既知の機能部位を持つものもある. 5更に,タンパク質が持つ活性(分子機能)と細胞における働き(細胞内機能)は往々にして別の文脈で語られることが多く,これらを実験的に検証する系は未だ存在しない. 6本研究では,モデル生物である出芽酵母を用いて,関心のある機能未知タンパク質の機能部位の同定と機能解析をランダム変異導入法を用いて,安価かつ簡素に行う系を確立することを目的とする.

理想の出力結果

dfs: {'ゲノム': oo, '配列': oo, '決定': oo, '容易': oo, …} #ooには任意の数字が入る

エラー

Traceback (most recent call last): File "renshu3.py", line 83, in <module> idfs = np.log(num_lines / dfs) + 1 #問題の箇所 TypeError: unsupported operand type(s) for /: 'int' and 'dict'

コード

renshu.py

1#!/usr/bin/python 2# -*- coding: utf-8 -*- 3import MeCab 4import codecs 5import re 6import numpy as np 7 8with codecs.open("protein.txt", "r", "utf-8") as f: 9 corpus = f.read() 10num_lines = sum(1 for line in open("protein.txt"))#総文書数 11 12mecab = MeCab.Tagger('-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd') 13mecab.parse('') 14m = mecab.parseToNode(corpus) 15 16#除外したい単語リスト 17rm_list = ["RT","https","co","さん","フォロー","本日","応募","今日","プレゼント","お金","FGO","無料","本人","投稿","動画","ツイート","リツイート","Twitter","ローソン","Peing","http","Amazonギフト券","bot","発売中","Youtube","www","WWW","質問箱","コラボ","フォロワー","DM","いいね","RT","lawson","://","!","peing","youtube","抽選","jp","リプ","キャンペーン","チケット","期間限定","DHC","日本","amp","人間","チャンネル","配信中","YouTube","WEB","楽しみ","イラスト","くじ","@","__"] 18 19#ストップワード 20stop_words = [] 21path = 'stop_words.txt' 22with open(path) as g: 23 stop_words = g.readlines() 24 25#url, 返信, RT, 絵文字の除去 26corpus = re.sub(r"http\S+", "", corpus) 27corpus = re.sub(r"@(\w+) ", "", corpus) 28corpus = re.sub(r"(^RT.*)", "", corpus, flags=re.MULTILINE | re.DOTALL) 29emoji_pattern = re.compile("[" 30u"\U0001F600-\U0001F64F" 31u"\U0001F300-\U0001F5FF" 32u"\U0001F680-\U0001F6FF" 33u"\U0001F1E0-\U0001F1FF" 34"]+", flags=re.UNICODE) 35corpus = emoji_pattern.sub("", corpus) 36 37keywords = [] 38#単語のスクリーニング 39while m: 40 if m.feature.split(',')[0] == '名詞': 41 if m.surface not in rm_list: 42 if len(m.surface) >= 2: 43 keywords.append(m.surface) 44 m = m.next 45 46#名詞の重複を消す 47nouns = [] 48for line in keywords: 49 if line not in nouns: 50 nouns.append(line) 51 52#tf, idfの計算 53tfs = [] # 記事毎のリスト。リスト要素は記事内の単語毎のtf値 54dfs = {} # 単語毎のdf値 55for idx,doc in enumerate(nouns): 56 tf = {} 57 for term in keywords: 58 tangosuu = len(keywords) 59 60 # (記事内の)単語毎のtf値 61 if term not in tf: 62 tf[term] = 0 63 tf[term] += 1 / tangosuu 64 65 # 単語毎のdf値 66 if term not in dfs: 67 dfs[term] = set() 68 dfs[term].add(idx) 69 70 tfs.append(tf) 71 #r.get(tf, term) 72 73#記事番号の集合の大きさ=出現数 74for term,doc_set in dfs.items(): 75 dfs[term] = len(doc_set) 76 #r.get(df, term) 77 78 idfs = np.log(num_lines / dfs) + 1 #問題の箇所 79 80print('nouns:',nouns) 81print('idfs:',idfs)

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

iOS 10.15, Python 3.7.4, Atom

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

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

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

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

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

guest

回答1

0

ベストアンサー

辞書内包表記などを用いて、個別に要素を計算すればよいかと思います。

python

1>>> import numpy as np 2>>> d = {"hoge":1, "fuga":2, "piyo":3} 3>>> id = {k:np.log(1/v) + 1 for k, v in d.items()} 4>>> id 5{'hoge': 1.0, 'fuga': 0.30685281944005471, 'piyo': -0.098612288668109782}

投稿2019/10/23 18:49

hayataka2049

総合スコア30935

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

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

farinelli

2019/10/30 03:09

お返事遅くなり失礼致しました.有難うございます.やってみます.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問