问答中的意图分类

数据挖掘 机器学习 分类 nlp
2022-02-21 05:42:19

我正在尝试编写一个问答意图分类程序。

我的任务是一组未标记的问题和答案,我必须编写一个程序,我可以将所有类似的问题分组并确定它们的答案。

一旦完成了一组类似问题的答案,我必须确定答案的意图或重点。

例如,如果我有一组问题,例如:

a) Q: where is Texas? A : It is in USA.
b) Q: where is California? A: It is in USA.
c) Q: where is NASA? A: It is in USA.
d) Q: who is Queen Elizabeth II? A: Queen of England.
e) Q: who is Donald Trump? A : President of USA.

因此,我试图将问题 a、b 和 c 分组为面向位置的问题,将 d 和 e 分组为面向官员/人员的问题。

为了解决这个问题,

我正在尝试使用标准分类器,并且由于它将“它在美国”标识为类,因此我试图将其标记为“It/NA is/NA in/NA USA/LOC”以识别意图/答案的重点是位置。

我正在使用像朴素贝叶斯这样的标准分类器和基于标准隐马尔可夫模型的标记器。

结果或多或少都很好。我正在使用两个训练集,一个用于分类器,另一个用于标记。

如果任何一位受人尊敬的科学家可以建议我如何解决这个问题?

这里,Q 表示问题,A 表示答案。

为交叉发帖道歉

3个回答

我不知道意图的粒度。如果他们只是 Person/Loc/Official,为什么不使用疑问词(where、who、what 等)来识别意图?例如,“where”对应于“Loc”,“Who”对应于“Person”等。您也可以将其用作分类器中的特征。希望能帮助到你!!

您可以使用python nltk 中的命名实体识别。用于确定您的问题是否有 - 人、组织或地点。

from nltk import word_tokenize, pos_tag, ne_chunk

Q1 = "where is Texas ?"
A1 = "It is in USA."
Q2 = "where is California?"
A2 = "It is in USA"
Q3 = "where is NASA?"
A3 = "It is in USA."
Q4 = "who is Queen Elizabeth II?"
A4 = "Queen of England"
Q5 = "who is Donald Trump?"
A5 = "President of USA."

print(ne_chunk(pos_tag(word_tokenize(Q1))))
print(ne_chunk(pos_tag(word_tokenize(Q2))))
print(ne_chunk(pos_tag(word_tokenize(Q3))))
print(ne_chunk(pos_tag(word_tokenize(Q4))))
print(ne_chunk(pos_tag(word_tokenize(Q5))))

下面的代码输出

(S where/WRB is/VBZ ( PERSON Texas/NNP) ?/.)
(S where/WRB is/VBZ ( GPE California/NNP) ?/.)
(S where/WRB is/VBZ ( ORGANIZATION NASA/NNP) ?/.)
(S who/WP is/VBZ ( PERSON Queen/NNP Elizabeth/NNP II/NNP) ?/.)
(S who/WP is/VBZ ( PERSON Donald/NNP Trump/NNP) ?/.)

您可以根据个人或组织或位置对输出进行分组。另请注意,德克萨斯州在此处显示为人,因此所有答案都不会正确。但应该是一个好的开始。

您可以使用 Spacy 的命名实体识别。因为我觉得它的准确性很好,而且多处理方法也是可能的。

https://spacy.io/usage/linguistic-features#named-entities

import spacy
from statistics import mode

nlp = spacy.load("en_core_web_md")

Q1 = "where is Texas ?"
Q2 = "where is California?"
Q3 = "where is NASA?"
Q4 = "who is Queen Elizabeth II?"
Q5 = "who is Donald Trump?"

for i in range(1,6):
    doc= nlp(eval("Q"+str(i)))
    print("Class :",mode([ent.label_ for ent in doc.ents]))

输出:

Class : GPE
Class : GPE
Class : ORG
Class : PERSON
Class : PERSON

希望对开始有所帮助!