在文档中计算标记数

5

我需要为训练数据中的每个令牌计算频率,并制作一个列表,其中列出了至少具有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
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))

这让我只能本地获得token,而不能全局获得。为了制作一个至少频率等于N的token列表,我应该拥有所有列表并计算所有行的数量。

我的困难在于计算整个列中token的频率。

请告诉我如何计算这些tokens?

更新:

以下代码运行良好:

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

然而我不知道如何提取所有出现次数大于15的单词/标记。


1
你能展示一下预期的输出吗?还有你的tokenized_text是什么?顺便说一句,我不是那个给你点踩的人~ - BENY
谢谢BEN_YO。所以tokenised_text应该是一个新的列(我不知道是否可以在我的训练数据集中这样做)。问题是,我应该考虑这些分词后的单词,以便将它们用作特征。我的期望输出将是一个单词列表,通过整个数据集进行计数(在我发布的示例中,所有令牌都具有计数1-不幸的是)。在创建此列表后,我应该选择那些计数值大于阈值的令牌/单词作为特征。 - user12907213
2个回答

2
假设你说以下内容运行良好。
s = df.Text.str.split(expand=True).stack().value_counts()

那么您可以进行以下操作
s[s>=15].index

获取至少 15 次出现的 token。

然而,第一行代码与 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

非常感谢Quang Hoang,还要感谢你指出不同的结果! - user12907213

0

你可以使用计数器集合来执行所需操作,然后创建一个仅包含已根据限制过滤的单词的辅助列表。请查看以下代码示例,其中限制为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}

感谢您的回答@Rafael Américo Sartori。我有一个问题:这对于列也适用吗(也许使用.apply)?我需要处理列,因为我需要将提取的单词/标记用作分类器的特征。 - user12907213
我尝试了这个:c = Counter() df.Text.str.split().apply(c.update) 但是我得到了全部都是 None - user12907213

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接