我正在尝试使用Spacy构建NLP系统,但我在格式化训练数据时遇到了麻烦。我希望我的应用程序能够识别实体和意图。例如,在“我想订购披萨”这句话中,意图是“place_order”,实体是披萨。我该如何在Spacy中为实体和意图同时格式化训练数据呢?
回答:
这取决于你如何将问题定义为NLP挑战。你可以尝试使用命名实体识别器来识别像“披萨”这样的实体,但要注意,这个模型主要是为真正的命名实体设计的——即那些在现实世界中指代唯一实体的命名实体,比如伦敦或谷歌。
尽管如此,我们已经看到NER模型在非命名实体上也表现得相当不错。你可以按照这里的训练指南来格式化你的数据,像这样:
TRAIN_DATA = [ ("Who is Shaka Khan?", {"entities": [(7, 17, "PERSON")]}), ("I like London and Berlin.", {"entities": [(7, 13, "LOC"), (18, 24, "LOC")]}),]
对于“披萨”这样的实体,另一种可能的方法是基于规则的匹配/词典查找,这取决于你预期的种类有多大。你可以在Spacy中找到更多关于基于规则的匹配策略的信息,这里。请注意,这种方法不需要训练数据,但你需要仔细设计规则。
对于“意图”,你也有几种选择。你可以将其视为一个NER挑战来查找动词短语“place an order”,但同样要注意这不是一个真正的命名实体。或许更好的方法是将其视为文本分类挑战,并为整个句子预测“意图”标签。你可以在这里找到关于文本分类的文档,数据格式需要是一个字典,每个潜在标签得到一个1.0
或0.0
:
TRAIN_DATA = [ ("I'm so happy.", {"cats": {"POSITIVE": 1.0, "NEGATIVE": 0.0}}), ("I'm so angry", {"cats": {"POSITIVE": 0.0, "NEGATIVE": 1.0}}),]
最后,一个更复杂的方法是使用依赖解析器进行意图分类,参见这里的代码示例。虽然这看起来开始起来更困难,并且为其标注数据也更复杂,但它也可能是最强大的选项。