前提・実現したいこと
pyファイルをコマンドプロンプトで実行中下記のエラーが出て進めなくなりました。
発生している箇所・エラーメッセージ
File "main.py", line 12, in <module> proto = Unmo('proto') File "C:\Users\聡一朗\repos\unmo\unmo.py", line 24, in __init__ self._dictionary = Dictionary() File "C:\Users\聡一朗\repos\unmo\dictionary.py", line 39, in __init__ count, template = line.strip().split('t') ValueError: not enough values to unpack (expected 2, got 1)
該当のソースコード
dicitionary.py
import os.path from collections import defaultdict import morph class Dictionary: """思考エンジンの辞書クラス。 スタティックメソッド: touch_dics() -- 辞書ファイルにtouch処理を行う make_pattern(str) -- パターン辞書読み込み用のヘルパー pattern_to_line(pattern) -- パターンハッシュをパターン辞書形式に変換する プロパティ: random -- ランダム辞書 pattern -- パターン辞書 template -- テンプレート辞書 """ DICT = {'random': 'dics_random.txt', 'pattern': 'dics_pattern.txt', 'template': 'dics_template.txt', } def __init__(self): """ファイルから辞書の読み込みを行う。""" Dictionary.touch_dics() with open(Dictionary.DICT['random'], encoding='utf-8') as f: self._random = [l for l in f.read().splitlines() if l] with open(Dictionary.DICT['pattern'], encoding='utf-8') as f: self._pattern = [Dictionary.make_pattern(l) for l in f.read().splitlines() if l] with open(Dictionary.DICT['template'], encoding='utf-8') as f: self._template = defaultdict(lambda: [], {}) for line in f: count, template = line.strip().split('t') if count and template: count = int(count) self._template[count].append(template) def study(self, text, parts): """ランダム辞書、パターン辞書、テンプレート辞書をメモリに保存する。""" self.study_random(text) self.study_pattern(text, parts) self.study_template(parts) def study_template(self, parts): """形態素のリストpartsを受け取り、 名詞のみ'%noun%'に変更した文字列templateをself._templateに追加する。 名詞が存在しなかった場合、または同じtemplateが存在する場合は何もしない。 """ template = '' countd = 0 for word, part in parts: if morph.is_keyword(part): word = '%noun%' count += 1 template += word if count > 0 and template not in self._template[couont]: self._template[count].append(template) def study_random(self, text): """ユーザーの発言textをランダム辞書に保存する。 すでに同じ発言があった場合は何もしない。""" if not text in self._random: self._random.append(text) def study_pattern(self, text, parts): """ユーザーの発言textを、形態素partsに基づいてパターン辞書に保存する。""" for word, part in parts: if self.is_keyword(part):# 品詞が名詞であれば学習 # 単語の重複チェック # 同じ単語で登録されていれば、パターンを追加する # 無ければ新しいパターンを作成する duplicated = next((p for p in self._pattern if p['pattern'] == word), None) if duplicated: if not text in duplicated['phrases']: duplicated['phrases'].append(text) else: self._pattern.append({'pattern': word, 'phrases': [text]}) def save(self): """メモリ上の辞書をファイルに保存する。""" with open(Dictionary.DICT['random'], mode='w', encoding='utf-8') as f: f.write('\n'.join(self.random)) with open(Dictionary.DICT['pattern'], mode='w', encoding='itf-8') as f: f.write('\n'.join(self.random)) with open(Dictionary.DICT['template'], mode='w', encoding='utf-8') as f: for count, templates in self._template.items(): for template in templates: f.write('{}\t{}\n'.format(count, template)) @staticmethod def make_pattern(line): """文字列lineを半角スペースで分割し、{'pattern': [0], 'phrases': [1]}の形式で返す。""" pattern, phrases = line.split(" ") if pattern and phrases: return {'pattern': pattern, 'phrases': phrases.split('|')} @staticmethod def pattern_to_line(pattern): """パターンのハッシュを文字列に変換する。""" return '{} {}'.format(pattern['pattern'],'|'.join(pattern['phrases'])) @staticmethod def touch_dics(): """辞書ファイルがなければ空のファイルを作成し、あれば何もしない。""" for dic in Dictionary.DICT.values(): if not os.path.exists(dic): open(dic, 'w').close() @property def random(self): """ランダム辞書""" return self._random @property def pattern(self): """パターン辞書""" return self._pattern @property def template(self): """テンプレート辞書""" return self._template
dics_template.txt
あたしは%noun%の%noun%です %noun%って%noun%だよね この間%noun%に行ったら%noun%の%noun%に会ったよ
試したこと
以前同じエラーが出てその時は「split('t')→split(' ')」にすることで解決したのですが、今回はキーと値で二分割というわけではないので、一行の中身を二つに分断できません。ここ以外にエラーがあるのかもしれませんが如何せん(http://sandmark.hateblo.jp/entry/2017/10/11/004126)というサイトを参考に作っているpython初学者なので前に進みません。このエラーの意味が分かる方がいらっしゃいましたら教えて下さると幸いです。
回答1件
あなたの回答
tips
プレビュー