2

我将输入句子分类为不同的类别。比如时间、距离、速度、位置等

我训练分类器使用MultinomialNB.

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

使用multinomialNBwith alpha= 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考虑使用ngram(1-4)

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

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

我已经在 NLTK Python 中检查了 Word sense disambiguation

但这里的问题是识别句子中的主要单词,每个句子都不同。

POS(给出NN,JJ,哪个句子不依赖),NER(高度依赖大写,有时ner也不是像上面句子中的“early”,“cost”这样的歧义词)我已经尝试过了,它们都没有帮助。

**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%。有时结果是不相关的类。取决于查询与数据集的匹配方式

4

3 回答 3

1

您的结果“完全取决于单词的出现”,因为那是您的代码产生的那种功能。如果您觉得这种方法不足以解决您的问题,您需要决定还需要提取哪些其他信息。将其表达为特征,即键值对,将它们添加到您的字典中,然后像现在一样将它们传递给分类器。为避免过度训练,您可能应该限制字典中包含的 ngram 数量;例如,只保留频繁使用的关键字,或包含您认为相关的某些关键字的关键字,或其他。

我不太确定您所说的“距离、速度、位置、**等”是什么分类,但您已经提到了我认为可以用于此类事情的大多数工具。如果它们没有让您满意,请考虑更具体的方法来检测可能相关的属性;然后将它们表示为特征,以便它们与您已经拥有的“词袋”特征一起有助于分类。(但请注意,该领域的许多专家仅使用词袋方法即可获得可接受的结果)。

于 2014-12-13T14:24:59.397 回答
1

尝试纯粹通过脱离上下文查看单个单词来推断语义不会让你走得太远。在您的“手表”示例中,唯一真正表明您具有“金钱”语义的术语是您希望消除歧义的术语。作为人类读者,句子中还有哪些其他信息可以帮助您得出这个结论?您将如何对这些知识进行建模?(一个传统的答案是你认为手表是有价值的东西,或者类似的东西。)

话虽如此,您可能希望将 Wordnet 同义词视为一种可能有用的抽象。至少你可以说“成本”、“价格”和“价值”在某种程度上是相关的,但我想你已经计算出的词级统计表明它们不是完全同义的,你看到的变化基本上说明了对于这个事实(尽管您的输入大小听起来有点小,无法充分覆盖单个单词形式的使用模式差异)。

词性注释可以提供另一个提示。如果您知道“价值”被用作名词,那(至少在我看来)将含义缩小为“金钱谈话”,而动词阅读则不那么具体以金钱为导向(“我们重视您的投入”, ETC)。在您的其他示例中,很难看出它是否有帮助。也许您可以对带有 POS 注释的输入进行快速实验,看看它是否会产生有用的差异。(但是 POS 并不总是可以正确推断,原因与您现在遇到问题的原因大致相同。)

您作为示例显示的句子都相当简单。如果您知道您的输入通常会被限制为没有模态辅助的简单问题,那么为一小部分英语编写受限解析器并不难,您实际上可以开始尝试从语法上理解输入等等

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

于 2014-12-13T10:40:37.500 回答
1

根据我迄今为止对您问题性质的理解,我建议使用无监督分类方法,这意味着您必须使用一组规则进行分类。按照规则,我的意思是 if ... then ... else 条件。这就是一些专家系统的工作方式。但是,为了增加对类似概念和同义词的理解,我建议您创建一个本体。本体是语义网的一个子概念。像您这样的问题通常通过使用语义网来解决,让它使用 RDF 方案或本体。您可以在此处了解有关语义网的更多信息,并在此处了解有关本体的更多信息. 我给你的建议是不要太深入这些领域,只要学习一个通用的高级思想,然后在文本文件中编写自己的本体(避免使用任何工具来构建本体,因为它们太费力了并且您的问题很容易不需要那么努力)。现在,当您在网上搜索时,您会发现一些已经存在的本体,但在您的情况下,最好编写自己的小型本体,使用它来构建规则集,然后就可以开始了。

关于此类数据的解决方案(使用 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% 的非常高的准确率。

于 2014-12-12T12:39:19.777 回答