#概要
pythonの関数から、求める返り値が得られません。下記のようにうまくいっておりません。
正しい返り値を得るために、『修正したいコード』をどのように良くできるか、アドバイスをいただければ幸いです。
#修正したいコード
この関数内で使用した関数は、下の『使用した関数』に記載しております。
#関数 #入力;[['**','***'],['*','***'],['****','*']]という形の二重リスト #出力;二重リストに含まれる語の出現回数をvalueとする辞書のリスト(下に記載されたようなものです) def total_word_count(timelines1): total_word_dict={} total_word_count_l=[] for TL in timelines1: TL2SL=timeline2stemDict(TL) total_word_count_l.append(TL2SL) for word in TL2SL: if word not in total_word_dict: total_word_dict[word]=0 print(total_word_count_l) print() print(total_word_dict) print() total_word_dict_list=[total_word_dict]*len(total_word_count_l) for i in range(len(total_word_count_l)): for Word in total_word_dict: if Word in total_word_count_l[i]: n=total_word_count_l[i][Word] total_word_dict_list[i][Word]=n else: total_word_dict_list[i][Word]=0 return total_word_dict_list
#修正したいコードの試用
sample_timelines=[['みかん、餅を食べた','美味しい'],['みかんを食べた','美味しい'],['消しゴムを食べた','まずい']] print(total_word_count(sample_timelines))
#出力 #total_word_count_l [{'みかん': 1, '、': 1, '餅': 1, 'を': 1, '食べる': 1, 'た': 1, '美味しい': 1}, {'みかん': 1, 'を': 1, '食べる': 1, 'た': 1, '美味しい': 1}, {'消しゴム': 1, 'を': 1, '食べる': 1, 'た': 1, 'まずい': 1}] #total_word_dict {'みかん': 0, '、': 0, '餅': 0, 'を': 0, '食べる': 0, 'た': 0, '美味しい': 0, '消しゴム': 0, 'まずい': 0} #ここまでは得たい結果が得られています。 #total_word_dict_list [{'みかん': 0, '、': 0, '餅': 0, 'を': 1, '食べる': 1, 'た': 1, '美味しい': 0, '消しゴム': 1, 'まずい': 1}, {'みかん': 0, '、': 0, '餅': 0, 'を': 1, '食べる': 1, 'た': 1, '美味しい': 0, '消しゴム': 1, 'まずい': 1}, {'みかん': 0, '、': 0, '餅': 0, 'を': 1, '食べる': 1, 'た': 1, '美味しい': 0, '消しゴム': 1, 'まずい': 1}]
この最後のリストtotal_word_dict_listが、求めるものではありません。
代わりに得たい結果は、次のようなものです。
#total_word_dict_list [{'みかん': 1, '、': 0, '餅': 1, 'を': 1, '食べる': 1, 'た': 1, '美味しい': 1, '消しゴム': 0, 'まずい': 0}, {'みかん': 1, '、': 0, '餅': 0, 'を': 1, '食べる': 1, 'た': 1, '美味しい': 1, '消しゴム': 0, 'まずい': 0}, {'みかん': 0, '、': 0, '餅': 0, 'を': 1, '食べる': 1, 'た': 1, '美味しい': 0, '消しゴム': 1, 'まずい': 1}]
total_word_dictに、total_word_count_lの各要素を重ね合わせたような形が、求めるものです。
#使用した関数
修正したいコードの中で使用した関数は、下の二つになります。これらが機能することは確認済みです。
import MeCab #関数 #入力;文字列 #出力;形態素解析の結果である二重リスト def mecab_list(text): tagger = MeCab.Tagger("-Ochasen") tagger.parse('') node = tagger.parseToNode(text) mecab_output = [] while node: word = node.surface wclass = node.feature.split(',') if wclass[0] != u'BOS/EOS': if wclass[6] == None: mecab_output.append([word,wclass[0],wclass[1],wclass[2],""]) else: mecab_output.append([word,wclass[0],wclass[1],wclass[2],wclass[6]]) node = node.next return mecab_output #確認 print(mecab_list('昨日買った犬は寝ていた'))
#結果 [['昨日', '名詞', '副詞可能', '*', '昨日'], ['買っ', '動詞', '自立', '*', '買う'], ['た', '助動詞', '*', '*', 'た'], ['犬', '名詞', '一般', '*', '犬'], ['は', '助詞', '係助詞', '*', 'は'], ['寝', '動詞', '自立', '*', '寝る'], ['て', '助詞', '接続助詞', '*', 'て'], ['い', '動詞', '非自立', '*', 'いる'], ['た', '助動詞', '*', '*', 'た']]
#関数 #入力;['----',...,'@@@@@']という形状のリスト #返り値;辞書。mecabで抽出した語幹をkeyに、timelineにその語が出現した回数をvalueに持つ。 def timeline2stemDict(timeline): timeline_d={} for twt in timeline: twtML=mecab_list(twt) for i in range(len(twtML)): if twtML[i][4] in timeline_d: timeline_d[twtML[i][4]]+=1 else: timeline_d[twtML[i][4]]=1 return timeline_d #確認 sample_timeline=['昨日の朝ごはんは非常に美味しかった。','明日のお昼ご飯は美味しく作ることができるかな?','今日も早めに寝ることにしよう。'] print(timeline2stemDict(sample_timeline))
#結果 {'昨日': 1, 'の': 2, '朝': 1, 'ごはん': 1, 'は': 2, '非常': 1, 'に': 3, '美味しい': 2, 'た': 1, '。': 2, '明日': 1, 'お昼': 1, 'ご飯': 1, '作る': 1, 'こと': 2, 'が': 1, 'できる': 1, 'か': 1, 'な': 1, '?': 1, '今日': 1, 'も': 1, '早め': 1, '寝る': 1, 'する': 1, 'う': 1}
#環境
Jupiter-notebook
macOS Catalina
回答1件
あなたの回答
tips
プレビュー