我正在使用 HuggingFace Transformers 包来访问预训练模型。由于我的用例需要英语和阿拉伯语的功能,因此我使用了bert-base-multilingual- cased 预训练模型。我需要能够使用诸如余弦相似度之类的东西来比较句子的相似度。要使用它,我首先需要为每个句子获取一个嵌入向量,然后可以计算余弦相似度。
首先,从 BERT 模型中提取语义嵌入的最佳方法是什么?在输入句子后获取模型的最后一个隐藏状态就足够了吗?
import torch
from transformers import BertModel, BertTokenizer
model_class = BertModel
tokenizer_class = BertTokenizer
pretrained_weights = 'bert-base-multilingual-cased'
tokenizer = tokenizer_class.from_pretrained(pretrained_weights)
model = model_class.from_pretrained(pretrained_weights)
sentence = 'this is a test sentence'
input_ids = torch.tensor([tokenizer.encode(sentence, add_special_tokens=True)])
with torch.no_grad():
output_tuple = model(input_ids)
last_hidden_states = output_tuple[0]
print(last_hidden_states.size(), last_hidden_states)
Run Code Online (Sandbox Code Playgroud)
其次,如果这是从我的句子中获得嵌入的充分方法,我现在还有另一个问题,即嵌入向量的长度取决于原始句子的长度。形状输出是[1, n, vocab_size],其中n可以有任何值。
为了计算两个向量的余弦相似度,它们需要具有相同的长度。我怎么能在这里做到这一点?像第一次求和这样幼稚的事情axis=1还能奏效吗?我还有什么其他选择?
python nlp vector cosine-similarity huggingface-transformers
我正在尝试编写一个Python脚本,可以将Excel工作表导入我的SQL Server Express(带有Windows身份验证)数据库作为表.为此,我pandas用来将Excel文件读入a pandas DataFrame,然后希望用来pandas.to_sql()将数据导入我的数据库.但是,要使用此功能,我需要使用sqlalchemy.create_engine().
我可以pyodbc单独使用连接到我的数据库,并运行测试查询.这个连接使用以下代码完成:
def create_connection(server_name, database_name):
config = dict(server=server_name, database= database_name)
conn_str = ('SERVER={server};DATABASE={database};TRUSTED_CONNECTION=yes')
return pyodbc.connect(r'DRIVER={ODBC Driver 13 for SQL Server};' + conn_str.format(**config))
...
server = '<MY_SERVER_NAME>\SQLEXPRESS'
db = '<MY_DATABASE_NAME>
connection = create_connection(server, db)
cursor = connection.cursor()
cursor.execute('CREATE VIEW test_view AS SELECT * FROM existing_table')
cursor.commit()
Run Code Online (Sandbox Code Playgroud)
然而,由于我不能使用这个并没有多大用处pandas.to_sql()- 这样做我需要一个引擎sqlalchemy.create_engine(),但是我很难弄清楚如何在我create_connection()上面的函数中使用我的相同细节来成功创建引擎并连接到数据库.
我尝试了许多很多组合:
engine = create_engine("mssql+pyodbc://@C<MY_SERVER_NAME>\SQLEXPRESS/<MY_DATABASE_NAME>?driver={ODBC Driver 13 for SQL Server}?trusted_connection=yes")
conn = engine.connect().connection
Run Code Online (Sandbox Code Playgroud)
要么
engine …Run Code Online (Sandbox Code Playgroud) 我有以下格式的DF:
col1 col2
ID Date
1 1993-12-31 4 6
1994-12-31 8 5
1995-12-31 4 7
1996-12-31 3 3
2 2000-12-31 7 8
2001-12-31 5 9
2002-12-31 8 4
Run Code Online (Sandbox Code Playgroud)
我想重置'Date'索引,给出以下内容:
col1 col2
ID Date
1 0 4 6
1 8 5
2 4 7
3 3 3
2 0 7 8
1 5 9
2 8 4
Run Code Online (Sandbox Code Playgroud)
我认为只是df.reset_index(level='Date', inplace=True, drop=True)会这样做,但事实并非如此.
我创建了一个跟踪设备移动位置的服务.该服务由绑定到它的Activity启动,在此活动中有一个"开始跟踪"按钮.按下此按钮时,我需要服务在前台启动,以便它存储设备已移动到的位置,即使绑定到它的活动已关闭,或应用程序已最小化.
我知道,要使服务位于前台,必须显示通知.我试图这样做,但是当活动被销毁时,我无法获得显示通知或服务在前台工作.
由于通知渠道,Oreo的通知似乎已经发生变化,但我无法弄清楚需要采取哪些不同的措施.我正在测试它的设备是8.0.0.
这是mys服务:
public class LocationTrackerService extends Service {
private LocationListener locationListener;
private LocationManager locationManager;
private IBinder binder = new LocalBinder();
private boolean isTracking;
private ArrayList<Location> trackedWaypoints;
private String bestProvider;
private Timer timer;
private Distance distance;
@SuppressLint("MissingPermission")
@Override
public void onCreate() {
super.onCreate();
locationManager = (LocationManager) getApplicationContext().getSystemService(Context.LOCATION_SERVICE);
Criteria criteria = new Criteria();
bestProvider = locationManager.getBestProvider(criteria, true);
isTracking = false;
locationListener = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
Intent intent = new Intent("location_update");
intent.putExtra("latitude", location.getLatitude());
intent.putExtra("longitude", location.getLongitude()); …Run Code Online (Sandbox Code Playgroud) android foreground android-service android-notifications foregroundnotification
我正在开发一个扑克游戏作为大学项目,我们目前的任务是编写一个算法来对5张牌进行评分,这样两手牌的得分就可以相互比较,以确定哪个是更好的牌.一只手的得分与在抽签处理随机牌等时可以做出的牌的概率无关. - 一手牌的得分完全基于手中的5张牌,而没有其他牌在甲板上.
我们给出的示例解决方案是为每种类型的扑克手提供默认分数,分数反映手牌的好坏 - 例如:
//HAND TYPES:
ROYAL_FLUSH = 900000
STRAIGHT_FLUSH = 800000
...
TWO_PAIR = 200000
ONE_PAR = 100000
Run Code Online (Sandbox Code Playgroud)
然后,如果比较相同类型的两只手,则应将手牌中的牌的值计入手牌得分中.
因此,例如,以下公式可用于得分:
HAND_TYPE + (each card value in the hand)^(the number of occurences of that value)
Run Code Online (Sandbox Code Playgroud)
所以,对于一个三皇后和两个7的满堂,分数将是:
600000 + 12^3 + 7^2
Run Code Online (Sandbox Code Playgroud)
这个公式在很大程度上起作用,但我已经确定,在某些情况下,当一个人实际上击败另一个时,两个相似的牌可以返回完全相同的分数.一个例子是:
hand1 = 4C, 6C, 6H, JS, KC
hand2 = 3H, 4H, 7C, 7D, 8H
Run Code Online (Sandbox Code Playgroud)
这两只手都有一对,所以他们各自的分数是:
100000 + 4^1 + 6^2 + 11^1 + 13^1 = 100064
100000 + 3^1 + 4^1 + 7^2 + 8^1 = …Run Code Online (Sandbox Code Playgroud) 以下几行
a1, b1, _ = plt.hist(df['y'], bins='auto')
a2, b2 = np.histogram(df['y'], bins='auto')
print(a1 == a2)
print(b1 == b2)
Run Code Online (Sandbox Code Playgroud)
等同于的所有值a1等于那些a2与同为b1和b2
然后我pyplot单独创建一个绘图(使用bins=auto 应该使用相同的np.histogram()函数):
plt.hist(df['y'], bins='auto')
plt.show()
Run Code Online (Sandbox Code Playgroud)
然后我尝试实现相同的直方图,但通过调用np.histogram()自己,并将结果传递给plt.hist(),但我得到一个空白的直方图:
a2, b2 = np.histogram(df['y'], bins='auto')
plt.hist(a2, bins=b2)
plt.show()
Run Code Online (Sandbox Code Playgroud)
根据我的理解,plt.hist(df['y'], bins='auto')我正在创建的这两个图应该完全相同 - 为什么我的使用方法不是Numpy?
编辑
接下来来自@ MSeifert的回答,我相信
counts, bins = np.histogram(df['y'], bins='auto')
Run Code Online (Sandbox Code Playgroud)
bins是每个bin的起始值的列表,并且counts是每个bin 中相应的值的数量.如上面的直方图所示,这应该产生近乎完美的正态分布,但是,如果调用print(counts, bins) 结果counts显示第一个和最后一个分箱具有相当大的~11,000个数.为什么这不会反映在直方图中 - 为什么两条尾部都没有两个大的尖峰?
编辑2
这只是一个分辨率问题,我的情节看起来太小了,两端的尖峰都无法正确渲染.放大允许它们显示.
我有一个为 ML 模型提供服务的 FastAPI 应用程序。它部署在 Kubernetes 上。对于最佳实践,Kubernetes 建议在 API 中实现一个活跃端点,它可以探测该端点以查看应用程序何时完成启动,以及一个就绪端点以探测该端点以查看应用程序何时准备好开始接收请求。
目前,我已将活跃度和就绪端点实现为单个端点,200一旦加载 ML 模型并且端点可用于请求,该端点就会返回状态代码。
这没问题,但理想情况下,我希望 FastAPI 启动完成后返回一个活跃端点,并在模型加载后200返回一个就绪端点(比应用程序启动花费的时间长得多)。200
FastAPI 允许启动事件触发器,我可以在其中启动模型的加载,但在应用程序启动完成之前没有端点可用,而在启动事件也完成之前,应用程序启动不会完成。
无论如何,是否可以在 FastAPI 中实现“启动后”事件,以便我可以启动模型的加载?
这是我想要实现的一些简单示例代码:
from fastapi import FastAPI, Response
from request import PredictionRequest
import model
app = FastAPI()
@app.on_event("post-startup") # not possible
def load_model():
model.load()
@app.get("/live")
def is_live():
return Response(status_code=200)
@app.get("/ready")
def is_ready():
if model.is_loaded():
return Response(status_code=200)
else:
return Response(status_code=409)
@app.post('/predict')
def predict(request: PredictionRequest):
return model.predict(request)
Run Code Online (Sandbox Code Playgroud) 我知道这是非常低效和丑陋的代码,但如果我有三个for循环,嵌套在彼此内部如下:
for x in range(0, 10):
for y in range(x+1, 11):
for z in range(y+1, 11):
if ...
Run Code Online (Sandbox Code Playgroud)
我想打破两个内部循环,如果if语句为真,则继续执行外循环的下一次迭代.可以这样做吗?
我正在编写将命令输出写入给定文件名的重定向函数。
例如:
echo Hello World > hello.txt 将“Hello World”写入 hello.txt。
ls -al > file_list.txt 会将当前目录中所有文件/目录名称的列表写入 file_list.txt。
到目前为止,我的功能定义为:
int my_redirect(char **args, int count) {
if (count == 0 || args[count + 1] == NULL) {
printf("The redirect function must follow a command and be followed by a target filename.\n");
return 1;
}
char *filename = args[count + 1];
//Concatenates each argument into a string separated by spaces to form the command
char *command = (char *) malloc(256);
for (int i = …Run Code Online (Sandbox Code Playgroud) tf.round(x)将的值四舍五入x为整数值。
有没有办法舍入到小数点后3位?
python ×6
pandas ×2
algorithm ×1
android ×1
binning ×1
break ×1
c ×1
continue ×1
events ×1
fastapi ×1
foreground ×1
histogram ×1
linux ×1
matplotlib ×1
nested-loops ×1
nlp ×1
numpy ×1
poker ×1
precision ×1
pyodbc ×1
python-3.x ×1
rounding ×1
shell ×1
sql-server ×1
sqlalchemy ×1
tensorflow ×1
vector ×1