对于 Skip-gram word2vec 训练样本获取如下:
Sentence: The fox was running across the maple forest
Run Code Online (Sandbox Code Playgroud)
这个词fox给下对训练:
fox-run, fox-across, fox-maple, fox-forest
Run Code Online (Sandbox Code Playgroud)
等等对于每个单词。CBOW w2v 使用反向方法:
run-fox, across-fox, maple-fox, forest-fox
Run Code Online (Sandbox Code Playgroud)
或者forest一句话:
fox-forest, run-forest, across-forest, maple-forest
Run Code Online (Sandbox Code Playgroud)
所以我们得到了所有的对。如果我们在 CBOW 模式下训练时不指定目标词,那么在使用 gensim 库进行训练时,Skip-gram word2vec 和 CBOW w2v 有什么区别?在这两种情况下,是否都使用了所有单词对?
我试图了解Windows应用程序如何工作。
有一个WndProc函数,其中发生消息处理。
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (msg) {
case WM_KEYDOWN:
if (wParam == VK_ESCAPE) {
if (MessageBox(0, L"Are you sure?", L"Exit?", MB_YESNO | MB_ICONQUESTION) == IDYES)
//Release the windows allocated memory
DestroyWindow(hwnd);
}
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hwnd, msg, wParam, lParam);
}
Run Code Online (Sandbox Code Playgroud)
在两种情况下可以调用此函数:
A)由DispatchMessage(&msg)函数在消息循环周期中调用:
while (true){
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
if (msg.message == WM_QUIT)
break;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
Run Code Online (Sandbox Code Playgroud)
B)Windows收到非排队消息时调用。
这是如何运作的?Windows如何在不使用并行性的情况下立即调用WndProc函数?您能否详细描述函数调用的机制?
官方的MSDN文档说:
非排队消息将立即发送到目标窗口过程,从而绕过系统消息队列和线程消息队列。系统通常会发送非排队消息,以通知影响它的事件窗口。例如,当用户激活新的应用程序窗口时,系统向该窗口发送一系列消息,包括WM_ACTIVATE,WM_SETFOCUS和WM_SETCURSOR。这些消息通知该窗口已被激活,键盘输入正被定向到该窗口,并且鼠标光标已在该窗口的边界内移动。当应用程序调用某些系统功能时,也会产生非排队消息。例如,在应用程序使用SetWindowPos函数移动窗口之后,系统发送WM_WINDOWPOSCHANGED消息。
事实证明,非排队消息仅在窗口初始化期间出现,并且所有后续非排队消息只能是在程序中调用WinAPI函数的结果吗?