最近项目中需要实现类似如下的一个工单需求:
怎么电梯又坏了,这个月都坏了多少次了? -> 一级应急安全 / 电梯维修
即根据一段文本将其划分了多级的分类,而这些分类具有层次化。结果发现这是NLP中一个难点与热点问题,即Hierachical (multi-label) text classification(HMC),层次多标签分类任务。
对于这个问题,可以使用NeuralNLP-NeuralClassifier中的方案解决。
下面我们通过StructBERT及二郎神大模型来实现类似的效果。
from transformers import pipeline
from transformers import AutoModelForSequenceClassification, AutoTokenizer
model_checkpoint = "StructBERT"
classifier = pipeline("zero-shot-classification",model_checkpoint)
text = "昨天下的单今天就发货了,速度超快!但收到后发现耳机左耳没声音,联系客服说要寄回检测,流程太麻烦。"
candidate_labels = [
["[情感]正面","[情感]负面","[情感]中性"],
["[主题]物流","[主题]新闻","[主题]质量","[主题]售后","[主题]科技","[主题]娱乐","[主题]饮食"]
]
result = classifier(
text,
candidate_labels=candidate_labels,
hypothesis_template="这段文本属于{}类别。",
)
scores_dict = dict(zip(result['labels'], result['scores']))
max_labels = {}
for k,v in scores_dict.items():
start = k.find("[")
end = k.find("]")
t = k[start:end+1]
if t in max_labels:
score = max_labels[t][1]
if v > score:
max_labels[t] = (k[end+1:], v)
else:
max_labels[t] = (k[end+1:],v)
print("文本: {}\n".format(text))
for k,v in max_labels.items():
print(k,v[0])
其结果类似如下: