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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

1619閲覧

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

u-12

総合スコア0

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/11/09 14:06

編集2020/11/09 15:03

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
(例)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

1コード

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/ツールのバージョンなど)

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

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

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

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

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

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

y_waiwai

2020/11/09 14:18

このままではコードが読めないので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
u-12

2020/11/09 14:42

編集させていただきました。 狩野であればよろしくお願いします。
y_waiwai

2020/11/09 14:46

まだきちんと修正されてません。 これではコードが読めません。 編集画面には、どういうふうに見えるかのプレビュー画面もあるので、それを見てきちんとコードが読めるようになるのを確認しましょう
u-12

2020/11/09 14:47

了解しました。
u-12

2020/11/09 14:50

できました。
KojiDoi

2020/11/09 14:55

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

2020/11/09 15:04

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

回答2

0

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

" の数が合ってません。

投稿2020/11/09 14:17

y_waiwai

総合スコア88042

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

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

0

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

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

投稿2020/11/09 14:11

KojiDoi

総合スコア13692

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

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

u-12

2020/11/09 14:22

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

2020/11/09 14:27

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

2020/11/09 14:45

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問