Сжатие категориальных данных в более чем 3 категории

Вопрос или проблема

У меня есть множество категориальных данных, относящихся к частям речи, которые я хочу свести к меньшему числу категорий. 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)

В этом примере:

  1. Мы создаем условные списки (condlist), каждый из которых соответствует определенной категории частей речи.
  2. С помощью np.select() мы выбираем соответствующие категории для каждой строки в DataFrame. Если часть речи не входит ни в одну из перечисленных категорий, она будет отнесена к категории «другое» по умолчанию.
  3. После выполнения кода, в DataFrame будет добавлена новая колонка group, где каждая часть речи будет классифицирована согласно вашим критериям.

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

Оцените материал
Добавить комментарий

Капча загружается...