Как найти уникальные слова, которые находятся в категории - Python - PullRequest
0 голосов
/ 09 ноября 2018

У меня есть фрейм данных с column1, который содержит текстовые данные, column2 содержит категорию текста, содержащегося в column1. Я хотел бы найти слова, которые встречаются в текстовых данных для одной категории (т.е. неформальные), но не встречаются в других категориях. Несколько строк в кадре данных будут иметь одну и ту же категорию.

        Textual                           Category 
Hi johnny how are you today              Informal 
Dear Johnny                              Formal
Hey Johnny                               Informal
To Johnny                                Formal

Пример вывода:

Informal: [Hi, how, are, you, today, Hey]
Formal: [Dear, To]

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Вы можете создать словарь через groupby + to_dict. Затем вычислите уникальные значения и удалите их с помощью set и словаря. Обратите внимание, в отличие от вашего примера, я не применяю каких-либо проверок, например, Я предполагаю, что у Джонни всегда будет заглавная буква J.

from collections import Counter
from itertools import chain

df = pd.DataFrame({'Textual': ['Hi Johnny how are you today', 'Dear Johnny', 'Hey Johnny', 'To Johnny'],
                   'Category': ['Informal', 'Formal', 'Informal', 'Formal']})

def return_unique(x):
    return list(set(' '.join(x.values).split()))

res = df.groupby('Category')['Textual'].apply(return_unique).to_dict()

c = Counter(chain.from_iterable(res.values())).items()

unique = {k for k, v in c if v == 1}

res = {k: list(set(v) & unique) for k, v in res.items()}

{'Formal': ['To', 'Dear'],
 'Informal': ['today', 'how', 'Hi', 'Hey', 'are', 'you']}
0 голосов
/ 09 ноября 2018
# Remove punctuation
df.Textual = df.Textual.str.replace('.', '')
df.Textual = df.Textual.str.replace(',', '')
df.Textual = df.Textual.str.replace('?', '')

# get list of all words per Category
df1 = df.groupby(['Category'])['Textual'].apply(' '.join).reset_index()
df1['Textual'] = df1.Textual.str.split().apply(lambda x: list(filter(None, list(set(x)))))
print(df1)

# Split the list in different columns
df = pd.DataFrame(df1.Textual.values.tolist(), index= df1.index)
print(df)

# Reshape the df to have a line for each word
df['Category'] = df1.Category
df = df.set_index("Category")
df = df.stack()
print(df)

# Drop word that are present in several Categories
df = df.str.upper().drop_duplicates(keep=False)
print(df)

# Reshape the df to the expected output
df = df.groupby('Category').apply(list)
print(df)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...