Как найти частоту слов для списка стран в pandas? - PullRequest
0 голосов
/ 04 мая 2020

Допустим, у меня есть .CSV, который имеет три столбца: tidytext, location, vader_senti

Мне уже удалось получить количество * положительного, нейтрального и отрицательного текста вместо word * pero country, используя следующий код:

data_vis = pd.read_csv(r"csviamcrpreprocessed.csv", usecols=fields)

def print_sentiment_scores(text):
    vadersenti = analyser.polarity_scores(str(text))
    return pd.Series([vadersenti['pos'], vadersenti['neg'], vadersenti['neu'], vadersenti['compound']])

data_vis[['vadersenti_pos', 'vadersenti_neg', 'vadersenti_neu', 'vadersenti_compound']]  = data_vis['tidytext'].apply(print_sentiment_scores)

data_vis['vader_senti'] = 'neutral'
data_vis.loc[data_vis['vadersenti_compound'] > 0.3 , 'vader_senti'] = 'positive'
data_vis.loc[data_vis['vadersenti_compound'] < 0.23 , 'vader_senti'] = 'negative'


data_vis['vader_possentiment'] = 0
data_vis.loc[data_vis['vadersenti_compound'] > 0.3 , 'vader_possentiment'] = 1

data_vis['vader_negsentiment'] = 0
data_vis.loc[data_vis['vadersenti_compound'] <0.23 , 'vader_negsentiment'] = 1

data_vis['vader_neusentiment'] = 0
data_vis.loc[(data_vis['vadersenti_compound'] <=0.3) & (data_vis['vadersenti_compound'] >=0.23) , 'vader_neusentiment'] = 1

sentimentbylocation = data_vis.groupby(["Location"])['vader_senti'].value_counts()
sentimentbylocation

sentimentbylocation дает мне следующие результаты:

Location                      vader_senti
Afghanistan                   negative          151
                              positive           25
                              neutral             2
Albania                       negative            6
                              positive            1
Algeria                       negative          116
                              positive           13
                              neutral             4

ЧТОБЫ ПОЛУЧИТЬ САМЫЕ ОБЩИЕ ПОЗИТИВНЫЕ СЛОВА, Я ИСПОЛЬЗУЛ ЭТОТ КОД:

def process_text(text):
    tokens = []
    for line in text:
        toks = tokenizer.tokenize(line)
        toks = [t.lower() for t in toks if t.lower() not in stopwords_list]
        tokens.extend(toks)

    return tokens

tokenizer=TweetTokenizer()
punct = list(string.punctuation)
stopwords_list = stopwords.words('english') + punct + ['rt','via','...','…','’','—','—:',"‚","â"]
pos_lines = list(data_vis[data_vis.vader_senti == 'positive'].tidytext)

pos_tokens = process_text(pos_lines)
pos_freq = nltk.FreqDist(pos_tokens)

pos_freq.most_common()

Выполнение этого даст мне наиболее распространенные слова и количество раз их появления, например

[(good, 1212),
(amazing, 123)

Однако я хочу видеть, сколько из этих положительных слов появилось в страна.

Например:

enter image description here

У меня есть образец CSV здесь: https://drive.google.com/file/d/112k-6VLB3UyljFFUbeo7KhulcrMedR-l/view?usp=sharing

1 Ответ

0 голосов
/ 04 мая 2020

Создайте столбец для каждого most_common слова, затем выполните groupby местоположение и используйте agg, чтобы применить сумму для каждого счета:

words = [i[0] for i in pos_freq.most_common()]

# lowering all cases in tidytext
data_vis.tidytext = data_vis.tidytext.str.lower()

for i in words:
    data_vis[i] = data_vis.tidytext.str.count(i)

funs = {i: 'sum' for i in words}
grouped = data_vis.groupby('Location').agg(funs)

На основании примера из CSV и использования most_common в качестве ['good', 'amazing'] результат будет:

grouped

#               good amazing
# Location      
# Australia     0    1
# Belgium       6    4
# Japan         2    1
# Thailand      2    0
# United States 1    0
...