CaboChaっで係り受け解析.結果をファイルに書き込みたいのですが期待通りにできません、、、

前提

CaboChaで係り受け解析を行っています.係り受け解析自体は実行できているのですが,それを期待する形でファイルに格納する点で苦戦しています.

実現したいこと

ここに実現したいことを箇条書きで書いてください。

【例】kakariuke1.txt

駐車場 0分 場所 ロス 町並み ところ たくさん 実感 観光地 朝 一 一番 歴史 船 食事 時間 一日 ・ ・ ・

【例】kakariuke2.txt

[('駐車場', 'かかる'), ('駐車場', '食べる歩くできる'), ('駐車場', '高い'), ('駐車場', 'ある'), ('駐車場', 'ある')] [('0分', 'かかる')] [('場所', 'かかる'), ('場所', '行く'), ('場所', '思う'), ('場所', '行う'), ('場所', '面白い'), ('場所', '触れ合える'), ('場所', 'ある'), ('場所', 'する'), ('場所', '訪れる'), ('場所', '訪れる'), ('場所', '思える'), ('場所', 'ある'), ('場所', '楽しめる'), ('場所', '思う'), ('場所', '思える'), ('場所', '良い'), ('場所', '美味しい'), ('場所', 'ある'), ('場所', '過ごす'), ('場所', '良い'), ('場所', '過ごす')] [('ロス', '落ち着く')] [('町並み', '古い'), ('町並み', '通り抜ける'), ('町並み', '感じる'), ('町並み', '美しい'), ('町並み', '回る切れる'), ('町並み', '走る'), ('町並み', '古い'), ('町並み', 'なる'), ('町並み', 'なる')] [('ところ', 'たどり着く'), ('ところ', '見る'), ('ところ', 'ある'), ('ところ', 'ある'), ('ところ', '回る'), ('ところ', 'ない'), ('ところ', 'ある'), ('ところ', 'ない'), ('ところ', '多い')] [('たくさん', '落ち着く'), ('たくさん', 'ある'), ('たくさん', 'ある'), ('たくさん', 'ある'), ('たくさん', 'ある'), ('たくさん', 'ある'), ('たくさん', 'ある'), ('たくさん', 'ある楽しめる'), ('たくさん', '売る'), ('たくさん', 'ある'), ('たくさん', '多い'), ('たくさん', 'ある'), ('たくさん', '残る'), ('たくさん', 'ある'), ('たくさん', 'ある')] [('実感', '落ち着く'), ('実感', '思う')] [('観光地', '行く'), ('観光地', 'ある'), ('観光地', '遊べる'), ('観光地', '楽しい'), ('観光地', 'なる'), ('観光地', '来る'), ('観光地', '感じる'), ('観光地', '来る'), ('観光地', '多い')] [('朝', '行く'), ('朝', '楽しめる'), ('朝', '貰える')] [('一', '行く')] [('一番', '行く')] [('歴史', '感じる'), ('歴史', 'あふれる'), ('歴史', '感じる')] [('船', '乗る'), ('船', '流れる')] [('食事', '過ぎる'), ('食事', 'する'), ('食事', 'あるつける')] [('時間', '過ぎる'), ('時間', 'かかる'), ('時間', '過ごす'), ('時間', 'ある'), ('時間', '足る'), ('時間', 'かける'), ('時間', '含める'), ('時間', '長い'), ('時間', 'する'), ('時間', '流れる')] [('一日', '回る切れる')] ・ ・ ・

【例】kakariuke3.txt

かかる,食べる歩くできる,高い,ある,ある,ある かかる かかる,行く,思う,行う,面白い,触れ合える,ある・・・ ・ ・ ・ 

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

IndexError: list index out of range

該当のソースコード

python

import CaboCha import codecs from collections import OrderedDict import neologdn import re import pickle def get_word1(tree, chunk): """ chunkからtree内のトークンを得て、そのトークンが持つ名詞の表層形を取得する """ surface = '' beg = chunk.token_pos # このチャンクのツリー内のトークンの位置 end = chunk.token_pos + chunk.token_size # トークン列のサイズ for i in range(beg, end): token = tree.token(i) features = token.feature.split(',') if features[0] == '名詞': surface += token.surface # 表層形の取得 #print("名詞 " + surface) else: break return surface def get_word2(tree, chunk): """ chunkからtree内のトークンを得て、そのトークンが持つ動詞と形容詞の表層形を取得する """ surface = '' beg = chunk.token_pos # このチャンクのツリー内のトークンの位置 end = chunk.token_pos + chunk.token_size # トークン列のサイズ for i in range(beg, end): token = tree.token(i) features = token.feature.split(',') if features[0] == '動詞': surface += features[6] #print(surface) elif features[0] == '形容詞': surface += features[6] #print("形容詞 " + surface) else: break return surface def get_2_words_take(file): cp = CaboCha.Parser('-f1') chunk_dic = {} chunk_id = 0 tuples_sub = [] tree = cp.parse(file) for i in range(0, tree.size()): token = tree.token(i) # トークンを得る if token.chunk: # トークンがチャンクを持っていたら chunk_dic[chunk_id] = token.chunk # チャンクを辞書に追加する chunk_id += 1 for chunk_id, chunk in chunk_dic.items(): if chunk.link > 0: from_surface1 = get_word1(tree, chunk) #from_surface=名詞 to_chunk = chunk_dic[chunk.link] to_surface1 = get_word2(tree, to_chunk) from_surface2 = get_word2(tree, chunk) #from_surface=名詞 to_chunk = chunk_dic[chunk.link] to_surface2 = get_word1(tree, to_chunk) tuples_sub.append((from_surface1, to_surface1)) tuples_sub.append((to_surface2, from_surface2)) return tuples_sub if __name__ == '__main__' : #line = 'GW中の昼過ぎという時間のせいか、駐車場探しに0分もかかりしかも遠い場所だったため、時間をロスした。古い町並みを通り抜け水路のところまでたどり着いたが、やはり人がたくさんで、落ち着かなかった。やはり、こういうべたな観光地は朝一で行くのが一番だと実感した。すいていれば、もう少し見るところはあったと思うが・・・。,' file = codecs.open("/content/stopwords.txt", 'r', 'utf-8') stopwords = [line.strip() for line in file] file.close() file = codecs.open('/content/dataset_kurashiki_spring_test.txt', 'r', 'utf-8') tuples_sub = [] new_line = [] documents = [line.strip() for line in file] for line in documents: new_line = re.sub(r"[!,^_^().<>?]","",line) line = neologdn.normalize(new_line) tuples = [] tuples = get_2_words_take(new_line) for t in tuples: if not len(t[0])==0 and not len(t[1])==0: tuples_sub.append(t) file.close() count = [] new_count = [] for n in range(len(tuples_sub)): count_sub = [] for t in range(len(tuples_sub)): if tuples_sub[n][0] == tuples_sub[t][0]: count_sub.append(tuples_sub[t]) count.append(count_sub) for element in count: if element not in new_count: new_count.append(element) file = codecs.open('kakariuke1.txt','w','utf-8') for i in range(len(new_count)): file.write(new_count[i][0][0] + "\n") file.close() file = codecs.open('kakariuke2.txt','w','utf-8') for i in range(len(new_count)): file.write(str(new_count[i]) + "\n") file.close() file = codecs.open('kakariuke3.txt','w','utf-8') for i in range(len(new_count)): file.write(new_count[i][0][1] + "\n") file.close()

試したこと

file = codecs.open('kakariuke3.txt','w','utf-8') for i in range(len(new_count)): file.write(new_count[i][0][1] + "\n") file.close()

上記のkakariuke3.txtに書き込むコードにおいて,これでは各名詞の最初の形容詞もしくは動詞しか書き込むことができません.原因はnew_count[i][0][1] となっていることはわかっています.

そこで,以下のようなコードに変更しました.

file = codecs.open('kakariuke3.txt','w','utf-8') for i in range(len(new_count)): for n in range(len(new_count)): file.write(new_count[i][n][1] + "\n") file.close()

しかし,これでは,エラーが発生してしまいます.
エラー内容:IndexError: list index out of range

これは,range(len(new_count))の範囲でfor文を行っているためだと思います.

この部分の範囲をどのように設定すれば例で示したような形式でファイルに書き込むことができるのかがわからないので教えていただきたいです.

コメントを投稿

0 コメント