词义在分类中消除歧义

时间:2014-12-11 10:40:53

标签: machine-learning scikit-learn classification nltk word-sense-disambiguation

我将输入句子分类为不同的类别。喜欢时间,距离,速度,位置等

我使用MultinomialNB.

训练了分类器

分类器主要考虑tf作为特征,我也尝试考虑句子结构(使用1-4克)

multinomialNBalpha = 0.001一起使用,这是少数查询的结果

what is the value of Watch
{"1": {"other": "33.27%"}, "2": {"identity": "25.40%"}, "3": {"desc": "16.20%"}, "4": {"country": "9.32%"}}
what is the price of Watch
{"1": {"other": "25.37%"}, "2": {"money": "23.79%"}, "3": {"identity": "19.37%"}, "4": {"desc": "12.35%"}, "5": {"country": "7.11%"}}
what is the cost of Watch
{"1": {"money": "48.34%"}, "2": {"other": "17.20%"}, "3": {"identity": "13.13%"}, "4": {"desc": "8.37%"}} #for above two query also result should be money
How early can I go to mumbai
{"1": {"manner": "97.77%"}}  #result should be time
How fast can I go to mumbai
{"1": {"speed": "97.41%"}}
How come can I go to mumbai
{"1": {"manner": "100.00%"}}
How long is a meter
{"1": {"period": "90.74%"}, "2": {"dist": "9.26%"}}  #better result should be distance

在考虑multinomialNW(1-4)

的情况下使用ngram
what is the value of Watch
{"1": {"other": "33.27%"}, "2": {"identity": "25.40%"}, "3": {"desc": "16.20%"}, "4": {"country": "9.32%"}}
what is the price of Watch
{"1": {"other": "25.37%"}, "2": {"money": "23.79%"}, "3": {"identity": "19.37%"}, "4": {"desc": "12.35%"}, "5": {"country": "7.11%"}}
what is the cost of Watch
{"1": {"money": "48.34%"}, "2": {"other": "17.20%"}, "3": {"identity": "13.13%"}, "4": {"desc": "8.37%"}}   # for above two query also result should be money
How early can I go to mumbai
{"1": {"manner": "97.77%"}}  #result should be time
How fast can I go to mumbai
{"1": {"speed": "97.41%"}}
How come can I go to mumbai
{"1": {"manner": "100.00%"}}
How long is an hour
{"1": {"dist": "99.61%"}}   #result should be time

所以结果完全取决于单词的出现。有没有办法在这里添加消除歧义(或其他任何可以理解的方式)?

我已经检查了Word sense disambiguation in NLTK Python

但是这里的问题是确定句子中的主要词,每个句子都有所不同。

POS(给NN,JJ,哪个句子不依赖),NER(高度依赖于大写,有时ner也没有消除歧义,像#34;早期" "费用"在上面的句子中)我已经尝试过,但没有一个有帮助。

**How long some times cosidered as time or distance. So based on sentence near by words, it should able to able understand what it is. Similarly for "how fast, "how come" "how early" [how + word] should be understable** 

我正在使用nltk,scikit learn,python

更新:

  • 40个班级(每个班级都有该班级的句子)
  • 总数据300 Kb

准确性取决于查询。有时非常好> 90%。因此有时无关的课程。取决于查询如何与数据集匹配

3 个答案:

答案 0 :(得分:1)

根据我对目前问题性质的理解,我建议使用无监督的分类方法,这意味着您必须使用一组规则进行分类。按规则我的意思是......然后......其他条件。这是一些专家系统的工作方式。但是,为了增加对类似概念和同义词的理解,我建议你创建一个ontolgy。本体是语义Web的子概念。诸如你的问题通常通过使用语义网来解决,让它使用RDF方案或本体。您可以详细了解语义网here和本体here。我对你的建议不是要深入研究这些领域,而只是学习一般的高级想法,然后在文本文件中编写自己的本体(避免使用任何工具来构建本体,因为他们需要付出太多努力而你的问题很容易,不需要那么努力)。 现在,当你在网上搜索时,你会发现一些已经存在的本体,但在你的情况下,最好写一个你自己的小本体,用它来建立一套规则,你很高兴。

关于此类数据的解决方案(使用NB)的一个注意事项是,您可能只会遇到过度问题,导致某些查询的准确性较低,某些查询的准确度较高。我认为最好避免使用有监督的学习来解决这个问题。如果您有其他问题,请告诉我。

编辑1:在此编辑中,我想详细说明上述答案: 假设您想构建一个无监督的分类器。您当前拥有的数据可以分为大约40个不同的类。因为数据集中的句子已经以某种方式限制和简单,您可以通过基于一组规则对这些句子进行分类来完成此操作。让我告诉你我的意思。假设数据集中的随机句子保存在变量sentence中:

if sentence contains "long":
    if it also contains "meter":
         print "it is distance"
    elif ...
    .
    .
    .
    else:
         print "it is period"
if sentence contains "fast":
    print "it is speed or time"
if sentence contains "early":
         print "it is time"

所以你明白了我的意思。如果您以这种方式构建一个简单的分类器,并使其尽可能精确,您可以轻松达到几乎100%的总体精度。现在,如果您想要自动化一些复杂的决策制定,您需要一种知识库,我将其称为本体。如果在文本文件中你有类似的东西(我用简单的英语写它只是为了使它易于理解;你可以用简洁的编码方式编写它,它只是一个例子来向你展示我的意思):

"Value" depends 60% on "cost (measured with money)", 20% on "durability (measured in time)", 20% on "ease of use (measured in quality)"

然后,如果你想测量值,你已经有了一个公式。您应该根据您的数据决定是否需要这样的公式。或者,如果您想保留同义词列表,可以将它们作为文本文件并交替替换它们。 以我提到的方式对40个类的分类器的整体实现需要几天,并且由于所使用的方法非常确定,因此您注定要达到高达100%的非常高的准确度。

答案 1 :(得分:1)

试图纯粹通过查看脱离上下文的单个单词来推断语义并不会让你走得太远。在你的"手表"例子,这个唯一的术语实际上表明你有"钱"语义是你希望消除歧义的。作为人类读者,句子中有哪些其他信息可以帮助您得出结论?你会如何模拟这些知识? (一个传统的答案会推断你将手表视为有价值的物品,或类似的东西。)

话虽如此,您可能希望将Wordnet同义词视为可能有用的抽象。至少你可以说"成本","价格"和"价值"以某种方式相关,但我想你已经计算过的单词级统计数据表明它们并不完全是同义词,你看到的变化基本上就是这个事实的原因(虽然你的输入大小听起来很小,足以覆盖使用模式的变化对于单个单词形式)。

可以通过词性注释提供另一个提示。如果你知道"价值"用作名词,(在我看来,至少)将意义缩小到"金钱谈话",而动词阅读则不那么具体地以金钱为导向("我们重视你的输入" 34;等)。在你的其他例子中,很难看出它是否会有所帮助。也许您可以使用POS注释输入进行快速实验,看看它是否有用。 (但是POS并不总是能够正确推断出来,原因与你现在遇到问题的原因相同。)

你作为例子展示的句子都很简单。如果你知道你的输入通常会被限制在没有模态辅助的简单问题上,那么为一小部分英语写一个受限制的解析器并不是很难实际开始尝试用语法来理解输入。等

(顺便说一句,我不确定"我怎么能去孟买"是"方式",如果它完全是语法的话。严格来说,你应该有这里的从属条款词顺序。我会理解它大致意思是"为什么我可以去孟买?")

答案 2 :(得分:1)

你的结果"完全取决于单词出现"因为这是您的代码产生的功能。如果您认为此方法不足以解决您的问题,则需要确定需要提取的其他信息。将其表示为要素,即作为键值对,将它们添加到字典中,然后将它们完全按照现在的方式传递给分类器。为了避免过度训练,你应该限制你在字典中包含的ngram数量;例如,只保留频繁的,或包含您认为相关的某些关键字的那些,或其他。

我不太清楚你的意思是什么分类"距离,速度,位置,**等等,但是你已经提到了大多数工具我和#34; d想要用于这样的事情。如果他们没有让您满意,请考虑更具体的方法来检测可能相关的属性;然后将它们表达为特征,这样它们就可以随着词语和#34;你已经拥有的功能。 (但请注意,该领域的许多专家只使用词袋方法获得了可接受的结果。)