Ошибка типа: строковые индексы должны быть целыми числами (предварительная обработка текстовых данных в файлах CSV для анализа настроений) - PullRequest
0 голосов
/ 15 мая 2019

Я новичок в программировании и НЛП в целом. Я нашел код на этом сайте: (https://towardsdatascience.com/creating-the-twitter-sentiment-analysis-program-in-python-with-naive-bayes-classification-672e5589a7ed) для использования в анализе настроений в твиттере. У меня есть нужные мне csv-файлы, и поэтому вместо их создания я просто определил переменные по файлам.

Когда я пытаюсь запустить код, при запуске этой строки выдается ошибка типа:

preprocessedTrainingSet = tweetProcessor.processTweets (trainingData)

И прослеживает до линии:

processedTweets.append ((self._processTweet (твит [ "текст"]), чирикать [ "метка"])).

Я не знаю, как обойти эту проблему и при этом сохранить основные функциональные возможности кода без изменений.

import pandas as pd
import re
from nltk.tokenize import word_tokenize
from string import punctuation 
from nltk.corpus import stopwords 
import twitter
import csv
import time
import nltk
nltk.download('stopwords')

testDataSet = pd.read_csv("Twitter data.csv")
print(testDataSet[0:4])
trainingData = pd.read_csv("full-corpus.csv")
print(trainingData[0:4])


class PreProcessTweets:
    def __init__(self):
        self._stopwords = set(stopwords.words('english') + list(punctuation) + ['AT_USER','URL'])

    def processTweets(self, list_of_tweets):
        processedTweets=[]
        for tweet in list_of_tweets:
            processedTweets.append((self._processTweet(tweet["text"]),tweet["label"]))
        return processedTweets

    def _processTweet(self, tweet):
        tweet = tweet.lower() # convert text to lower-case
        tweet = re.sub('((www\.[^\s]+)|(https?://[^\s]+))', 'URL', tweet) # remove URLs
        tweet = re.sub('@[^\s]+', 'AT_USER', tweet) # remove usernames
        tweet = re.sub(r'#([^\s]+)', r'\1', tweet) # remove the # in #hashtag
        tweet = word_tokenize(tweet) # remove repeated characters (helloooooooo into hello)
        return [word for word in tweet if word not in self._stopwords]

tweetProcessor = PreProcessTweets()
preprocessedTrainingSet = tweetProcessor.processTweets(trainingData)
preprocessedTestSet = tweetProcessor.processTweets(testDataSet)

Я ожидаю, что он начнет очищать найденные данные, прежде чем я смогу начать использовать Наивный Байес

1 Ответ

0 голосов
/ 16 мая 2019

Трудно сказать без ваших реальных данных, но я думаю, что вы путаете несколько типов друг с другом.

  1. При загрузке csv-данных вы создаете кадр данных для pandas.
  2. Затем в методе processTweets вы пытаетесь перебрать этот фрейм данных как список.
  3. Наконец, в цикле for процесса processTweets, где вы получаете доступ к значениям списка, который вы называете «твит», вы пытаетесь получить доступ к значениям «твит» с помощью клавиш «текст» и «метка». ». Однако я сомневаюсь, что у вас есть словарь там.

Я скачал несколько твитов с этого сайта . Получив эти данные, я проверил ваш код и внес следующие изменения.

import pandas as pd
import re
from nltk.tokenize import word_tokenize
from string import punctuation
from nltk.corpus import stopwords
import nltk

#had to install 'punkt'
nltk.download('punkt')
nltk.download('stopwords')
testDataSet = pd.read_csv("data.csv")

# For testing if the code works I only used a TestDatasSet, and no trainingData.


class PreProcessTweets:
    def __init__(self):
        self._stopwords = set(stopwords.words('english') + list(punctuation) + ['AT_USER','URL'])

    # To make it clear I changed the parameter to df_of_tweets (df = dataframe)
    def processTweets(self, df_of_tweets):

        processedTweets=[]

        #turning the dataframe into lists
        # in my data I did not have a label, so I used sentiment instead.
        list_of_tweets = df_of_tweets.text.tolist()
        list_of_sentiment = df_of_tweets.sentiment.tolist()

        # using enumerate to keep track of the index of the tweets so I can use it to index the list of sentiment
        for index, tweet in enumerate(list_of_tweets):
            # adjusted the code here so that it takes values of the lists straight away.
            processedTweets.append((self._processTweet(tweet), list_of_sentiment[index]))
        return processedTweets

    def _processTweet(self, tweet):
        tweet = tweet.lower() # convert text to lower-case
        tweet = re.sub('((www\.[^\s]+)|(https?://[^\s]+))', 'URL', tweet) # remove URLs
        tweet = re.sub('@[^\s]+', 'AT_USER', tweet) # remove usernames
        tweet = re.sub(r'#([^\s]+)', r'\1', tweet) # remove the # in #hashtag
        tweet = word_tokenize(tweet) # remove repeated characters (helloooooooo into hello)
        return [word for word in tweet if word not in self._stopwords]


tweetProcessor = PreProcessTweets()
preprocessedTestSet = tweetProcessor.processTweets(testDataSet)
tweetProcessor = PreProcessTweets()
print(preprocessedTestSet)

Надеюсь, это поможет!

...