2.2 识别对话行为类型

处理对话时,将对话看作说话者执行的 行为 是很有用的。对于表述行为的陈述句这种解释是最直白的,例如”I forgive you”或”I bet you can’t climb that hill”。但是问候、问题、回答、断言和说明都可以被认为是基于语言的行为类型。识别对话中言语下的对话行为是理解谈话的重要的第一步。

NPS 聊天语料库,在1中的展示过,包括超过 10,000 个来自即时消息会话的帖子。这些帖子都已经被贴上 15 种对话行为类型中的一种标签,例如“陈述”,“情感”,“yn 问题”和“Continuer”。因此,我们可以利用这些数据建立一个分类器,识别新的即时消息帖子的对话行为类型。第一步是提取基本的消息数据。我们将调用xml_posts()来得到一个数据结构,表示每个帖子的 XML 注释:

  1. >>> posts = nltk.corpus.nps_chat.xml_posts()[:10000]

下一步,我们将定义一个简单的特征提取器,检查帖子包含什么词:

  1. >>> def dialogue_act_features(post):
  2. ... features = {}
  3. ... for word in nltk.word_tokenize(post):
  4. ... features['contains({})'.format(word.lower())] = True
  5. ... return features

最后,我们通过为每个帖子提取特征(使用post.get('class')获得一个帖子的对话行为类型)构造训练和测试数据,并创建一个新的分类器:

  1. >>> featuresets = [(dialogue_act_features(post.text), post.get('class'))
  2. ... for post in posts]
  3. >>> size = int(len(featuresets) * 0.1)
  4. >>> train_set, test_set = featuresets[size:], featuresets[:size]
  5. >>> classifier = nltk.NaiveBayesClassifier.train(train_set)
  6. >>> print(nltk.classify.accuracy(classifier, test_set))
  7. 0.67