在熊猫数据框的所有行中迭代nltk.tokenize

时间:2019-09-30 21:30:29

标签: python pandas nltk tokenize

感谢您为一个愚蠢的问题所提供的帮助。我已将一个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 个答案:

答案 0 :(得分:1)

我认为使用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}}

注意:将作为 稀疏numpy矩阵 X_train_counts变成数据框不是一个好主意< / em>。但是,了解和可视化模型的各个步骤可能很有用。

答案 1 :(得分:0)

在所有行上创建<?xml version="1.0" encoding="utf-8"?> <configuration> <location path="." inheritInChildApplications="false"> <system.webServer> <handlers> <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" /> </handlers> <aspNetCore processPath="D:\home\SiteExtensions\AspNetCoreRuntime.3.0.x86\dotnet" arguments=".\Api.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="InProcess" /> </system.webServer> </location> </configuration> 循环之后:

DataFrame

答案 2 :(得分:0)

万一有人对这个小众用例感兴趣,这是我最终能够工作的代码:

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"])

感谢大家的帮助!