在Python中按组有效地标记和总结文本数据

问题描述 投票:0回答:1

我有一个 Python 数据集,如下所示:

data = pd.DataFrame({
    'ID': ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J'],
    'TEXT': [
        "Mouthwatering BBQ ribs cheese, and coleslaw.",
        "Delicious pizza with pepperoni and extra cheese.",
        "Spicy Thai curry with cheese and jasmine rice.",
        "Tiramisu dessert topped with cocoa powder.",
        "Sushi rolls with fresh fish and soy sauce.",
        "Freshly baked chocolate chip cookies.",
        "Homemade lasagna with layers of cheese and pasta.",
        "Gourmet burgers with all the toppings and extra cheese.",
        "Crispy fried chicken with mashed potatoes and extra cheese.",
        "Creamy tomato soup with a grilled cheese sandwich."
    ],
    'DATE': [
        '2023-02-01', '2023-02-01', '2023-02-01', '2023-02-01', '2023-02-02',
        '2023-02-02', '2023-02-01', '2023-02-01', '2023-02-02', '2023-02-02'
    ]
})

我想做的是按日期分组并在删除标点符号后获取每个标记的频率。我对 Python 环境非常陌生;我来自 R,我一直在研究 gensim 库以供进一步参考。对我来说这看起来很复杂。我想要的输出如下所示:对于每个组(日期),我们将获得每个唯一标记的频率。

代币 小计 日期
奶酪 5 2023 年 1 月 2 日
5 2023 年 1 月 2 日
5 2023 年 1 月 2 日
额外 2 2023 年 1 月 2 日
令人垂涎欲滴 1 2023 年 1 月 2 日
烧烤 1 2023 年 1 月 2 日
排骨 1 2023 年 1 月 2 日
凉拌卷心菜 1 2023 年 1 月 2 日
好吃 1 2023 年 1 月 2 日
披萨 1 2023 年 1 月 2 日
意大利辣香肠 1 2023 年 1 月 2 日

在 R 中,这可以使用 Quanteda 轻松完成,如下所示:

corpus_food<-corpus(data,
                  docid_field = "ID",
                  text_field = "TEXT")

corpus_food %>%
  tokens(remove_punct = TRUE) %>% 
  dfm() %>% 
  textstat_frequency(groups = lubridate::date(DATE)) 

这仅创建一个语料库,然后标记化以删除标点符号。随后,它创建一个文档术语矩阵,最后按组总结标记及其频率。

我绝不会比较 Python 和 R 这两种语言。它们非常棒,但目前,我对一种非常简单且快速的方法来在 Python 中实现我的结果感兴趣。如果您不使用 gensim 库,我仍然对在 Python 中以更快、更有效的方式实现我正在寻找的目标的方法感兴趣。我是 Python 新手。

python pandas dataframe nlp gensim
1个回答
0
投票

我会简单地

extractall
然后的话
value_counts

out = (
    data[["DATE"]].join(
        data["TEXT"].str.extractall("(\w+)")[0]
            .droplevel(1).rename("TOKEN").str.lower()
    ).groupby(["DATE", "TOKEN"]).value_counts().reset_index(name="SUBTOTAL")
        .sort_values(["DATE", "SUBTOTAL"], ascending=[True, False])
)

输出:

print(out)

          DATE   TOKEN  SUBTOTAL
1   2023-02-01     and         5
4   2023-02-01  cheese         5
30  2023-02-01    with         5
10  2023-02-01   extra         2
0   2023-02-01     all         1
..         ...     ...       ...
51  2023-02-02   sauce         1
52  2023-02-02    soup         1
53  2023-02-02     soy         1
54  2023-02-02   sushi         1
55  2023-02-02  tomato         1

[57 rows x 3 columns]
© www.soinside.com 2019 - 2024. All rights reserved.