RyuseiSato
@RyuseiSato (SAI)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

AttributeError: 'Connection' object has no attribute 'execute'

解決したいこと

以下の記事を参考にtwitterを利用したテキストマイニングをPythonを用いて作成しました。

ただ実行したところ以下のエラーが起きてしまいました。
解決方法を教えていただきたいです。

発生している問題・エラー

[ec2-user@ip-172-31-22-104 ~]$ python textmining.py
2022-01-20
Traceback (most recent call last):
  File "textmining.py", line 71, in <module>
    txts = fetch_target_day_n_random_tweets(target_day, docs_count)
  File "textmining.py", line 25, in fetch_target_day_n_random_tweets
    cursor.execute(SQL)
AttributeError: 'Connection' object has no attribute 'execute'

該当するソースコード

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import MySQLdb
import MeCab
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer

### MySQL 上の Tweet データ取得用関数
def fetch_target_day_n_random_tweets(target_day, n = 2000):
    with MySQLdb.connect(
            host="〇〇〇〇",
            user="〇〇〇〇",
            passwd="〇〇〇〇",
            db="textdata",
            charset="utf8") as cursor:
        SQL = """
        SELECT
          text
        FROM
          tweet
        WHERE
          DATE(created_at + INTERVAL 9 HOUR) = '%s'
        LIMIT %s;
        """ %(target_day, unicode(n))
        cursor.execute(SQL)
        result = cursor.fetchall()
        l = [x[0] for x in result]
        return l

自分で試したこと

withの位置が悪いのかと思い、以下のようにしましたが以下の試したコードのエラーのようになりました。

def fetch_target_day_n_random_tweets(target_day, n = 2000):
    conn = MySQLdb.connect(
            host="〇〇〇〇",
            user="〇〇〇〇",
            passwd="〇〇〇〇",
            db="textdata",
            charset="utf8") as cursor:
    with conn.cursor() as cursor:
        SQL = """
        SELECT
          text
        FROM
          tweet
        WHERE
          DATE(raw_created_at + INTERVAL 9 HOUR) = '%s'
        LIMIT %s;
        """ %(target_day, str(n))
        cursor.execute(SQL)
        result = cursor.fetchall()
        l = [x[0] for x in result]
        return l

試したコードのエラー

  File "textmining.py", line 80, in <module>
    tfidf_matrix = tfidf_vectorizer.fit_transform(target_day_nouns)
  File "/home/ec2-user/.local/lib/python3.8/site-packages/sklearn/feature_extraction/text.py", line 2077, in fit_transform
    X = super().fit_transform(raw_documents)
  File "/home/ec2-user/.local/lib/python3.8/site-packages/sklearn/feature_extraction/text.py", line 1330, in fit_transform
    vocabulary, X = self._count_vocab(raw_documents, self.fixed_vocabulary_)
  File "/home/ec2-user/.local/lib/python3.8/site-packages/sklearn/feature_extraction/text.py", line 1220, in _count_vocab
    raise ValueError(
ValueError: empty vocabulary; perhaps the documents only contain stop words
0

1Answer

最初のコードでは connect から cursor() で cursor を取り出す必要がありそうです。
記事掲載サイトに問い合わせてみるのがよさそうですね。

    with MySQLdb.connect(
            host="〇〇〇〇",
            user="〇〇〇〇",
            passwd="〇〇〇〇",
            db="textdata",
            charset="utf8") as conn:
        cursor = conn.cursor()

2つめのコードは

  File "textmining.py", line 80, in <module>
    tfidf_matrix = tfidf_vectorizer.fit_transform(target_day_nouns)

がエラーの起点なので、ここで渡した引数の target_day_nouns の内容に ValueError となる原因があると思われます。

1Like

Comments

  1. @RyuseiSato

    Questioner

    回答ありがとうございます。

    with MySQLdb.connect(
    host="〇〇〇〇",
    user="〇〇〇〇",
    passwd="〇〇〇〇",
    db="textdata",
    charset="utf8") as conn:
    cursor = conn.cursor()

    以上のご指摘していただいた通りコードで実行可能でした。
    ありがとうございます。

Your answer might help someone💌