Выполните итерацию nltk.tokenize во всех строках кадра данных pandas. - PullRequest
1 голос
/ 01 октября 2019

благодарен за помощь за то, что кажется глупым вопросом. Я вытащил таблицу sqlite в фрейм данных Pandas, чтобы я мог токенизировать и подсчитывать частоту слов из серии твитов.

С помощью приведенного ниже кода я могу создать это для первого твита. Как мне выполнить итерацию для всей таблицы?

conn = sqlite3.connect("tweets.sqlite")
data = pd.read_sql_query("select tweet_text from tweets_new;", conn)

tokenizer=RegexpTokenizer(r'\w+')
tokens=tokenizer.tokenize(data['tweet_text'][0])

words = nltk.FreqDist(tokens)

unigram_df = pd.DataFrame(words.most_common(),
                             columns=["WORD","COUNT"])

unigram_df

Когда я изменяю значение на что-либо, кроме одной строки, я получаю следующую ошибку:

TypeError: expected string or buffer

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

Я пытался:

%%time

tokenizer = RegexpTokenizer(r'\w+')  

print "Cleaning the tweets...\n"
for i in xrange(0,len(df)):
    if( (i+1)%1000000 == 0 ):  
        tokens=tokenizer.tokenize(df['tweet_text'][i])
        words = nltk.FreqDist(tokens)

Похоже, это должно работать, но все равно возвращает только слова из первого ряда.

Ответы [ 3 ]

1 голос
/ 01 октября 2019

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

from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd 

corpus_tweets = [['I love pizza and hambuerger'],['I love apple and chips'], ['The pen is on the table!!']]
df = pd.DataFrame(corpus_tweets, columns=['tweet_text'])

Вы можете создать шаблон набора слов с помощью нескольких строк:

count_vect = CountVectorizer()
X_train_counts = count_vect.fit_transform(df.tweet_text)

Вы можете напечатать полученный словарь:

count_vect.vocabulary_
# ouutput: {'love': 5, 'pizza': 8, 'and': 0, 'hambuerger': 3, 'apple': 1, 'chips': 2, 'the': 10, 'pen': 7, 'is': 4, 'on': 6, 'table': 9}

и получите информационный кадр с количеством слов:

df_count = pd.DataFrame(X_train_counts.todense(), columns=count_vect.get_feature_names())

   and  apple  chips  hambuerger  is  love  on  pen  pizza  table  the
0    1      0      0           1   0     1   0    0      1      0    0
1    1      1      1           0   0     1   0    0      0      0    0
2    0      0      0           0   1     0   1    1      0      1    2

Если это полезно для вас, вы можете объединить информационный кадр данных с информационным кадром корпуса:

pd.concat([df, df_count],  axis=1)

                    tweet_text  and  apple  chips  hambuerger  is  love  on  \
0  I love pizza and hambuerger    1      0      0           1   0     1   0   
1       I love apple and chips    1      1      1           0   0     1   0   
2    The pen is on the table!!    0      0      0           0   1     0   1   

   pen  pizza  table  the  
0    0      1      0    0  
1    0      0      0    0  
2    1      0      1    2  

Если вы хотите получить словарь, содержащий пары <word, count> для каждого документа, на данный момент все, что вам нужно сделать, это:

dict_count = df_count.T.to_dict()

{0: {'and': 1,
  'apple': 0,
  'chips': 0,
  'hambuerger': 1,
  'is': 0,
  'love': 1,
  'on': 0,
  'pen': 0,
  'pizza': 1,
  'table': 0,
  'the': 0},
 1: {'and': 1,
  'apple': 1,
  'chips': 1,
  'hambuerger': 0,
  'is': 0,
  'love': 1,
  'on': 0,
  'pen': 0,
  'pizza': 0,
  'table': 0,
  'the': 0},
 2: {'and': 0,
  'apple': 0,
  'chips': 0,
  'hambuerger': 0,
  'is': 1,
  'love': 0,
  'on': 1,
  'pen': 1,
  'pizza': 0,
  'table': 1,
  'the': 2}}

Примечание : поворот X_train_counts, что разреженная матрица NumPy в кадре данных не очень хорошая идея . Но может быть полезно понять и визуализировать различные этапы вашей модели.

0 голосов
/ 04 октября 2019

В случае, если кто-то заинтересован в этом нишевом сценарии использования, вот код, который я в итоге смог заставить работать:

conn = sqlite3.connect("tweets.sqlite")
data = pd.read_sql_query("select tweet_text from tweets_new;", conn)

alldata = str(data)

tokenizer=RegexpTokenizer(r'\w+')
tokens=tokenizer.tokenize(alldata)

words = nltk.FreqDist(tokens)

unigram_df = pd.DataFrame(words.most_common(),
                             columns=["WORD","COUNT"])

Спасибо всем за помощь!

0 голосов
/ 01 октября 2019

После создания цикла DataFrame по всем строкам:

tokenizer = RegexpTokenizer(r'\w+')
fdist = FreqDist()
for txt in data['tweet_text']:
      for word in tokenizer.tokenize(txt):
          fdist[word.lower()] += 1
...