テキストファイルから特定の文字列を除去した後,形態素解析によりストップワードを含まない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
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/10/30 03:09