Text representations : How to differentiate between strings of similar topic but opposite polarities?
我一直在对某个语料库进行聚类,并通过获取它们的 tf-idf 来获得将句子组合在一起的结果,从 gensim 模型中检查相似性权重 > 某个阈值。
1 2 3 | tfidf_dic = DocSim.get_tf_idf() ds = DocSim(model,stopwords=stopwords, tfidf_dict=tfidf_dic) sim_scores = ds.calculate_similarity(source_doc, target_docs) |
问题在于,尽管设置了很高的阈值,但主题相似但极性相反的句子会聚集在一起:
Here is an example of the similarity weights obtained between"don't like it" &"i like it"
是否有任何其他方法、库或替代模型可以通过分配非常低的相似性或相反向量来有效区分极性?
这样输出"我喜欢它"和"不喜欢它"就在不同的集群中。
PS:如果有任何概念上的错误,请原谅我,因为我对 NLP 相当陌生。提前谢谢你!
问题在于您如何表示您的文档。 tf-idf 非常适合表示关键字起更重要作用的长文档。在这里,可能是 tf-idf 的 idf 部分忽略了极性,因为像 "no" 或 "not" 这样的负粒子会出现在大多数文档中,并且它们的权重总是很低。
我建议尝试一些可能捕获极性的神经嵌入。如果您想继续使用 Gensim,可以尝试 doc2vec,但您需要大量的训练数据。如果您没有太多数据来估计表示,我会使用一些预训练的嵌入。
甚至平均词嵌入(您可以在 Gensim 中加载 FastText 嵌入)。或者,如果您想要更强大的模型,可以尝试 BERT 或 Transformers 包中的其他大型预训练模型。
不幸的是,仅仅基于词组的简单文本表示并不能很好地区分这种由语法驱动的意义反转。
该方法需要对有意义的短语和分层的、语法驱动的词间依赖关系敏感,以便对其进行建模。
使用卷积/循环技术的更深层次的神经网络做得更好,或者使用树模型句子结构的方法。
有关想法,请参见例如...
"情感树库上语义组合性的递归深度模型"
...或更新的摘要演示文稿...
"语言表示:从词嵌入到句子意义"