質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

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

Q&A

解決済

1回答

265閲覧

pythonで変数に入れる期待値と獲得値の数を一致させたい!

oka12

総合スコア8

Python 3.x

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

0グッド

0クリップ

投稿2018/08/23 13:56

前提・実現したいこと

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初学者なので前に進みません。このエラーの意味が分かる方がいらっしゃいましたら教えて下さると幸いです。

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

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

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

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

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

LouiS0616

2018/08/23 13:59

どんなルールに基づいてdics_template.txt内の各行を分割したいのですか?
oka12

2018/08/23 14:31

ルールはキー(count)と値(template)の間を正規表現で埋めることでした。僕の見落としでお手数おかけしました。
guest

回答1

0

自己解決

dics_template.txtの中身ですが、参考HPをよく見たら正しくは以下の通りでした。

2 あたしは%noun%の%noun%です 2 %noun%って%noun%だよね 3 この間%noun%に行ったら%noun%の%noun%に会ったよ

キー(count)が左の数字で、値(template)が右の文字列です。なので、キーの数字を付け加えたのとsplit
(' ')にするだけで解決しました。

投稿2018/08/23 14:30

oka12

総合スコア8

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問