我正在将输入的句子分类到不同的类别。 如时间、距离、速度、位置等
我使用MultinomialNB.
训练了分类器
分类器主要考虑tf
作为特征,我也尝试考虑句子结构(使用 1-4 克(
使用multinomialNB
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中的词义消歧
但这里的问题是识别句子中的主要单词,每个句子都不同。
POS
(给出 NN,JJ,哪个句子不依赖(,NER
(高度依赖大写,有时 ner 也没有歧义词,如上面句子中的"早期"、"成本"(我已经尝试过了,它们都没有帮助。
**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%。结果有时是无关紧要的类。取决于查询如何与 dataset
试图纯粹通过断章取义地查看单个单词来推断语义不会让你走得太远。 在你的"手表"例子中,唯一真正表明你有"金钱"语义的术语是你希望消除歧义的术语。 作为人类读者,句子中还有哪些其他信息可以帮助您得出该结论?您将如何模拟这些知识? (传统的答案是关于你认为手表是有价值的物品,或者类似的东西。
话虽如此,您可能希望将 Wordnet synset 视为可能有用的抽象。 至少你可以说"成本"、"价格"和"价值"在某种程度上是相关的,但我想你已经计算出的单词级统计数据表明它们并不完全同义,你看到的变化基本上解释了这一事实(尽管你的输入大小听起来有点小,无法充分涵盖单个单词形式的使用模式的差异(。
另一个提示可以通过词性注释提供。 如果你知道"价值"被用作名词,那(至少在我看来(将含义缩小到"金钱说话",而动词阅读则不那么具体地以金钱为导向("我们重视你的投入"等(。 在您的其他示例中,很难看出它是否有帮助。 也许您可以使用 POS 注释的输入进行快速实验,看看它是否会产生有用的差异。 (但是POS并不总是能够正确推断,原因与您现在遇到问题的原因大致相同。
您作为示例显示的句子都非常简单。 为一小部分英语编写一个受限的解析器并不难,如果你知道你的输入通常会被限制在简单的问题上,没有模态辅助等,你实际上可以开始尝试在语法上理解输入。
(顺便说一句,我不确定"我怎么能去孟买"是"礼仪",如果它是语法的话。 严格来说,这里应该有从句词序。 我大致理解为"为什么我可以去孟买?
你的结果"完全取决于单词的出现",因为这是你的代码产生的功能。如果您觉得这种方法不足以解决您的问题,则需要决定需要提取哪些其他信息。将其表示为特征,即键值对,将它们添加到字典中,并像现在一样将它们传递给分类器。为了避免过度训练,您可能应该限制字典中包含的 ngram 数量;例如,只保留频繁的,或者包含您认为相关的某些关键字的关键字,或者其他什么。
我不太确定你所说的"距离、速度、位置、**等"是什么分类,但你提到了我认为用于这样的事情的大多数工具。如果它们不能让您满意,请考虑更具体的方式来检测可能相关的属性;然后将它们表示为特征,以便它们可以与您已经拥有的"词袋"特征一起为分类做出贡献。(但请注意,该领域的许多专家仅使用词袋方法即可获得可接受的结果(。
根据我到目前为止对问题性质的理解,我建议使用无监督分类方法,这意味着您必须使用一组分类规则。按照规则,我的意思是如果...然后。。。其他条件。这就是一些专家系统的工作方式。但是,为了增加对类似概念和同义词的理解,我建议您创建一个本体。本体是语义网的一个子概念。像你这样的问题通常通过使用语义网来解决,让它使用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% 的非常高的准确度。