Вопрос или проблема
У меня есть множество категориальных данных, относящихся к частям речи, которые я хочу свести к меньшему числу категорий. np.where() не подойдет, потому что я хочу в итоге получить 6 категорий: существительное, глагол, прилагательное, наречие, предлог и другое.
Я понял, что могу использовать pandas.replace() в сочетании со словарем для этого.
Итак, я создал следующий словарь:
mappings = {"NN": "существительное", "NNS": "существительное", "NNP": "существительное",
"VB": "глагол", "VBD": "глагол", "VBG": "глагол", "VBN": "глагол", "VBP": "глагол", "VBZ": "глагол",
"JJ": "прилагательное", "JJR": "прилагательное", "JJS": "прилагательное",
"RB": "наречие", "RBR": "наречие", "RBS": "наречие",
"IN": "предлог"}
Проблема в том, что в данных присутствует гораздо больше частей речи. Есть ли способ объединить все эти другие части речи в категорию “другое”, или мне придется вручную вводить все возможные части речи?
Вы можете использовать numpy
select
функцию
Вам нужно будет адаптировать, но это будет что-то вроде этого:
nouns = ["NN","NNS","NNP"]
verbs = ["VB","VBD","VBG","VBN","VBP","VBZ"]
adjs = ["JJ","JJR","JJS"]
advs = ["RB","RBR","RBS"]
preps = ["IN"]
condlist = [
df.my_colum.isin(nouns),
df.my_colum.isin(verbs),
df.my_colum.isin(adjs),
df.my_colum.isin(advs),
df.my_colum.isin(preps),
]
choicelist = ["существительное","глагол","прилагательное","наречие","предлог"]
df["gruop"] = np.select(condlist= condlist, choicelist= choicelist, default = "другое")
Ответ или решение
Для сжатия категориальных данных о частях речи, чтобы получить шесть конечных категорий: существительное, глагол, прилагательное, наречие, предлог и «другое», вы можете воспользоваться подходом, который позволяет избежать ручного ввода всех возможных частей речи. Вместо перечисления всех остальных частей речи в словаре вы сможете использовать функцию numpy.select()
, что значительно упростит вашу задачу.
Ваш первоначальный словарь для сопоставления частей речи выглядит следующим образом:
mappings = {
"NN": "noun",
"NNS": "noun",
"NNP": "noun",
"VB": "verb",
"VBD": "verb",
"VBG": "verb",
"VBN": "verb",
"VBP": "verb",
"VBZ": "verb",
"JJ": "adj",
"JJR": "adj",
"JJS": "adj",
"RB": "adv",
"RBR": "adv",
"RBS": "adv",
"IN": "prep"
}
Вместо добавления каждого отдельного POS (часть речи) в программу для того, чтобы поместить их в категорию «другое», вы можете воспользоваться следующим кодом, используя библиотеку numpy
и метод isin()
, который проверяет наличие значений в указанных списках:
import numpy as np
import pandas as pd
# Предположим, df - это ваш DataFrame и my_column - колонка с частями речи
df = pd.DataFrame({'my_column': ["NN", "VB", "JJ", "RB", "IN", "XYZ", "VBD", "NNP", "ABC"]})
nouns = ["NN", "NNS", "NNP"]
verbs = ["VB", "VBD", "VBG", "VBN", "VBP", "VBZ"]
adjs = ["JJ", "JJR", "JJS"]
advs = ["RB", "RBR", "RBS"]
preps = ["IN"]
condlist = [
df.my_column.isin(nouns),
df.my_column.isin(verbs),
df.my_column.isin(adjs),
df.my_column.isin(advs),
df.my_column.isin(preps)
]
choicelist = ["noun", "verb", "adj", "adv", "prep"]
# Применяем np.select, чтобы создать новую колонку "group"
df["group"] = np.select(condlist=condlist, choicelist=choicelist, default="other")
print(df)
В этом примере:
- Мы создаем условные списки (
condlist
), каждый из которых соответствует определенной категории частей речи. - С помощью
np.select()
мы выбираем соответствующие категории для каждой строки в DataFrame. Если часть речи не входит ни в одну из перечисленных категорий, она будет отнесена к категории «другое» по умолчанию. - После выполнения кода, в DataFrame будет добавлена новая колонка
group
, где каждая часть речи будет классифицирована согласно вашим критериям.
Таким образом, для обработки большого числа частей речи вы применяете более элегантное и эффективное решение, избегая ручного ввода всех оставшихся категорий.