文本分类超出了关键字的依赖性,并推断出实际含义

时间:2019-03-04 22:00:24

标签: python nlp text-classification natural-language-processing

我正在尝试开发一种文本分类器,该文本分类器会将一段文本分类为私人公共。以医疗或健康信息为例。我可以想到的典型分类器将关键字视为主要的区分符,对吗?像波纹管这样的场景呢?如果两条文本都包含相似的关键字但含义不同,该怎么办。

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

我去过两个clinics和我的pcp。我遇到ultrasound只是被告知是解决方案cysthematoma,但它越来越大,开始使我的腿achePCP说它不可能是cyst,因为它起步太大了,我发誓我的脚永远没有injured,甚至没有bump。我现在很害怕和害怕cancer。仅在大约9个月前蹲下时,我才感到有点不适。 3个月前,我蹲下来收拾衣物,有点hurtpain促使我检查自己的leg,也就是当我在小腿lump的底部注意到一个muscle时,弯曲才使它更加引人注目。最终,经过四次clinic访问,一次ultrasound和一个pcp访问之后,结果似乎是肯定的,并且访问量正在增加。
[私人](正确分类)

以下文字是医生的评论,绝对没有透露健康状况。它介绍了典型分类器模型的弱点:

别害怕,不要以任何坏事来形容cancer。我在clinic中经历了几种情况,这对我来说似乎很熟悉。正如您所提到的,它可能是cysthematoma,并且越来越大,它必须需要一些额外的diagnosis,例如biopsy。在该区域中拥有achelump的大小并不能真正说明bad。您应该再访问几次专门的clinics,然后在biopsy之前接受一些特定的测试,例如CT scanpcpultrasoundlump变得更大。
[私人](分类错误。应为[公开])

出于显而易见的原因,第二段被我目前所有的分类者都归类为私有。类似的关键字,有效的单词序列,主题的出现似乎使分类器非常混乱。甚至,这两个内容都包含IYou(名词,代词)之类的主题。我从Word2Vec到Doc2Vec,从推断含义到语义嵌入都想到过,但无法考虑解决方案最适合这个问题的人。

任何想法,我应该以哪种方式处理分类问题?提前致谢。

到目前为止的进展:
我从公开来源收集的数据,患者/受害者通常会发布自己的情况,医生/好心人会对此做出回应。我假设爬网时-帖子属于我的私人班级,而评论属于公共班级。到目前为止,我都是从5K + 5K帖子/评论开始的,使用朴素的贝叶斯分类器无需任何主要预处理就可以达到60%左右。我将尽快尝试神经网络。但是,在输入任何分类器之前,我只想知道如何更好地进行预处理,以便为每个分类分配合理的权重,从而更好地进行区分。

3 个答案:

答案 0 :(得分:3)

如果您发布的数据代表您要区分的类,则基于关键字的功能可能不是最有效的。看起来有些有时被视为停用词的术语将是关于什么是私有和什么是公共的很好的线索。

您提到代词,我认为这可能仍然是一个很好的途径。如果您使用的是unigram / word-of-words类型的功能,请确保您的矢量化程序没有删除它们。

对第一人称代词(ImyI'vemine的实例进行计数得出,私人情况下为13,公共情况下为2。

Public示例具有第二人称代词(例如you),而第一个示例则没有。因此,也许第一人称代词和第二人称代词的计数或平滑比率的特征会有效。

如果您具有句法结构或通过n-gram或类似表示形式跟踪位置信息,则涉及第一人称代词和关键字的功能可能会有效。

动词初始句结构(Don't be ...Having an...)是第二人称定向语言的特征,在公共场合可能比在私人文本中出现更多。

最后一个推测性思维:这两个段落的观点截然不同,因此,如果您可以进行观点分析,则可能会提供其他提示。我希望公共课比私人课更加中立。

将您的Public示例放入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"
        }
      ]
    },

答案 1 :(得分:2)

由于整个过程是特定于任务的,因此仅对它们进行了模糊描述。您可能想看看这些并从中获得一些启发。

一般提示

  • 从更简单的模型开始(如您正在做的那样),如果结果不令人满意,则逐渐增加其复杂性。您可能需要尝试使用知名的Random Forest和xgboost,然后再转向神经网络

数据提示

以下几点可能对您有所帮助:

  • 您没有太多的数据点。如果可能的话,我建议您从相同(或至少非常相似)的源/分发中收集更多数据,这对您有最大的帮助。
  • 改进数据的表示方式(以下更多详细信息),第二/第一最佳选择。
  • 您可以尝试词干/词形分解(来自nltkspaCy,但在这种情况下我认为这不会有所帮助,可能会忽略掉它。

数据表示

我假设您当前的代表是Bag Of WordsTF-IDF。如果您还没有尝试过第二种方法,那么我建议您在研究更复杂的(或者是?)之前,先尝试一下。您可以使用sklearn的TfidfVectorizer轻松做到这一点。

如果结果不令人满意(并且您尝试了Random Forest / xgboost(或类似Microsoft的LightGBM之类的方法),那么我认为应该继续进行语义表示。

语义表示

正如您所提到的,有一个由word2vec或Doc2Vec算法创建的表示形式(我将保留第二个,这可能无济于事)。

您可能希望将示例分成句子,并添加诸如<eos>之类的标记来表示句子,这可能有助于神经网络学习。

另一方面,还有其他一些,例如 BERT 可能更适合您的任务。这是与上下文相关的,这意味着令牌I会根据其周围的单词而略有不同(由于这种表示形式是可训练的,因此很适合您的任务)。

Flair library为您解决PyTorch问题提供了一种很好而直观的方法。如果您位于Tensorflow一侧,则它们具有Tensorflow Hub,并且还具有用于嵌入的最新技术。

神经网络

如果涉及到神经网络,请从简单的递归模型分类器开始,并使用GRU或LSTM单元(取决于选择的框架,它们的语义有所不同)。

如果该方法仍然不能令人满意,则应查看Attention Networks,分层注意力网络(每个句子一个注意力级别,整个文档中另一个注意力级别)或基于卷积的方法。

这些方法将花费您一段时间,并涉及许多主题供您尝试,这些(或更多)的组合可能会很好地完成您的任务。

答案 2 :(得分:-2)

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

(2)功能工程-使用TFiDF并尝试其他方法(很多人建议使用Word2Vec,尽管我亲自尝试过并没有改善)。您也可以删除停用词。

要考虑的一件事,因为您给出了两个轶事,目的是客观地衡量人与人之间在任务上的共识程度。有时被忽视的是,两个给出相同文本的人可能会在标签上存在分歧(有人可能会说特定文件是私人的,尽管它是公共的)。只是要注意一点-因为例如协议级别为65%,那么构建更准确的算法将非常困难。