我正在尝试开发一个文本分类器,将一段文本分类为私有或公共。以医疗或健康信息为例。我能想到的典型分类器将关键字视为主要区分,对吧?像波纹管这样的场景怎么样?如果两个文本包含相似的关键字但具有不同的含义,该怎么办?
以下文章揭示了某人的私人(健康)情况(患者患有癌症):
我去过两个clinics
和我的pcp
。我有一个ultrasound
只被告知它是一个解决cyst
或hematoma
,但它变得越来越大,并开始使我的腿ache
。 PCP
说它不能是cyst
因为它开始太大而且我发誓我从来没有injured
我的腿,甚至不是bump
。我现在害怕和害怕cancer
。只有在大约9个月前蹲下时,我才注意到一种略微不舒服的感觉。 3个月前,我去蹲下来收拾衣物,它有点像hurt
。 pain
促使我检查我的leg
,那是当我注意到我的小腿lump
底部有一个muscle
并且弯曲只使它更明显。最终在四次clinic
访问后,ultrasound
和一个pcp
结果似乎是积极的,质量越来越大。
[私人](正确分类)
以下文字是医生的评论,绝对不是透露健康状况。它介绍了典型分类器模型的弱点:
不要害怕,不要假设像cancer
一样坏。我在我的clinic
中经历了几个案例,我觉得它很熟悉。正如你所提到的那样它可能是一个cyst
或hematoma
而且它越来越大,它必须需要一些额外的diagnosis
,如biopsy
。在该区域有ache
或lump
的大小并没有真正告诉任何bad
。你应该访问专门的clinics
几次,并在biopsy
变得更大之前进行一些特定的测试,如CT scan
,pcp
,ultrasound
和lump
。
[私人](哪个是错误的分类。应该是[公开])
由于显而易见的原因,我的所有当前分类器都将第二段归类为私有。类似的关键词,有效的单词序列,主题的存在似乎使分类器非常困惑。甚至,这两个内容都包含I
,You
(Noun,Pronouns)等主题。我从Word2Vec到Doc2Vec,从Inferring意义到语义嵌入,但不能考虑最适合这个问题的解决方案。
任何想法,我应该以哪种方式处理分类问题?提前致谢。
迄今取得的进展: 我从公共渠道收集的数据中,患者/受害者通常会发布自己的情况,医生/祝福者回复这些数据。我假设爬行是 - 帖子属于我的私人课程,评论属于公共课程。总而言之,我开始使用5K + 5K帖子/评论,并且使用朴素的贝叶斯分类器获得了大约60%,而没有任何重大的预处理。我很快就会尝试神经网络。但是在进入任何分类器之前,我只想知道如何更好地预处理以便为两个类别提供合理的权重以便更好地区分。
如果您发布的数据代表您要分辨的类,则基于关键字的功能可能不是最有效的。看起来有些术语有时会被视为停用词,这将是非常好的线索,关于什么是私人,什么是公共。
你提到代词,我认为这可能仍然是一个很好的途径。如果您使用的是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"
}
]
},
Public语句还包含一个带有恐惧标记的句子,但它没有得到高度评分,伴随着其他注释,并且在句子中包含明确的否定。因此,将这些作为功能也可能是值得的。
"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"
}
]
},
这些只是模糊地描述,因为整个过程是特定于任务的。您可能希望看一下这些并获取一些灵感。
很少有可能对你有帮助的快点:
我假设你目前的代表是Bag Of Words或TF-IDF。如果你还没有尝试过第二个,我建议你在深入研究更复杂(或者是它)之前做些什么。你可以用sklearn的TfidfVectorizer轻松完成。
如果结果不令人满意(并且您尝试过Random Forest / xgboost(或类似于Microsoft的LightGBM),那么您应该继续使用语义表示。
正如你所提到的,有一个由word2vec或Doc2Vec算法创建的表示(我会留下第二个,它可能没有帮助)。
您可能希望将您的示例分成句子并添加像<eos>
这样的标记来表示句子,它可能有助于神经网络学习。
另一方面,还有其他一些可能更适合您的任务,如BERT。这个是依赖于上下文的,意味着令牌I
将根据它周围的单词表示略有不同(因为这种表示是可训练的,它应该很好地适合你的任务)。
如果您希望使用PyTorch,Flair library可以很好地直观地解决这个问题。如果你在Tensorflow方面,他们有Tensorflow Hub,它也有容易使用的最先进的嵌入式。
如果涉及到神经网络,则从简单的循环模型分类器开始,并使用GRU或LSTM单元(取决于选择的框架,它们的语义略有不同)。
如果这种方法仍然不能令人满意,你应该查看Attention Networks,Hierarchical Attention Networks(每个句子一个注意级别,整个文档的另一个注意级别)或基于卷积的方法。
这些方法将花费您一段时间并跨越相当多的主题供您尝试,这些(或更多)的组合将可能与您的任务很好地协作。
(1)贝叶斯确实是一个弱分类器 - 我会尝试SVM。如果您看到改进,那么使用神经网络(也许是深度学习)可以实现进一步的改进
(2)特征工程 - 使用TFiDF,并尝试其他的东西(很多人建议使用Word2Vec,虽然我亲自尝试过并且没有改进)。你也可以删除停用词。
有一点需要考虑,因为你给出两个轶事就是客观地衡量人类对任务的一致程度。有时会忽略两个给同一文本的人在标签上不一致(有些人可能会说某个特定文件是私密的,尽管它是公开的)。只需注意一点 - 因为,例如,一致性水平为65%,那么构建更准确的算法将非常困难。