9

我正在尝试开发一个文本分类器,它将一段文本分类为PrivatePublic。以医疗或健康信息为例。我能想到的典型分类器将关键字视为主要区分器,对吗?像下面这样的场景呢?如果两段文本都包含相似的关键字但具有不同的含义怎么办?

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

我去过两个clinics和我的pcp。我ultrasound只有一个被告知它是一个解决方案cyst或一个hematoma,但它变得越来越大并且开始使我的腿achePCP说它不可能是cyst因为它开始太大了,我发誓我从来没有我injured的腿,甚至没有bump。我现在又害怕又害怕cancer。大约 9 个月前,我只有在蹲下时才注意到一种轻微的不适感。3个月前,我蹲下来收拾衣物,这有点像hurt。这pain促使我检查我的leg,那是当我注意到lump我的小腿底部有一个muscle并且弯曲只会让它更加明显。最终经过四次clinic访问,一个ultrasound和一个pcp结果似乎是积极的,而且质量越来越大。
[私人](正确分类)

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

不要害怕,也不要假设有什么不好的cancer。我经历过几个案例,对我clinic来说似乎很熟悉。正如您所提到的,它可能是 acyst或 ahematoma并且它越来越大,它必须需要一些额外的东西diagnosis,例如biopsy. 在那个区域有一个ache或 的大小lump并不能说明任何事情bad。您应该clinics多访问几次专业并进行一些特定的测试,例如,biopsy和在此之前变得更大。[私人](这是错误的分类。应该是[公共])CT scanpcpultrasoundlump

出于显而易见的原因,我目前所有的分类器都将第二段归类为私有。相似的关键词、有效的词序列、主题的存在似乎让分类器非常混乱。甚至,这两个内容都包含诸如IYou(名词,代词)等主题。我从 Word2Vec 到 Doc2Vec,从推断含义到语义嵌入,但想不出最适合这个问题的解决方法。

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

迄今为止的进展:
我从公共来源收集的数据,患者/受害者通常会发布自己的情况,医生/好心人会回复这些数据。我假设在爬行时 - 帖子属于我的私人课程,评论属于公共课程。总的来说,我从 5K+5K 的帖子/评论开始,并在没有任何主要预处理的情况下使用朴素贝叶斯分类器获得了大约 60%。我很快就会尝试神经网络。但在输入任何分类器之前,我只想知道如何更好地进行预处理,以便为任一类赋予合理的权重,以便更好地区分。

4

3 回答 3

3

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

你提到代词,我认为这可能仍然是一个很好的前进道路。如果您使用的是 unigram/bag-of-words 类型的功能,请确保您的矢量化器没有删除它们。

计算第一人称代词 ( 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"
        }
      ]
    },
于 2019-03-13T13:24:18.443 回答
2

这些只是模糊的描述,因为整个过程是特定于任务的。不过,您可能想看看这些并从中汲取灵感。

一般提示

  • 从更简单的模型开始(正如您似乎正在做的那样),如果结果不令人满意,逐渐增加它们的复杂性。在转向神经网络之前,您可能想尝试著名的随机森林和xgboost

数据提示

几个可能对您有所帮助的要点:

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

数据表示

我假设您当前的表示是Bag Of WordsTF-IDF。如果您还没有尝试过第二个,我建议您在深入研究更复杂的(或者是吗?)的东西之前先做。您可以使用 sklearn 的TfidfVectorizer轻松完成。

如果结果不令人满意(并且您已经尝试过 Random Forest/xgboost(或类似Microsoft 的LightGBM),我认为您应该继续使用语义表示。

语义表示

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

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

另一方面,还有其他一些可能更适合您的任务,例如BERT。这个是上下文相关的,这意味着一个标记的表示I会根据它周围的单词而略有不同(因为这种表示是可训练的,它应该很适合你的任务)。

如果您想使用 PyTorch,Flair 库提供了很好且直观的方法来解决这个问题。如果你在 Tensorflow 方面,他们有Tensorflow Hub,它也有最先进的嵌入供你轻松使用。

神经网络

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

如果这种方法仍然不能令人满意,你应该看看Attention Networks、Hierarchical Attention Networks(每个句子一个注意力级别,整个文档另一个注意力级别)或基于卷积的方法。

这些方法将花费您一段时间并涵盖相当多的主题供您尝试,其中一种(或更多)组合可能会很好地完成您的任务。

于 2019-03-07T22:18:30.180 回答
-2

(1) 贝叶斯确实是一个弱分类器——我会尝试支持向量机。如果您看到改进,则可以使用神经网络(也许还有深度学习)来实现进一步的改进

(2) 特征工程 - 使用 TFiDF ,并尝试其他的东西(很多人建议 Word2Vec,虽然我个人尝试并没有改善)。您也可以删除停用词。

需要考虑的一件事,因为您给出了两个轶事,是客观地衡量人类对任务的一致程度。有时会忽略相同文本的两个人可能在标签上存在分歧(有些人可能会说特定文档是私有的,尽管它是公开的)。需要注意的一点——因为如果一致性水平是 65%,那么构建更准确的算法将非常困难。

于 2019-03-12T07:02:44.043 回答