1

リンク: https://stackoverflow.com/questions/18154278/is-there-a-maximum-size-for-the-nltk-naive-bayes-classifer

コードに scikit-learn 機械学習アルゴリズムを実装する際に問題が発生しています。scikit-learn の作成者の 1 人が、上でリンクした質問で親切に助けてくれましたが、うまく機能させることができず、最初の質問は別の問題に関するものだったので、新しい質問を開くのが最善だと思いました。 .

このコードは、ツイートの入力を取得し、そのテキストと感情を辞書に読み込みます。次に、テキストの各行を解析し、テキストを 1 つのリストに追加し、その感情を別のリストに追加します (上記のリンクされた質問の作成者のアドバイスに従って)。

ただし、リンク内のコードを使用し、API をできる限り調べたにもかかわらず、何かが足りないと思います。以下のコードを実行すると、最初に次のようにコロンで区切られた一連の出力が得られます。

  (0, 299)  0.270522159585
  (0, 271)  0.32340892262
  (0, 266)  0.361182814311
  : :
  (48, 123) 0.240644787937

に続く:

['negative', 'positive', 'negative', 'negative', 'positive', 'negative', 'negative', 'negative', etc]

その後:

ValueError: empty vocabulary; perhaps the documents only contain stop words

分類子を間違った方法で割り当てていますか? これは私のコードです:

test_file = 'RawTweetDataset/SmallSample.csv'
#test_file = 'RawTweetDataset/Dataset.csv'
sample_tweets = 'SampleTweets/FlumeData2.txt'
csv_file = csv.DictReader(open(test_file, 'rb'), delimiter=',', quotechar='"')

tweetsDict = {}

for line in csv_file:
    tweetsDict.update({(line['SentimentText'],line['Sentiment'])})

tweets = []
labels = []
shortenedText = ""
for (text, sentiment) in tweetsDict.items():
    text = HTMLParser.HTMLParser().unescape(text.decode("cp1252", "ignore"))
    exclude = set(string.punctuation)
    for punct in string.punctuation:
        text = text.replace(punct,"")
    cleanedText = [e.lower() for e in text.split() if not e.startswith(('http', '@'))]
    shortenedText = [e.strip() for e in cleanedText if e not in exclude]

    text = ' '.join(ch for ch in shortenedText if ch not in exclude)
    tweets.append(text.encode("utf-8", "ignore"))
    labels.append(sentiment)

vectorizer = TfidfVectorizer(input='content')
X = vectorizer.fit_transform(tweets)
y = labels
classifier = MultinomialNB().fit(X, y)

X_test = vectorizer.fit_transform(sample_tweets)
y_pred = classifier.predict(X_test)

更新: 現在のコード:

all_files = glob.glob (tweet location)
for filename in all_files:
    with open(filename, 'r') as file:
        for line file.readlines():
            X_test = vectorizer.transform([line])
            y_pred = classifier.predict(X_test)
            print line
            print y_pred

これは常に次のようなものを生成します。

happy bday trish
['negative'] << Never changes, always negative
4

2 に答える 2

6

問題はここにあります:

X_test = vectorizer.fit_transform(sample_tweets)

fit_transformテスト セットではなく、トレーニング セットで呼び出されることを意図しています。テスト セットで、 を呼び出しますtransform

また、sample_tweetsファイル名です。ベクトライザーに渡す前に、それを開いてツイートを読む必要があります。それを行うと、最終的に次のようなことができるはずです

for tweet, sentiment in zip(list_of_sample_tweets, y_pred):
    print("Tweet: %s" % tweet)
    print("Sentiment: %s" % sentiment)
于 2013-08-14T07:17:35.127 に答える
1

(コメントでほのめかされているように)TextBlobでこれを行うには、次のようにします

from text.blob import TextBlob

tweets = ['This is tweet one, and I am happy.', 'This is tweet two and I am sad']

for tweet in tweets:
    blob = TextBlob(tweet)
    print blob.sentiment #Will return (Polarity, Subjectivity)
于 2013-08-14T00:06:30.060 に答える