Получить средние оценки для наиболее распространенных (часто встречающихся) слов в кадре данных - PullRequest
0 голосов
/ 20 марта 2019

Я пытаюсь получить средние оценки для наиболее распространенных слов в моих фреймах данных.В настоящее время мой фрейм данных имеет этот формат.

sentence            |    score
"Sam I am Sam"      |      10
"I am Sam"          |      5
"Paul is great Sam" |      5
"I am great"        |      0 
"Sam Sam Sam"       |      15

Мне удалось успешно получить наиболее распространенные слова, используя эту ошибку кода.Это очистило мой dataframe и удалило все стоп-слова.Это дало мне эту серию.

from collections import Counter

nltk.download('stopwords')
df_text = df[['sentence','score']]
df_text['sentence'] = df_text['sentence'].replace("[a-zA-Z0-9]{14}|rt|[0-9]",'',regex=True, inplace=False)
df_text['sentence'] = df_text['sentence'].apply(lambda x: ' '.join([word for word in x.split() if word not in (stop)]))
top_words =pd.Series(' '.join(df_text['sentence']).lower().split()).value_counts()[:25]
Words     |    Freq
Sam       |     7
I         |     3
Am        |     3 
Great     |     2
is        |     1

Я понимаю, что groupby. (). Mean () - это действительно важная функция, которую мне нужно использовать, но я не понимаю, как бы я попытался получить счетколонка.Это идеальный выход, который я пытаюсь получить.Я показал математику, чтобы дать логику о том, как я получил средние.

Words     |    Avg
Sam       |     35/7 = 5
I         |     15/3 = 5
Am        |     15/3 = 5
Great     |     5/2 = 2.5
is        |     5/1 = 5

Ответы [ 2 ]

1 голос
/ 21 марта 2019

Я пропущу часть очистки данных (например, удаление стоп-слов), за исключением того, что вы действительно должны использовать nltk.word_tokenize вместо split(). В частности, вы должны будете исключить кавычки.

df['words'] = df['sentence'].apply(nltk.word_tokenize)

Как только слова извлечены, подсчитайте их и объедините с оценками:

word_counts = pd.concat([df[['score']],
                         df['words'].apply(Counter).apply(pd.Series)], 
                        axis=1)

Теперь вычислите взвешенные суммы:

ws = word_counts.notnull().mul(word_counts['score'], axis=0).sum() \
                                               / word_counts.sum()
#score    1.0
#``       7.0
#Sam      5.0
#I        5.0
#am       5.0
#''       7.0
#Paul     5.0
#is       5.0
#great    2.5

Наконец, исключите первый ряд, который был включен только для удобства:

del(ws['score'])
0 голосов
/ 21 марта 2019

учитывая, что у вас есть данные в табличном формате .. это должно работать

import pandas as pd
from collections import Counter

df = pd.read_csv('data.csv')
cnt = Counter([word for sen in df.sentence.values for word in sen.split()])

for item in cnt:
    tot_score = 0
    for row in df.iterrows():
        if item in row[1]['sentence'].split():
            tot_score += row[1]['score']
    if cnt[item] != 0:
        print(item, tot_score/cnt[item])
    else:
        print(item, 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...