计算文档中的标记

2022-07-06 11:27:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要计算训练数据中每个令牌的频率,列出频率至少等于N的令牌列表。 为了将我的数据集拆分为训练和测试,我做了如下操作:

X = vectorizer.fit_transform(df['Text'].replace(np.NaN, ""))

y=df['Label']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.30, stratify=y)

例如,如果Text列包含句子

Text
Show some code
Describe what you've tried
Have a non-programming question?
More helpful links 

要提取所有代币,我执行了以下操作:

import pandas as pd
from nltk.tokenize import word_tokenize

X_train['tokenized_text'] = X_train.Text.apply(lambda row: word_tokenize(row))

这为我提供了本地令牌,而不是全局令牌。我应该拥有all列表并对所有行进行计数,以便生成一个频率至少等于N的令牌列表。 我的困难在于通过所有列计算代币的频率

你能告诉我怎么数这些代币吗

更新:

以下代码可以正常工作:

df.Text.str.split(expand=True).stack().value_counts()

但是,我不知道如何提取所有具有count>;例如,15


Tags: 数据texttestimportdf列表trainfitword频率rowsplittokenize代币vectorizer
2条回答
网友
1楼 ·

假设你说下面的方法行得通

s = df.Text.str.split(expand=True).stack().value_counts()

那你就可以了

s[s>=15].index

获取至少有15个计数的令牌

但是,第一行没有给出与nltk.word_tokenize相同的标记化。如果需要后者的输出,可以将第一行替换为:

s = df.Text.apply(lambda row: word_tokenize(row)).explode().value_counts()

从您的示例数据中可以得出以下信息:

Have               1
you                1
what               1
a                  1
Describe           1
've                1
non-programming    1
tried              1
some               1
code               1
?                  1
links              1
Show               1
helpful            1
More               1
question           1
Name: Text, dtype: int64
网友
2楼 ·

您可以使用计数器集合执行所需操作,然后仅使用根据限制筛选的单词创建辅助列表。以限制2为例,检查以下代码:

from collections import Counter
test_list = ["test", "test", "word", "hello"]

counter = Counter(test_list)
filtered_counter = {k:v for k, v in counter.items() if v >= 2}

热门问题