计算文档中的标记

Counting tokens in a document

我需要计算训练数据中每个标记的频率,列出频率至少等于 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))

这给了我本地令牌,而不是全局令牌。我应该拥有所有列表并计算所有行,以便列出频率至少等于 N 的标记。 我的困难在于计算所有列中标记的频率。

你能告诉我如何计算这些代币吗?

更新:

以下代码工作正常:

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

但是我不知道如何提取所有 words/tokens 计数 > 15,例如。

您可以使用 Counter 集合来执行您需要的操作,而不是仅使用根据您的限制过滤的字词创建二级列表。检查下面的代码作为示例,限制为 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}

假设您说以下工作正常

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