Python 教你3分钟用Bert搭建问答搜索引擎

 

鼎鼎大名的 Bert 算法相信大部分同学都听说过,它是Google推出的NLP领域“王炸级”预训练模型,其在NLP任务中刷新了多项记录,并取得state of the art的成绩。

但是有很多深度学习的新手发现BERT模型并不好搭建,上手难度很高,普通人可能要研究几天才能勉强搭建出一个模型。

没关系,今天我们介绍的这个模块,能让你在3分钟内基于BERT算法搭建一个问答搜索引擎。它就是 bert-as-service 项目。这个开源项目,能够让你基于多GPU机器快速搭建BERT服务(支持微调模型),并且能够让多个客户端并发使用。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda:Python数据分析与挖掘好帮手—Anaconda,它内置了Python和pip.

(可选2) 此外,推荐大家用VSCode编辑器来编写小型Python项目:Python 编程的最好搭档—VSCode 详细指南

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),输入命令安装依赖:

pip install bert-serving-server  # 服务端
pip install bert-serving-client  # 客户端

请注意,服务端的版本要求:Python >= 3.5Tensorflow >= 1.10 。

此外还要下载预训练好的BERT模型,在 https://github.com/hanxiao/bert-as-service#install 上可以下载,如果你无法访问该网站,也可以在 bert-serving 模型及源代码 此处下载。

也可在Python实用宝典后台回复 bert-as-service 下载这些预训练好的模型。

下载完成后,将 zip 文件解压到某个文件夹中,例如 /tmp/uncased_L-24_H-1024_A-16/.

2.Bert-as-service 基本使用

安装完成后,输入以下命令启动BERT服务:

bert-serving-start -model_dir /tmp/uncased_L-24_H-1024_A-16/ -num_worker=4 

-num_worker=4 代表这将启动一个有四个worker的服务,意味着它最多可以处理四个并发请求。超过4个其他并发请求将在负载均衡器中排队等待处理。

下面显示了正确启动时服务器的样子:

使用客户端获取语句的编码

现在你可以简单地对句子进行编码,如下所示:

from bert_serving.client import BertClient
bc = BertClient()
bc.encode(['First do it', 'then do it right', 'then do it better'])

作为 BERT 的一个特性,你可以通过将它们与 |||(前后有空格)连接来获得一对句子的编码,例如

bc.encode(['First do it ||| then do it right'])

远程使用 BERT 服务

你还可以在一台 (GPU) 机器上启动服务并从另一台 (CPU) 机器上调用它,如下所示:

# on another CPU machine
from bert_serving.client import BertClient
bc = BertClient(ip='xx.xx.xx.xx')  # ip address of the GPU machine
bc.encode(['First do it', 'then do it right', 'then do it better'])

3.搭建问答搜索引擎

我们将通过 bert-as-service 从FAQ 列表中找到与用户输入的问题最相似的问题,并返回相应的答案。

FAQ列表你也可以在 Python实用宝典后台回复 bert-as-service 下载。

首先,加载所有问题,并显示统计数据:

prefix_q = '##### **Q:** '
with open('README.md') as fp:
    questions = [v.replace(prefix_q, '').strip() for v in fp if v.strip() and v.startswith(prefix_q)]
    print('%d questions loaded, avg. len of %d' % (len(questions), np.mean([len(d.split()) for d in questions])))
    # 33 questions loaded, avg. len of 9

一共有33个问题被加载,平均长度是9.

然后使用预训练好的模型:uncased_L-12_H-768_A-12 启动一个Bert服务:

bert-serving-start -num_worker=1 -model_dir=/data/cips/data/lab/data/model/uncased_L-12_H-768_A-12

接下来,将我们的问题编码为向量:

bc = BertClient(port=4000, port_out=4001)
doc_vecs = bc.encode(questions)

最后,我们准备好接收用户的查询,并对现有问题执行简单的“模糊”搜索。

为此,每次有新查询到来时,我们将其编码为向量并计算其点积 doc_vecs;然后对结果进行降序排序,返回前N个类似的问题:

while True:
    query = input('your question: ')
    query_vec = bc.encode([query])[0]
    # compute normalized dot product as score
    score = np.sum(query_vec * doc_vecs, axis=1) / np.linalg.norm(doc_vecs, axis=1)
    topk_idx = np.argsort(score)[::-1][:topk]
    for idx in topk_idx:
        print('> %s\t%s' % (score[idx], questions[idx]))

完成!现在运行代码并输入你的查询,看看这个搜索引擎如何处理模糊匹配:

完整代码如下,一共23行代码(在后台回复关键词也能下载):

import numpy as np
from bert_serving.client import BertClient
from termcolor import colored

prefix_q = '##### **Q:** '
topk = 5

with open('README.md') as fp:
    questions = [v.replace(prefix_q, '').strip() for v in fp if v.strip() and v.startswith(prefix_q)]
    print('%d questions loaded, avg. len of %d' % (len(questions), np.mean([len(d.split()) for d in questions])))

with BertClient(port=4000, port_out=4001) as bc:
    doc_vecs = bc.encode(questions)

    while True:
        query = input(colored('your question: ', 'green'))
        query_vec = bc.encode([query])[0]
        # compute normalized dot product as score
        score = np.sum(query_vec * doc_vecs, axis=1) / np.linalg.norm(doc_vecs, axis=1)
        topk_idx = np.argsort(score)[::-1][:topk]
        print('top %d questions similar to "%s"' % (topk, colored(query, 'green')))
        for idx in topk_idx:
            print('> %s\t%s' % (colored('%.1f' % score[idx], 'cyan'), colored(questions[idx], 'yellow')))

够简单吧?当然,这是一个基于预训练的Bert模型制造的一个简单QA搜索模型。

你还可以微调模型,让这个模型整体表现地更完美,你可以将自己的数据放到某个目录下,然后执行 run_classifier.py 对模型进行微调,比如这个例子:

https://github.com/google-research/bert#sentence-and-sentence-pair-classification-tasks

它还有许多别的用法,我们这里就不一一介绍了,大家可以前往官方文档学习:

https://github.com/hanxiao/bert-as-service

我们的文章到此就结束啦,如果你喜欢今天的 Python 教程,请持续关注Python实用宝典。

有任何问题,可以在公众号后台回复:加群,回答相应验证信息,进入互助群询问。

原创不易,希望你能在下面点个赞和在看支持我继续创作,谢谢!

给作者打赏,选择打赏金额
¥1¥5¥10¥20¥50¥100¥200 自定义

​Python实用宝典 ( pythondict.com )
不只是一个宝典
欢迎关注公众号:Python实用宝典

推荐一个非常优惠的QMT开户渠道

很多喜欢玩量化的同学都想要找一个靠谱且低费率能做自动化的券商。

我之前也推荐过一个渠道,但是因为他们公司内部问题,之前的那个开户渠道也遗憾下线了,今天给大家找到了一个新的渠道,费率如下:

有需要的或有任何疑问的可以直接联系我的微信: 83493903 (备注开户) 进行开通,或扫描二维码开户,有专业人士会跟进后续的开户和功能开通。

【AI试试水】关于美股Copart公司的走势预测

以下是二七阿尔量化的AI小机器人关于Copart公司的分析。

科帕特(Copart)是一家美国德克萨斯州达拉斯的在线车辆拍卖和再营销服务商,在北美、欧洲和中东都有业务。

[积极因素]:

  1. Copart最近的表现令人印象深刻,股价在2023年上涨了50%,显示出投资者对公司的强烈信心。
  2. 公司在2024财年第一季度实现了实质性的增长,收入和净利润大幅增长,表明公司正在扩大全球业务,并增加市场份额。
  3. 公司强大的财务指标,包括高每股息税前利润(EBIT)和正面的净利润率,表明公司盈利能力健康。
  4. 公司的高流动性,如快速比率所示,表明它有足够的资源来满足短期债务。

[潜在问题]:

  1. 公司高的负债与净资产比率和总负债与总资产比率表明存在大量债务,如果公司的现金流不足以支付利息费用,这可能成为一个问题。
  2. 公司高的存货周转率可能表明存货管理效率低下,可能导致更高的成本和较低的盈利能力。
  3. 公司高的应收账款周转率可能表明较长的收款周期,可能影响其流动性。

分析:基于积极的发展和潜在的担忧,我预测Copart(CPRT)的股价将在未来一周内上涨3-4%(从2023年11月17日到2023年11月24日)。公司强劲的财务表现和增长,以及高流动性,表明它是一个稳健的投资。然而,高负债水平和潜在的存货管理效率不足是可能影响公司盈利能力的潜在问题。

总体而言,公司最近的表现和未来的增长潜力表明它是一个强大的投资。然而,投资者应密切关注公司的债务水平和存货管理,以确保这些问题不会显现出来。在短期内,公司的股价预计将继续上升,受到强烈的市场情绪和公司基本面的推动。

 

股市市盈率分析:A股与美股之间的差异(附Python代码)

股市市盈率分析:A股与美股之间的差异

股市市盈率是衡量股票相对估值的重要指标之一。A股是中国的股票市场,而美股是美国的股票市场。尽管两国的股票市场都使用市盈率来评估股票的估值,但A股与美股之间存在着一些显著的差异。本文旨在分析这些差异的原因,并评估重要因素对A股与美股市盈率差异的影响。

股市市盈率分析:A股与美股之间的差异的原因分析

1. 经济发展水平

A股和美股所代表的经济发展水平存在差异,这是影响两者市盈率差异的重要因素之一。美国是全球最大的经济体之一,拥有发达的金融市场和大量的高科技企业,使得美股的市盈率相对较高。而A股市场相对较年轻,国内经济相对不发达,因此A股的市盈率普遍较低。

2. 法律法规差异

法律法规对股票市场的监管具有重要影响。美国的股票市场监管相对成熟,有严格的法律法规体系保护投资者权益,使得美股市盈率相对较高。相比之下,A股市场的监管相对较弱,法律法规体系仍在完善中,这导致了A股市盈率相对较低。

3. 投资者结构

A股和美股的投资者结构也是市盈率差异的一个重要原因。美股市场有大量的机构投资者,如养老基金、对冲基金等,这些机构投资者通常具有较高的投资能力和更长的投资周期,从而推高了市盈率。相比之下,A股市场的散户投资者占比较高,他们的投资能力和投资效用往往较低,因此A股的市盈率相对较低。

4. 市场流动性

市场流动性也是影响市盈率差异的重要因素之一。美股市场交易活跃,流动性较高,这使得市场能够更快地反应投资者的情绪和预期,从而推高了市盈率。与之相比,A股市场的流动性相对较低,交易活跃度不高,导致市盈率相对较低。

5. 市值结构差异

A股和美股的市值结构也对市盈率差异产生影响。美股市值较大的科技公司比例较高,而这些公司通常拥有较高的市盈率。相比之下,A股市场以制造业和金融业为主,这些行业的市盈率普遍较低,因此导致了A股的市盈率相对较低。

6. 财务质量和盈利能力

公司的财务质量和盈利能力也是影响市盈率差异的重要因素。美股市场上的公司普遍拥有较高的财务质量和盈利能力,从而使得市盈率相对较高。而A股市场上的公司财务质量和盈利能力相对较低,导致市盈率较低。

7. 技术驱动与传统产业比例

美股市场有较高比例的技术驱动型公司,而这些公司往往拥有较高的市盈率。相反,A股市场以传统产业为主导,这些行业的市盈率普遍较低,因此导致了A股的市盈率相对较低。

8. 宏观经济因素

宏观经济因素也会对市盈率差异产生影响。美国的宏观经济相对稳定,这使得美股市盈率相对较高。与之相比,中国的宏观经济相对不稳定,因此A股市盈率相对较低。

9. 盈利预期差异

不同投资者对未来盈利预期的差异也会影响市盈率差异。美股市场上的投资者普遍对公司未来盈利有较高的预期,从而推高了市盈率。而A股市场上的投资者对盈利预期较为保守,因此A股的市盈率相对较低。

10. 其他因素

除上述因素外,还有一些其他因素也会对A股与美股市盈率差异产生影响,如政策因素、人口因素等。

重要因素对A股与美股市盈率差异的影响评估

通过分析上述差异的原因,可以得出以下评估:

首先,经济发展水平是影响A股与美股市盈率差异的重要因素之一。随着中国经济的不断发展,A股市盈率有望逐渐提升。

其次,加强法律法规建设和市场监管是提高A股市盈率的关键。完善法律法规体系,保护投资者权益,将有助于提高A股市盈率。

此外,提升A股市场的流动性和吸引更多机构投资者参与也是提高A股市盈率的重要途径。加大市场宣传力度,改革市场交易机制,将有助于提高A股市盈率。

最后,提高公司财务质量和盈利能力,引入更多高科技企业,将有助于提高A股市盈率。

综上所述,A股与美股市盈率之间存在着多个因素的差异。通过深入分析这些差异的原因,我们可以更好地理解为什么A股与美股之间存在市盈率差异,并评估了重要因素对差异产生的影响。进一步改善A股市场的监管、流动性和财务状况,有助于提高A股市盈率,推动中国股市的健康发展。

Python计算市盈率代码解析

计算市盈率需要使用两个关键数据:公司的市值(Market Cap)和公司的净利润(Net Profit)。市值是指公司的市场价值,即公司的总市值。净利润是指公司在一定时期内的净收入,即公司的盈利。下面是Python中计算市盈率的代码示例:

def calculate_pe_ratio(market_cap, net_profit):
    pe_ratio = market_cap / net_profit
    return pe_ratio

# 示例用法
market_cap = 1000000000  # 市值为10亿美元
net_profit = 50000000  # 净利润为5000万美元
pe_ratio = calculate_pe_ratio(market_cap, net_profit)
print("市盈率为:", pe_ratio)

上述代码中,calculate_pe_ratio函数接受市值和净利润作为参数,并计算出市盈率。市盈率的计算方法是将市值除以净利润。函数返回计算得到的市盈率值。在示例中,我们假设公司的市值为10亿美元,净利润为5000万美元,通过调用calculate_pe_ratio函数,我们可以得到市盈率的值。

使用Python中的Bark库生成高质量多语言语音音频的方法

Bark是由Suno创建的一个基于转换器的文本到音频模型。Bark可以生成高度逼真的多语言语音以及其他音频,包括音乐、背景噪音和简单的音效。

该模型还可以产生非语言交流,如大笑、叹息和哭泣。为了支持研究社区,我们正在提供对预先训练的模型检查点的访问,以便进行推理。

使用示例:


from bark import SAMPLE_RATE, generate_audio, preload_models
from scipy.io.wavfile import write as write_wav
from IPython.display import Audio

# download and load all models
preload_models()

# generate audio from text
text_prompt = """
     Hello, my name is Suno. And, uh — and I like pizza. [laughs] 
     But I also have other interests such as playing tic tac toe.
"""
audio_array = generate_audio(text_prompt)

# save audio to disk
write_wav("bark_generation.wav", SAMPLE_RATE, audio_array)
  
# play text in notebook
Audio(audio_array, rate=SAMPLE_RATE)
 
 

有趣好用的Python教程

退出移动版
微信支付
请使用 微信 扫码支付