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

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

ただいまの
回答率

87.49%

pythonのslackbotやってるのですが、エラーをはいているのですが、直し方を知りたいです。

受付中

回答 2

投稿 編集

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

score 0

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。

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

エラーメッセージ

Failed to import plugins.react
Traceback (most recent call last):
File "C:\Users\k018c1445\anaconda3\lib\site-packages\slackbot\manager.py", line 60, in _load_plugins
import_module(module)
File "C:\Users\k018c1445\anaconda3\lib\importlib\init.py", line 127, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 1006, in _gcd_import
File "<frozen importlib._bootstrap>", line 983, in _find_and_load
File "<frozen importlib._bootstrap>", line 967, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 677, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 728, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "C:\Users\k018c1445\Documents\proenA\en05\Slackbot_proenA\Slackbot_proenA\plugins\react.py", line 239, in <module>
setupKeywordMatchingRule()
File "C:\Users\k018c1445\Documents\proenA\en05\Slackbot_proenA\Slackbot_proenA\plugins\react.py", line 84, in setupKeywordMatchingRule
kRuleList.append(KeywordMatchingRule(arr[0], arr[1].strip()))
IndexError: list index out of range`````````ここに言語を入力 ここに言語を入力

ここに言語を入力

python コード

from slackbot.bot import respond_to  #@メッセージへの応答
from slackbot.bot import listen_to      #チャンネル内発言への応答
from slackbot.bot import default_reply    # デフォルトの応答
import slackbot_settings

###################################################
#この下にSVM学習済みファイルと単語リスト読み込み部分を貼り付ける             

import pickle

# 保存したモデルをロードする
filename = "svmclassifier.pkl"
loaded_classifier = pickle.load(open(filename, "rb"))

# 単語リストを読み込みリストに保存
basicFormList = []
bffile = "basicFormList.txt"
for line in open(bffile, "r", encoding="utf_8"):
basicFormList.append(line.strip())
print(len(basicFormList))

###################################################
#この下にクラスや関数を貼りつける

from janome.tokenizer import Tokenizer

# 単語のクラス
class Word:
def __init__(self, token):
# 表層形
self.text = token.surface

# 原型
self.basicForm = token.base_form

# 品詞
self.pos = token.part_of_speech

# 単語の情報を「表層系\t原型\t品詞」で返す
def wordInfo(self):
return self.text + "\t" + self.basicForm + "\t" + self.pos

# 引数のtextをJanomeで解析して単語リストを返す関数
def janomeAnalyzer(text):
# 形態素解析
t = Tokenizer()
tokens = t.tokenize(text) 

# 解析結果を1行ずつ取得してリストに追加
wordlist = []
for token in tokens:
word = Word(token)
wordlist.append(word)
return wordlist

import random

# キーワード照合ルールのリスト(keywordMatchingRuleオブジェクトのリスト)
kRuleList = []

# 応答候補のリスト(ResponseCandidateオブジェクトのリスト)
candidateList = []

# キーワード照合ルールのクラス(キーワードと応答の組み合わせ)
class KeywordMatchingRule:
def __init__(self, keyword, response):
self.keyword = keyword
self.response = response

# 応答候補のクラス(応答候補とスコアの組み合わせ)
class ResponseCandidate:
def __init__(self, response, score):
self.response = response
self.score = score
def print(self):
print("候補文 [%s, %.5f]" % (self.response, self.score))

# キーワード照合ルールを初期化する関数
def setupKeywordMatchingRule():
kRuleList.clear()
for line in open('kw_matching_rule.txt', 'r', encoding="utf_8"):
arr = line.split(",")    
# keywordMatchingRuleオブジェクトを作成してkRuleListに追加
kRuleList.append(KeywordMatchingRule(arr[0], arr[1].strip()))

# キーワード照合ルールを利用した応答候補を生成する関数
def generateResponseByRule(inputText):
for rule in kRuleList:
# ルールのキーワードが入力テキストに含まれていたら
if(rule.keyword in inputText):
# キーワードに対応する応答文とスコアでResponseCandidateオブジェクトを作成してcandidateListに追加
cdd = ResponseCandidate(rule.response, 1.0 + random.random())
candidateList.append(cdd)

# ユーザ入力文に含まれる名詞を利用した応答候補を生成する関数
def generateResponseByInputTopic(inputWordList):
# 名詞につなげる語句のリスト
textList = ["は好きですか?", "て何ですか?", "何県です。"]

for w in inputWordList:
pos2 = w.pos.split(",")
# 品詞が名詞だったら
if pos2[0]=='名詞':
cdd = ResponseCandidate(w.basicForm + random.choice(textList), 
0.7 + random.random())
candidateList.append(cdd)

# 無難な応答を返す関数
def generateOtherResponse():
# 無難な応答のリスト
bunanList = ["なるほど", "それで?","頑張ろう"]

# ランダムにどれかをcandidateListに追加
cdd = ResponseCandidate(random.choice(bunanList), 0.5 + random.random())
candidateList.append(cdd)

from collections import Counter

# 単語情報リストを渡すとカウンターを返す関数
def makeCounter(wordList):
basicFormList = []
for word in wordList:
basicFormList.append(word.basicForm)
# 単語の原型のカウンターを作成
counter = Counter(basicFormList)
return counter

# Counterのリストと単語リストからベクトルのリストを作成する関数
def makeVectorList(counterList, basicFormList):
vectorList = []
for counter in counterList:
vector = []
for word in basicFormList:
vector.append(counter[word])
vectorList.append(vector)
return vectorList  

from sklearn import svm

# ネガポジ判定の結果を返す関数
# 引数 text:入力文, classifier:学習済みモデル, basicFormList:ベクトル化に使用する単語リスト
def negaposiAnalyzer(text, classifier, basicFormList):
# 形態素解析して頻度のCounterを作成
counterList = []
wordlist = janomeAnalyzer(text)
counter = makeCounter(wordlist)

# 1文のcounterだが,counterListに追加
counterList.append(counter)

# Counterリストと単語リストからベクトルのリストを作成
vectorList = makeVectorList(counterList, basicFormList)

# ベクトルのリストに対してネガポジ判定
predict_label = classifier.predict(vectorList)

# 入力文のベクトル化に使用された単語を出力
for vector in vectorList:
wl=[]
for i, num in enumerate(vector):
if(num==1):
wl.append(basicFormList[i])
print(wl)

# 予測結果を出力
print(predict_label)

# 予測結果によって出力を決定
if predict_label[0]=="1":
output = "よかったね"
else:
output = "ざんねん"

return output

def generateNegaposiResponse(inputText):
# ネガポジ判定を実行
output = negaposiAnalyzer(inputText, loaded_classifier, 
basicFormList)

# 応答候補に追加
cdd = ResponseCandidate(output, 0.7 + random.random())
candidateList.append(cdd)  

# 応答文を生成する関数
def generateResponse(inputText):

# 応答文候補を空にしておく
candidateList.clear()

# 形態素解析した後,3つの戦略を順番に実行
wordlist = janomeAnalyzer(inputText)
generateResponseByRule(inputText)
generateResponseByInputTopic(wordlist)
generateOtherResponse()

# ネガポジ判定の結果を応答候補に追加
generateNegaposiResponse(inputText)

ret="デフォルト"
maxScore=-1.0

# scoreが最も高い応答文候補を出力する
for cdd in candidateList:
cdd.print()
if cdd.score > maxScore:
ret=cdd.response
maxScore = cdd.score
return ret

# 応答文を生成する関数
def generateResponse(inputText):

# 応答文候補を空にしておく
candidateList.clear()

# 形態素解析した後,3つの戦略を順番に実行
wordlist = janomeAnalyzer(inputText)
generateResponseByRule(inputText)
generateResponseByInputTopic(wordlist)
generateOtherResponse()

# ネガポジ判定の結果を応答候補に追加
generateNegaposiResponse(inputText)

ret="デフォルト"
maxScore=-1.0

# scoreが最も高い応答文候補を戻す
for cdd in candidateList:
cdd.print()
if cdd.score > maxScore:
ret=cdd.response
maxScore = cdd.score
return ret
###################################################

# キーワード照合ルールを読み込む
setupKeywordMatchingRule()

# 特定の文字列に対して返答
@respond_to('こんにちは')
def respond(message):
message.reply('こんにちは!')

# デフォルトの返答
@default_reply()
def default(message):
# Slackの入力を取得
text = message.body['text']

# システムの出力を生成
output = generateResponse(text)

# Slackで返答
message.reply(output)

# スタンプの追加
@respond_to('かっこいい')
def react(message):
message.reply('ありがとう!')
message.react('hearts')
message.react('+1')

# 決まった応答の追加1
@respond_to('時間を教えて')
def react(message):
import datetime
dt_now = datetime.datetime.now()
dt_now_str = dt_now.strftime('%Y/%m/%d/ %H:%M')
message.reply(dt_now_str)

@respond_to('都道府県を教えて')
def react(message):
import datetime
dt_now = datetime.datetime.now()
dt_now_str = dt_now.strftime('%Y/%m/%d/ %H:%M')
message.reply(dt_now_str)

コード

該当のソースコード

pythonここに言語名を入力 ソースコード

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • u-12

    2020/11/09 23:50

    できました。

    キャンセル

  • KojiDoi

    2020/11/09 23:55

    インデントが明らかにおかしいでしょ。ちゃんと正確なのを示してください。手抜きしすぎです。

    キャンセル

  • u-12

    2020/11/10 00:04

    質問の場所に貼るとインデントがくっついてしまうのですがどうすればよいのですか?

    キャンセル

回答 2

0

textList = ["は好きですか?", "て何ですか?" , "何県です。", "]

[]の中が文法的におかしいです。というエラーメッセージが出ていることを読み取れるようにしましょう。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/11/09 23:22

    後ろを消し忘れていたのを思いでしたのですが、 textList = ["は好きですか?", "て何ですか?" , "何県です。"]のてでエラーをはいてしまいます。

    キャンセル

  • 2020/11/09 23:27

    すいませんが、意味の通る日本語を書いてくれませんか?

    キャンセル

  • 2020/11/09 23:45

    すいません。
    新しいエラーをはいてしまったので、可能であれば質問を変えたのでよろしくお願いします。

    キャンセル

0

textList = ["は好きですか?", "て何ですか?" , "何県です。", "]

" の数が合ってません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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