Python, Pandas и NLTK Ошибка типа Объект 'int' не вызывается при вызове серии - PullRequest
2 голосов
/ 06 февраля 2020

Я пытаюсь получить частоты слов для терминов в пределах каждого твита, содержащегося в кадре данных. Это мой код:

import pandas as pd
import numpy as np
import nltk
import string
import collections
from collections import Counter
nltk.download('stopwords')
sw= set(nltk.corpus.stopwords.words ('english'))
punctuation = set (string.punctuation)
data= pd.read_csv('~/Desktop/tweets.csv.zip', compression='zip')

print (data.columns)
print(data.text)
data['text'] = [str.lower () for str in data.text if str.lower () not in sw and str.lower () not in punctuation] 
print(data.text)
data["text"] = data["text"].str.split()
data['text'] = data['text'].apply(lambda x: [item for item in x if item not in sw])
print(data.text)
data['text'] = data.text.astype(str)
print(type(data.text))
tweets=data.text

data['words']= tweets.apply(nltk.FreqDist(tweets))
print(data.words)

А это моя ошибка и трассировка:

Имя: текст, длина: 14640, dtype: object Traceback (последний вызов был последним):

Файл "", строка 1, в файле запуска ('C: / Users / leska / .spyder-py3 / untitled1.py', wdir = 'C: / Users / leska / .spyder -py3 ')

Файл "C: \ Users \ leska \ Anaconda3 \ lib \ site-packages \ spyder_kernels \ customize \ spydercustomize.py", строка 827, в исполняемом файле исполняемого файла (имя файла, пространство имен)

Файл "C: \ Users \ leska \ Anaconda3 \ lib \ site-packages \ spyder_kernels \ customize \ spydercustomize.py", строка 110, в execfile exe c (компилировать (f.read () , имя файла, 'exe c'), пространство имен)

Файл "C: / Users / leska / .spyder-py3 / untitled1.py", строка 30, в данных ['words'] = tweets.apply (nltk.FreqDist (tweets))

Файл "C: \ Users \ leska \ Anaconda3 \ lib \ site-packages \ pandas \ core \ series.py", строка 4018, в применить возврат self.aggregate (весело c, * args, ** kwds)

Файл "C: \ Users \ leska \ Anaconda3 \ lib \ site-pa ckages \ pandas \ core \ series.py ", строка 3883, совокупный результат, how = self._aggregate (fun c, * args, ** kwargs)

File" C: \ Users \ leska \ Anaconda3 \ lib \ site-packages \ pandas \ core \ base.py ", строка 506, в _aggregate result = _agg (arg, _agg_1dim)

File" C: \ Users \ leska \ Anaconda3 \ lib \ site-packages \ pandas \ core \ base.py ", строка 456, в результате _agg [fname] = fun c (fname, agg_how)

File" C: \ Users \ leska \ Anaconda3 \ lib \ site-packages \ pandas \ core \ base.py ", строка 440, в _agg_1dim возвращает colg.aggregate (как, _level = (_ level или 0) + 1)

File" C: \ Users \ leska \ Anaconda3 \ lib \ site-packages \ pandas \ core \ series.py ", строка 3902, в совокупном результате = fun c (self, * args, ** kwargs)

TypeError: объект 'int' не может быть вызван

Я проверил, что тип data.text является серией Pandas.

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

import pandas as pd
import numpy as np
import nltk
import string
import collections
from collections import Counter
nltk.download('stopwords')
sw= set(nltk.corpus.stopwords.words ('english'))
punctuation = set (string.punctuation)
data= pd.read_csv('~/Desktop/tweets.csv.zip', compression='zip')

print (data.columns)
print (len(data.tweet_id))
tweets = data.text
test = pd.DataFrame(data)
test.column = ["text"]
# Exclude stopwords with Python's list comprehension and pandas.DataFrame.apply.
test['tweet_without_stopwords'] = test['text'].apply(lambda x: ' '.join([word for word in x.split() if word not in (sw) and word for word in x.split() if word not in punctuation]))
print(test)
chirps = test.text
splitwords = [ nltk.word_tokenize( str(c) ) for c in chirps ]
allWords = []
for wordList in splitwords:
    allWords += wordList
allWords_clean = [w.lower () for w in allWords if w.lower () not in sw and w.lower () not in punctuation]   
tweets2 = pd.Series(allWords)

words = nltk.FreqDist(tweets2)

Мне действительно нужен термин, и он рассчитывает на каждый твит, и я поставлен в тупик как к тому, что я делаю не так.

1 Ответ

1 голос
/ 06 февраля 2020

В первом фрагменте кода способ применения функции к столбцу - это root проблемы.

# this line caused the problem
data['words']= tweets.apply(nltk.FreqDist(tweets))

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

import pandas as pd

df = pd.DataFrame(
    {
        "tweets": [
            "Hello world",
            "I am the abominable snowman",
            "I did not copy this text",
        ]
    }
)

Фрейм данных выглядит следующим образом:

|    | tweets                      |
|---:|:----------------------------|
|  0 | Hello world                 |
|  1 | I am the abominable snowman |
|  2 | I did not copy this text    |

Теперь давайте выясним частоты слов в каждом из трех предложений здесь.

import nltk

# define the fdist function
def find_fdist(sentence):
    tokens = nltk.tokenize.word_tokenize(sentence)
    fdist = FreqDist(tokens)

    return dict(fdist)

# apply the function on `tweets` column
df["words"] = df["tweets"].apply(find_fdist)

Получившийся фрейм данных должен выглядеть так:

|    | tweets                      | words                                                         |
|---:|:----------------------------|:--------------------------------------------------------------|
|  0 | Hello world                 | {'Hello': 1, 'world': 1}                                      |
|  1 | I am the abominable snowman | {'I': 1, 'am': 1, 'the': 1, 'abominable': 1, 'snowman': 1}    |
|  2 | I did not copy this text    | {'I': 1, 'did': 1, 'not': 1, 'copy': 1, 'this': 1, 'text': 1} |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...