在每个ID的多个文档的ID级别获取n-gram计数(对文档进行令牌化,然后聚合或tokenizer跳过参数)

我有一个包含ID和文本的数据框,并且想获取每个ID的n-gram计数(例如,一个ID项矩阵)。

作为一个例子,让我们为下表选择2克(2克)

+-----+------------------+
| id  |   text           |
+-----+------------------+
| id1 | quick with fox   |
| id1 | brown fox        |
| id1 | quick squirrel   |
| id2 | yes its great    |
| id2 | fun with fox     |
| id3 | horr time        |
+-----+------------------+

在这种情况下,所需的2克计数看起来像(不一定是二进制

+-----+------------+----------+-----------+----------------+---------+-----------+----------+-----------+
|     | quick with | with fox | brown fox | quick squirrel | yes its | its great | fun with | horr time |
+-----+------------+----------+-----------+----------------+---------+-----------+----------+-----------+
| id1 |          1 |        1 |         1 |              1 |       0 |         0 |        0 |         0 |
| id2 |          0 |        1 |         0 |              0 |       1 |         1 |        1 |         0 |
| id3 |          0 |        0 |         0 |              0 |       0 |         0 |        0 |         1 |
+-----+------------+----------+-----------+----------------+---------+-----------+----------+-----------+

这必须有效地运行100万行,100-300k个唯一ID和文本(范围从3个字符到20个以上的单词)(例如一个段落)。

我尝试过/提议过的两种方法

  1. 在文档级别进行标记化,然后按groupBy,然后求和
vectorizer = CountVectorizer(min_df = 3,ngram_range=(2,2))
X_bow_sp = vectorizer.fit_transform(df["text"])
vocab = vectorizer.get_feature_names()

bow_df = pd.DataFrame(X_bow_sp)
bow_ids_df = pd.concat([df['id'],bow_df],axis=1,ignore_index=False,sort=False)
id_term_df = bow_ids_df.groupby('id')[vocab].sum()

这是太慢的方式。具体来说,是最后一行的总和。

  1. 在组级别连接文本(例如,用'|'分隔),但是如何分解n-gram?
id_text_df = df.groupby(['id'])['text'].apply(lambda x: ' | '.join(x))

接下来呢?遇到|时,如何提供将可能的n-gram分开的令牌生成器选项?

此刻我主要使用python / pandas。

cathylia 回答:在每个ID的多个文档的ID级别获取n-gram计数(对文档进行令牌化,然后聚合或tokenizer跳过参数)

如果加入“”而不是“ |”,则解决方案2应该起作用。

''' id_text_df = df.groupby(['id'])['text']。apply(lambda x:''.join(x)) '''

然后例如id1的行将显示为: 快速与狐狸棕狐狸快速松鼠

本文链接:https://www.f2er.com/2982598.html

大家都在问