我有一个包含推文的 Pandas 数据框,我有一个列显示这些推文被转发了多少次。当我数词时,我想将它们乘以它们被转发的次数。
例如,对于这张表,我想计算苹果和香蕉 2 次,但要计算菠萝 4 次。所以,总的来说,我想数苹果 6 次,香蕉 2 次。
tweet retweet
-------------------------
apple banana 2
pineapple apple 4
如果我只想计算推文,我可以这样做
tweet_text = df['tweet'].str.cat(sep=' ')
tokens = nltk.word_tokenize(tweet_text)
most_common = pd.DataFrame(nltk.ngrams(tokens, 1)).value_counts().to_frame()
如果我想要二元组,我可以简单地做:
most_common = pd.DataFrame(nltk.ngrams(tokens, 2)).value_counts().to_frame()
但是如何考虑转发?
答案 0 :(得分:1)
我试着用字典解决它:
myDict = {}
tweets = pd.DataFrame({'tweet': ['apple bannana', 'pineapple', 'apple strawberry'],
'retweet': [2,4,3]})
for idx, row in tweets.iterrows():
for i in row['tweet'].split(" "):
if i in myDict:
myDict[i] = myDict[i] + row["retweet"]
else:
myDict[i] = row["retweet"]
print(myDict)
输出现在是 {'apple': 5, 'bannana': 2, 'pineapple': 4, 'strawberry': 3}
希望我理解这个问题是正确的。
也许这不是最有效的方式。另一种尝试是使用每条推文的每个词作为行广告创建一个数据框,而不是使用 groupby().sum()。
二元组更新 首先,这里可能是计算单个单词的另一种可能性。
tweets = pd.DataFrame({'tweet': ['apple bannana', 'pineapple', 'apple strawberry'],
'retweet': [2,4,3]})
unigrams = (
tweets['tweet'].str.lower()
.str.replace(r'[^a-z\s]', '')
.str.split(expand=True)
)
unigramDF = pd.DataFrame(unigrams)
unigramDF['retweet'] = tweets['retweet']
unigramDF = pd.melt(unigramDF, id_vars='retweet').drop(['variable'], axis=1).dropna().groupby(['value']).sum()
print(unigramDF)
我使用了这里的一些代码(用于积分):Generate N-Grams from strings with pandas
现在是二元组:
bigrams = []
for idx, row in tweets.iterrows():
unigrams = (
row['tweet'].lower().replace(r'[^a-z\s]', '').split((' '))
)
for i in range(0,len(unigrams)-1):
bigrams.append([unigrams[i] + ' ' + unigrams[i+1], row['retweet']])
bigramDF = pd.DataFrame(bigrams, columns=['bigram', 'retweet'])
bigramDF.groupby(['bigram']).sum()
print(bigramDF)
现在有了这两个数据框,计算概率应该不会太困难。
答案 1 :(得分:1)
我有一个类似的问题,我需要计算消息中单词的出现次数。如果您想在单个推文(数据帧的一个单元格)中计算单词出现次数,那么这将起作用
def word_frequency(str):
counts = dict()
words = str.split()
for word in words:
if word in counts:
counts[word] += 1
else:
counts[word] = 1
return counts
这将返回一个字典,其中单词作为键,它们的计数作为值,您可以将其应用于推文列。
然后你可以用它来理解数据
##lists for storing output of words and associated counts
words = []
occurrence = []
##add words and counts to above lists
for comment in comments:
for key in word_frequency(comment).keys():
words.append(key)
for value in word_frequency(comment).values():
occurrence.append(value)
import pandas as pd
measure = pd.DataFrame({'word':words, 'occurrence':occurrence})
对于 bigrams(或任何 ngram),可以通过稍微改变 word_frequency 函数来完成,然后其余的代码应该仍然可以工作
def ngrams_word_frequency(ngram):
counts = dict()
for gram in ngram:
words = ' '.join(word for word in gram)
if words in counts:
counts[words] += 1
else:
counts[words] = 1
return counts
这需要你给 ngrams_word_frequency 函数一个列表列表,对于我的个人项目,我创建了一个 ngrams 函数:
def ngrams(str, n):
str = str.split()
output = [str[i:i+n] for i in range(len(str)-n+1)]
return output