【python】bert 计算文章(句子)的相似度,QA问答系统

1,bert介绍
    google在2018年10月底公布BERT在11项NLP任务中的卓越表现后,已经超越了先前沿用的最先进的技术,基于transformer的BERT系列一经问世就在NLP领域掀起了一场风暴,整个ML界略有耳闻的模型。

安装

pip install bert-serving-server bert-serving-client 

2,bert启动
下载中文bert预训练模型,地址:https://github.com/google-research/bert,并解压

bert-serving-start -model_dir C:\Software\chinese_L-12_H-768_A-12 -num_worker=1 #-http_port 8001

3,python调用

>>> from bert_serving.client import BertClient
>>> bc = BertClient(ip='localhost') # port=8001
>>> result = bc.encode(['人工 智能','数据 挖掘'])
>>> result
array([[ 0.27618095,  0.4230312 , -0.09556088, ...,  0.10236761,
        -0.48159745,  0.18874753],
       [ 0.28339025,  0.25708374,  0.62269455, ..., -0.20779137,
        -0.60407466,  0.15836067]], dtype=float32)
>>> result.shape
(2, 768)

3, 自定义分词

>>> text = ['人工 智能','数据 挖掘']
>>> text2 = [s.split() for s in texts]
>>> text2
[['hello', 'world!'], ['good', 'day']]
>>> result2 = bc.encode(texts2, is_tokenized=True)
>>> result2
array([[ 0.35219502,  0.21457729,  0.26589656, ..., -0.01487671,
        -0.11359112, -0.13523291],
       [-0.01188059,  0.28070456, -0.26256776, ..., -0.18510768,
        -0.25552392, -0.17908268]], dtype=float32)
>>> result2.shape
(2, 768)

4,QA问答系统,相似度计算

# -*- coding: utf-8 -*-
import numpy as np
from bert_serving.client import BertClient

bc = BertClient(ip='localhost')
topk = 3

sentences = ['逍遥派掌门人无崖子为寻找一个色艺双全、聪明伶俐的徒弟,设下“珍珑”棋局,为少林寺虚字辈弟子虚竹误撞解开。',
             '慕容复为应召拒绝王语嫣的爱情;众人救起伤心自杀的王语嫣,后段誉终于获得她的芳心。',
             '鸠摩智贪练少林武功,走火入魔,幸被段誉吸去全身功力,保住性命,大彻大悟,成为一代高僧。',
             '张无忌历尽艰辛,备受误解,化解恩仇,最终也查明了丐帮史火龙之死乃是成昆、陈友谅师徒所为',
             '武氏与柯镇恶带着垂死的陆氏夫妇和几个小孩相聚,不料李莫愁尾随追来,打伤武三通',
             '人工智能亦称智械、机器智能,指由人制造出来的机器所表现出来的智能。',
             '人工智能的研究是高度技术性和专业的,各分支领域都是深入且各不相通的,因而涉及范围极广。',
             '自然语言认知和理解是让计算机把输入的语言变成有意思的符号和关系,然后根据目的再处理。']
sentences_vec = bc.encode(sentences)

test_vec = bc.encode(['自然语言处理与人工智能'])
score = np.sum(test_vec * sentences_vec, axis=1) / np.linalg.norm(sentences_vec, axis=1)
topk_idx = np.argsort(score)[::-1][:topk]
for idx in topk_idx:
    print('> %s\t%s' % (score[idx], sentences[idx]))

# 结果
> 17.430252	自然语言认知和理解是让计算机把输入的语言变成有意思的符号和关系,然后根据目的再处理。
> 17.190922	人工智能亦称智械、机器智能,指由人制造出来的机器所表现出来的智能。
> 16.570366	人工智能的研究是高度技术性和专业的,各分支领域都是深入且各不相通的,因而涉及范围极广。

你可能感兴趣的:(python)