Присоединяйтесь и выполняйте расчеты в Pandas DataFrame на основе сопоставления текста - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть два фрейма данных отзывов клиентов.

Мой первый фрейм данных, 'df' содержит тысячи необработанных отзывов клиентов, обработанных / очищенных данных отзывов,и оценки настроений:

reviewBody                   reviewClean           sentimentScore
'I like these goggles'       'like goggles'        1
'I don't like these goggles' 'don't like goggles'  -1
'My strap broke'             'strap broke'         -1
 ...                         ...                  ...

Мой второй фрейм данных, 'bigrams' содержит наиболее часто встречающиеся биграммы в поле 'reviewClean' из моего первого фрейма данных:

topBigrams                 frequency
'like goggles'               150 
'strap broke'                100
  ...                        ...          

Моя цель - взять каждую из моих topBigrams, например, «как очки» или «сломанный ремень», найти каждый «reviewClean», который содержит каждый биграмм И связанное с ним отношение ко всему обзору, и вычислить средний показатель настроения длякаждый topBigram.

Мой конечный результат будет выглядеть примерно так (цифры для чистой иллюстрации):

topBigrams                 frequency   avgSentiment
'like goggles'             150         .98
'strap broke'              100         -.90
 ...                        ...         ...

Из этих данных я бы затем искал тренды накаждый биграмм, чтобы определить драйверы позитивных или негативных настроений более лаконичным способом.

Я даже не уверен, с чего начать.Большое спасибо за понимание потенциального подхода здесь.

1 Ответ

0 голосов
/ 24 декабря 2018

Вам нужно будет сделать перекрестное соединение см. Этот пост , чтобы проверить, содержит ли каждый отзыв каждый биграмм.Использование apply не обходится, так как вам нужно сравнивать строки по строкам.

df = pd.DataFrame([['I like these goggles', 'like goggles', 1],
        ["I don't like these goggles", "don't like goggles", -1],
        ['My strap broke', 'strap broke', -1]],
        columns=['reviewBody', 'reviewClean', 'sentimentScore'])

bigrams = pd.DataFrame([['like goggles', 150],
        ['strap broke', 100]],
        columns=['topBigrams', 'frequency'])

dfx = bigrams.assign(key=1).merge(df.assign(key=1), on='key').drop('key', 1)
dfx['has_bigram'] = dfx.apply(lambda x: x.get('topBigrams') in x.get('reviewClean'), axis=1)

После проверки биграммы в каждом очищенном обзоре вы можете использовать groupby для вычисления среднего настроенияна биграмме, только там, где биграмм существует.Затем объедините его с фреймом данных bigrams.

bigrams.merge(dfx.groupby(['topBigrams', 'has_bigram'])
                 .mean()
                 .reset_index()
                 .query('has_bigram')
                 .rename(columns={'sentimentScore':'avgSentiment'})
                 .get(['topBigrams', 'avgSentiment']),
              on='topBigrams')

# returns:
     topBigrams  frequency  avgSentiment
0  like goggles        150             0
1   strap broke        100            -1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...