【问题标题】:Literary author classification from book content从书籍内容看文学作者分类
【发布时间】: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


【解决方案1】:

这里可能有两个问题:

  1. 您没有调整 TFIDF 的参数,因此它给出的分数很低。尝试进行网格搜索和min_dfmax_dfmax_features 等参数。这可能会增加分数。 CountVectorizer 可能表现良好,因为分类器可能会将某些独特的单词与某个作者相关联。
  2. 数据不平衡问题。您可以尝试在 TFIDF 功能上使用 SMOTE,或者如果您使用 Logistic Regression,您可以设置 class_weights='balanced',这也可能会提高分数。

【讨论】:

  • 感谢您的提示!问题是,每次我尝试使用甚至没有那么多参数的网格搜索时,我的内核都会死掉。有没有一个简单的解决方案?
  • 我猜这可能是由于内存错误,tfidf vocab 的大小增长非常快。您可以使用 Google Colab,因为它提供了大量 RAM。
猜你喜欢
  • 1970-01-01
  • 2021-04-30
  • 1970-01-01
  • 1970-01-01
  • 2013-10-19
  • 1970-01-01
  • 1970-01-01
  • 2011-12-10
  • 2011-12-24
相关资源
最近更新 更多