超越关键词依赖的文本分类和推断实际含义。

10

我正在尝试开发一个文本分类器,将一篇文章归类为私密公开。以医疗或健康信息为例,我所能想到的典型分类器会将关键词作为主要区分因素,对吧?但像下面这种情况怎么办呢?如果两个文本都包含相似的关键词但具有不同的含义呢。

以下文字揭示了某人的私人(健康)状况(患者患有癌症):

我曾经去过两家诊所和我的PCP,我只做了一次超声波检查,被告知这是一个正在恢复的囊肿或者血肿,但是它变得越来越大并开始让我的腿疼痛。我的PCP说这不可能是一个囊肿,因为它一开始就太大了,而且我发誓我从未受伤过,甚至没有到过腿。现在我感到非常害怕和担心癌症。我注意到大约9个月前下蹲时有一种轻微的不适感。3个月前,我下蹲整理衣服时感觉有点疼痛。这种疼痛促使我检查我的,那时我注意到小腿底部有一个肿块,屈膝更加明显。最终,在四次诊所访问、一次超声波检查和一次PCP之后,结果似乎是积极的,肿块正在变大。
[私人](正确分类)

以下是来自医生的评论,绝对不会透露他的健康状况。它介绍了典型分类模型的弱点:

不要惧怕,也不要假设这是什么坏事,比如癌症。我在我的诊所里经历过几个案例,这似乎很熟悉。正如你所提到的,它可能是一个囊肿或血肿,并且正在变大,它必须进行一些额外的诊断,比如活组织检查。在那个区域有疼痛或肿块的大小并不意味着有什么坏的情况。你应该再去几次专科诊所,接受一些特定的测试,例如活组织检查、CT扫描、pcp和超声波,在这个肿块变得更大之前。

由于明显的原因,第二段被所有当前分类器分类为私人内容。相似的关键词、有效的单词序列以及主题的出现似乎让分类器非常困惑。甚至,两个内容都包含像“I”和“You”(名词、代词)这样的主语。我考虑过从Word2Vec到Doc2Vec,从推断含义到语义嵌入,但无法想出最适合这个问题的解决方案。

你有什么想法,我应该如何处理分类问题?先感谢你的帮助。

目前的进展:
我所收集的数据来自公共来源,病人/受害者通常在那里发布自己的情况,而医生/祝福者则回复这些情况。我爬取时的假设是 - 帖子属于我的私有类别,而评论属于公共类别。总共我从5K+5K的帖子/评论中开始,使用朴素贝叶斯分类器进行了大约60%的分类,没有进行任何主要预处理。我将很快尝试神经网络。但在输入任何分类器之前,我只想知道如何更好地预处理数据,以便为不同的类别分配合理的权重,以实现更好的区分效果。


你能否介绍一下你目前的方法和它们的缺点?更详细的信息将有助于避免重复尝试(从我所了解的情况来看,结果并不令人满意)。例如模型、架构、使用的表示、训练时间、数据大小等任何信息都会对此有所帮助。 - Szymon Maszke
我收集的数据来自公共资源,病人/受害者通常在那里发布自己的情况,医生/善心人士会回复。我在爬取时假设 - 帖子属于我的私有类别,评论属于公共类别。总共我开始有5K+5K的帖子/评论,使用朴素贝叶斯分类器进行了约60%的分类,没有进行任何主要的预处理。我很快就会尝试神经网络。但是在将其馈送到任何分类器之前,我想知道如何更好地预处理,以便对两个类别提供合理的权重以获得更好的区分效果。 - Nuhil Mehdy
请更新您的问题,而不是发布评论,这样对于每个人来说都更易读。 - Szymon Maszke
说实话,如果没有更多的样本,写出一些东西可能会很困难,因为为这种特定情况构建的任何东西可能会在另一个情况下失败。例如,在这种情况下,更加重视单词“我”、“我自己”和“我的”,而不是“你”,可以帮助区分,因为这更有可能表示患者谈论他们自己的医疗历史,其中可能包含私人信息。但这在另一个对话中很容易失败。此外,我们不知道... - Edeki Okoh
1
您是否试图区分“主题发起者”文本和“非作者回复”?目前并不清楚什么是公共和私有的区别。 - igrinis
3个回答

4
如果您发布的数据代表您试图区分的类别,基于关键词的特征可能不是最有效的。看起来有些被视为停用词的术语将成为判断私人和公共内容的良好线索。您提到了代词,我认为这仍然是一个不错的方向。如果您正在使用单个词/词袋等特征,请确保您的向量化器没有将它们移除。
对第一人称代词(例如,I,my,I've,mine)的实例进行计数,私人案例为13,公共案例为2。
公共示例具有第二人称代词(例如,you),而第一个示例没有。因此,关于第一人称代词和您的关键字的计数或平滑比率的特征可能是有效的。
如果您有句法结构或通过n-gram或类似表示跟踪位置信息,则涉及第一人称代词和关键字的特征可能是有效的。
此外,动词开头的句子结构(如“Don't be ...”,“Having an...”)是第二人称指导语言的特征,可能在公共文本中更常见。

最后一个推测的想法:这两个段落的情感差别很大,如果您可以访问情感分析,那可能会提供额外的线索。我预计Public类会比Private类更中立。

将您的公共示例插入Watson Tone Analyzer演示文稿中,会得到这个显着的结果:

{
  "sentence_id": 3,
  "text": "I am now scared and afraid of cancer.",
  "tones": [
    {
      "score": 0.991397,
      "tone_id": "fear",
      "tone_name": "Fear"
    }
  ]
},

公开声明中也包含一个带有恐惧标签的句子,但是它没有得到高分,伴随着其他注释,并且在句子中明确否定。因此,利用这些作为特征可能是值得的。
"sentences_tone": [
    {
      "sentence_id": 0,
      "text": "Don’t be scared and do not assume anything bad as cancer.",
      "tones": [
        {
          "score": 0.874498,
          "tone_id": "fear",
          "tone_name": "Fear"
        },
        {
          "score": 0.786991,
          "tone_id": "tentative",
          "tone_name": "Tentative"
        },
        {
          "score": 0.653099,
          "tone_id": "analytical",
          "tone_name": "Analytical"
        }
      ]
    },

3
那些只是描述得比较模糊,因为整个过程都是任务特定的。不过你可以看一下那些内容,从中获取一些灵感。
通用提示:
- 从简单模型开始(就像你正在做的那样),如果结果不尽如人意,逐渐增加其复杂性。在跳转到神经网络之前,你可能想尝试众所周知的随机森林和xgboost
数据提示:
以下是几个可能会对你有所帮助的快速提示:
- 你没有太多的数据点。如果可能的话,我建议你从相同(或至少非常相似)的来源/分布中收集更多数据,这将在我看来对你最有帮助。 - 改善数据的表示(详见下文),第二/第一佳选择。 - 你可以尝试词干提取/词形还原(来自nltkspaCy),但我认为在这种情况下不会有帮助,可以不考虑这个。
数据表示:
我假设你目前使用的是词袋模型TF-IDF。如果你还没有尝试过第二个模型,我建议你在深入更复杂(或者是?)的内容之前先尝试一下。你可以很容易地使用sklearn的TfidfVectorizer来实现。
如果结果不尽人意(并且你已经尝试了类似于LightGBM的Random Forest/xgboost之类的模型),我建议你换用语义表示。

语义表示

正如你所提到的,有一种由word2vec或Doc2Vec算法创建的表示方法(我建议不要使用后者,它可能没有什么帮助)。
你可以将你的例子分成句子,并添加像<eos>这样的标记来表示句子的结束,这可能会帮助神经网络学习。
另一方面,其他模型可能更适合您的任务,比如BERT。这个模型是上下文相关的,意味着一个标记I的表示会根据周围的单词略有不同(由于此表示是可训练的,因此它应该很适合您的任务)。
如果您希望使用PyTorch,则Flair库提供了一个不错且直观的解决方案。如果您在Tensorflow方面,则可以使用Tensorflow Hub,其中也有最先进的嵌入可供您轻松使用。
神经网络方面,从简单的循环模型分类器开始,使用GRU或LSTM单元(取决于选择的框架,它们的语义有些不同)。
如果这种方法仍然不令人满意,您应该看看注意力网络,分层注意力网络(每个句子一个注意力级别,整个文档再一个注意力级别),或者基于卷积的方法。

这些方法可能需要一段时间,并涉及很多主题供您尝试,其中一个或多个组合可能会很好地适用于您的任务。


-2

(1) 贝叶斯分类器确实是一个弱分类器 - 我会尝试SVM。如果您看到了改进,那么可以使用神经网络(也许是深度学习)进一步改进。

(2) 特征工程 - 使用TFiDF,并尝试其他方法(许多人建议使用Word2Vec,尽管我个人尝试过它并没有改进)。此外,您可以删除停用词。

有一件事情值得考虑,因为您提供了两则轶事,就是客观地衡量人类在任务上的一致性水平。有时候被忽视的是,两个人给予相同的文本可能会对标签产生分歧(有些人可能会说特定文档是私有的,尽管它是公开的)。这只是需要注意的点 - 因为如果例如协议水平为65%,那么构建更准确的算法将非常困难。


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