我有一个包含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个以上的单词)(例如一个段落)。
我尝试过/提议过的两种方法
- 在文档级别进行标记化,然后按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()
这是太慢的方式。具体来说,是最后一行的总和。
- 在组级别连接文本(例如,用'|'分隔),但是如何分解n-gram?
id_text_df = df.groupby(['id'])['text'].apply(lambda x: ' | '.join(x))
接下来呢?遇到|
时,如何提供将可能的n-gram分开的令牌生成器选项?
此刻我主要使用python / pandas。