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

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

ただいまの
回答率

88.23%

VALUEERRORが直せない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 400

紹介されている通りにやっているのにエラーが出てしまいます。
どうすればよいでしょうか。

import random
import re
from analyzer import *


class Dictionary:
    def __init__(self):
        self.random = []
        rfile = open('random.txt', 'r', encoding = 'utf_8')
        r_lines = rfile.readlines()
        rfile.close()

        self.random = []
        for line in r_lines:
            str = line.rstrip('\n')
            if (str!=''):
                self.random.append(str)

        pfile = open('pattern.txt', 'r', encoding = 'utf_8')
        p_lines = pfile.readlines()
        pfile.close()
        self.new_lines = []
        for line in p_lines:
            str = line.rstrip('\n')
            if (str!=''):
                self.new_lines.append(str)

        self.pattern = []

        for line in self.new_lines:
            ptn, prs = line.split('\t')
            self.pattern.append(ParseItem(ptn, prs))

    def study(self, input, parts):
        input = input.rstrip('\n')
        self.study_random(input)
        self.study_pattern(input, parts)


    def study_random(self, input):
        if not input in self.random:
            self.random.append(input)

    def study_pattern(self, input, parts):
        for word, part in parts:
            if (keyword_check(part)):
                depend = False
                for ptn_item in self.pattern:
                    m = re.search(ptn_item.pattern, word)
                    if(re.search(ptn_item.pattern, word)):
                        depend = ptn_item
                        break
                if depend:
                    depend.add_phrase(input)
                else:
                    self.pattern.append(ParseItem(word, input))      

    def save(self):
        for index, element in enumerate(self.random):
            self.random[index] = element +'\n'
        with open('random.txt', 'w', encoding = 'utf_8') as f:
            f.writelines(self.random)

        pattern = []
        for ptn_item in self.pattern:
            pattern.append(ptn_item.make_line() + '\n')
        with open('pattern.txt', 'w', encoding = 'utf_8') as f:
            f.writelines(pattern)

class ParseItem:
    SEPARATOR = '^((-?\d+)##)?(.*)$'

    def __init__(self, pattern, phrases):
        m = re.findall(ParseItem.SEPARATOR, pattern)
        self.modify = 0
        if m[0][1]:
            self.modify =int(m[0][1])
            self.pattern = m[0][2]

            self.phrases = []
            self.dic = {}
            for phrase in phrases.split('|'):
                m = re.findall(ParseItem.SEPARATOR, phrase)
                self.dic['need'] = 0
                if m[0][1]:
                    self.dic['need'] = int(m[0][2])
                self.dic['phrase'] = m[0][2]
                self.phrases.append(self.dic.copy())


    def match(self, str):
        return re.search(self.pattern, str)

    def choice(self, mood):
        choices = []
        for p in self.phrases:
            if (self.suitable(p['need'], mood)):
                choices.append(p['phrase'])
        if (len(choices) == 0):
                return None
        return random.choice(choices)

    def suitable(self, need, mood):
        if (need == 0):
            return True
        elif (need > 0):
            return (mood > need)
        else:
            return (mood < need)

    def add_phrase(self, phrase):
        for p in self.phrases:
            if p['phrase'] == phrase:
                return
        self.phrases.append({'need': 0, 'phrase': phrase})

    def make_line(self):
        pattern = str(self.modify) + '##' + self.pattern
        phrases= []
        for p in self.phrases:
            phrases.append(str(p['need']) + '##' + str(p['phrase']))
        return pattern + '\t' + '|'.join(phrases)

Python

  File "C:\Users\ssato\AppData\Local\Programs\Python\Python37-32\PtnaForm.py", line 11, in <module>
    ptna = Ptna('ptna')
  File "C:\Users\ssato\AppData\Local\Programs\Python\Python37-32\ptna.py", line 8, in __init__
    self.dictionary = Dictionary()
  File "C:\Users\ssato\AppData\Local\Programs\Python\Python37-32\dictionary_one.py", line 31, in __init__
    ptn, prs = line.split('\t')
ValueError: not enough values to unpack (expected 2, got 1)
>>> 


pattern.txt
こんち(は|わ)$    こんにちは|やほー|ちわす|ども|またあんた?
おはよう|おはよー|オハヨウ    おはよ!|まだ眠い…|さっき寝たばかりだよ
こんばん(は|わ)    こんばんは|おばんですね|今何時?
^(お|うい)す$    うぃっす
^やあ[、。!]*$    やっほー
バイバイ|ばいばい    ばいばい|バイバーイ|ごきげんよう
^じゃあ?ね?$|またね    またねー|じゃあまたね|また遊んでね
^どれ[??]$    アレはアレ|今手に持ってるものだよ|それだよー
^[し知]ら[なね]    やばいー|知らなきゃまずいじゃん|知らないの?
-2##おまえ|あんた|お前|てめー[TAB]-5##%match%じゃないよ!
-5##ばか|バカ|馬鹿    そんなこと言わないでよ|%match%じゃないもん!|%match%っていうやつが%match%なんだよ|ぷんすか!

出典は秀和システム出版の「Pythonパーフェクトマスター」です。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • hayataka2049

    2020/01/16 23:21 編集

    質問を編集して以下の2点の情報を追加してください。
    ・pattern.txtはどのようなファイルでしょうか?
    ・また、コードが紹介されている出典を示してください。

    キャンセル

  • emSvlBS37EqrfoC

    2020/01/16 23:35

    編集しました。
    よろしければアドバイスお願い致します。

    キャンセル

回答 1

checkベストアンサー

+1

こんち(は|わ)$    こんにちは|やほー|ちわす|ども|またあんた?

これらの行の間の区切りの空白、つまりたとえばこの行ではこんち(は|わ)$こんにちはの間のスペースは、line.split('\t')のようにしているので「TAB文字」である必要があります。そうなっているかどうか確認してください。
(最初から半角スペースのつもりで入力してしまっているかもしれないし、エディタの設定などによってはTABキーを叩いてもスペースが挿入されるケースもあります)

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/01/17 00:11

    先ほどのエラーはなくなりました!ありがとうございます!
    しかし、このようなエラーが修正できません...
    File "C:\Users\ssato\AppData\Local\Programs\Python\Python37-32\dictionary_one.py", line 86, in __init__
    self.dic['need'] = int(m[0][2])
    ValueError: invalid literal for int() with base 10: '%match%じゃないよ

    キャンセル

  • 2020/01/17 00:21

    本の内容を把握していないので、それに関してはたぶん私には無理です。コードを手で書き写しているならまずミスがないか探して、あとは出版社の出している正誤表を確認してください。
    https://www.shuwasystem.co.jp/support/7980html/4816.html

    キャンセル

  • 2020/01/17 00:25

    最初から最後まですみません!!
    ありがとうございました!!

    キャンセル

  • 2020/01/17 00:29

    前後のコードの文脈とか、同じ本でやっている方の投稿(https://teratail.com/questions/212839)を見たりすると、int(m[0][1])なのかなぁという気がします。気がするだけです。

    キャンセル

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

  • ただいまの回答率 88.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る