【发布时间】:2020-08-26 08:23:36
【问题描述】:
我正在尝试构建一个模型,该模型能够通过查看其文本来对一本书(目前只是小说)的作者进行分类。起初,我只与至少拥有 30 本书的作者合作。在我的数据集中,总共有大约 30 位作者撰写了大约 2000 本书,而且效果非常好,所以我决定提高赌注。通过将门槛降低到 10 本书,数据库增长到约 400 位作者和约 9000 本书。
我对书籍进行分类的方式如下:我从每个文本中删除了标点符号、换行符、多余的空格和停用词,然后我使用 sklearn CountVectorizer 和 TfidfVectorizer 提取了特征。使用这种方法,2000 本书数据库的 F1 分数为 0.95,9000 本书数据库的 F1 分数为 0.62。在这两种情况下,我都使用了 scikit learn 中的 SGD 模型。
使用较大数据集的训练要慢得多,因此我决定从每本书中随机抽取 5000 个单词并仅使用这些单词。这将训练时间从 20 分钟减少到只有 2 分钟,让我能够尝试不同的东西。各种指标没有太大差异,所以我决定尝试删除 tfidf 功能。仅使用 CountVectorizer 我得到了 0.87 F1 分数。
我不确定为什么会发生这种情况,我的期望是 tfidf 会让事情变得更容易,从而提高我的分数。理论上,tfidf 应该有助于矩阵的稀疏性。你知道为什么删除它会提高分数吗?
还有其他策略,也许更适合处理长文本?我应该考虑以某种方式修剪数据集吗?
【问题讨论】:
-
如果您尝试根据句子结构和使用的单词来分析作者,那么使用 5000 个连续单词(例如一本书的前 5000 个单词)不会比选择 5000 个更有价值随机词?另外,我觉得保留标点符号也可能有助于区分作者。
-
@k-venkatesan 是的,理论上前 5000 个可能会更好。除了随机的 5000 个单词之外,我已经在尝试使用 first 和 last 。出于某种奇怪的原因,随机 5000 效果更好。
标签: python machine-learning scikit-learn nlp