import{s as le,o as te,n as Ps}from"../chunks/scheduler.37c15a92.js";import{S as se,i as ee,g as j,s as p,r as U,A as ae,h as T,f as s,c as i,j as Ls,u as y,x as w,k as Kl,l as cs,y as ne,a as e,v as u,t as c,b as as,d as o,w as J,p as ns}from"../chunks/index.2bf4358c.js";import{T as Ks}from"../chunks/Tip.363c041f.js";import{Y as Me}from"../chunks/Youtube.1e50a667.js";import{C as h}from"../chunks/CodeBlock.4e987730.js";import{C as Os}from"../chunks/CourseFloatingBanner.9ff4c771.js";import{F as pe}from"../chunks/FrameworkSwitchCourse.8d4d4ab6.js";import{H as Pl,E as ie}from"../chunks/getInferenceSnippets.24b50994.js";function de(C){let a,m;return a=new Os({props:{chapter:5,classNames:"absolute z-10 right-0 top-0",notebooks:[{label:"Google Colab",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/master/course/en/chapter5/section6_tf.ipynb"},{label:"Aws Studio",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/en/chapter5/section6_tf.ipynb"}]}}),{c(){U(a.$$.fragment)},l(n){y(a.$$.fragment,n)},m(n,f){u(a,n,f),m=!0},i(n){m||(o(a.$$.fragment,n),m=!0)},o(n){c(a.$$.fragment,n),m=!1},d(n){J(a,n)}}}function ce(C){let a,m;return a=new Os({props:{chapter:5,classNames:"absolute z-10 right-0 top-0",notebooks:[{label:"Google Colab",value:"https://colab.research.google.com/github/huggingface/notebooks/blob/master/course/en/chapter5/section6_pt.ipynb"},{label:"Aws Studio",value:"https://studiolab.sagemaker.aws/import/github/huggingface/notebooks/blob/master/course/en/chapter5/section6_pt.ipynb"}]}}),{c(){U(a.$$.fragment)},l(n){y(a.$$.fragment,n)},m(n,f){u(a,n,f),m=!0},i(n){m||(o(a.$$.fragment,n),m=!0)},o(n){c(a.$$.fragment,n),m=!1},d(n){J(a,n)}}}function oe(C){let a,m='✏️ <strong>Попробуйте!</strong> Посмотрите, сможете ли вы использовать <code>Dataset.map()</code>, чтобы развернуть столбец <code>comments</code> столбца <code>issues_dataset</code> <em>без</em> использования Pandas. Это немного сложно; вы можете найти раздел <a href="https://huggingface.co/docs/datasets/about_map_batch#batch-mapping" rel="nofollow">“Batch mapping”</a> документации 🤗 Datasets, полезным для этой задачи.';return{c(){a=j("p"),a.innerHTML=m},l(n){a=T(n,"P",{"data-svelte-h":!0}),w(a)!=="svelte-3jhlkr"&&(a.innerHTML=m)},m(n,f){e(n,a,f)},p:Ps,d(n){n&&s(a)}}}function me(C){let a,m,n,f="Обратите внимание, что мы установили <code>from_pt=True</code> в качестве аргумента метода <code>from_pretrained()</code>. Это связано с тем, что контрольная точка <code>multi-qa-mpnet-base-dot-v1</code> имеет только веса PyTorch, поэтому установка <code>from_pt=True</code> автоматически преобразует их в формат TensorFlow для нас. Как видите, переключаться между фреймворками в 🤗 Трансформеры очень просто!",d;return a=new h({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMEF1dG9Ub2tlbml6ZXIlMkMlMjBURkF1dG9Nb2RlbCUwQSUwQW1vZGVsX2NrcHQlMjAlM0QlMjAlMjJzZW50ZW5jZS10cmFuc2Zvcm1lcnMlMkZtdWx0aS1xYS1tcG5ldC1iYXNlLWRvdC12MSUyMiUwQXRva2VuaXplciUyMCUzRCUyMEF1dG9Ub2tlbml6ZXIuZnJvbV9wcmV0cmFpbmVkKG1vZGVsX2NrcHQpJTBBbW9kZWwlMjAlM0QlMjBURkF1dG9Nb2RlbC5mcm9tX3ByZXRyYWluZWQobW9kZWxfY2twdCUyQyUyMGZyb21fcHQlM0RUcnVlKQ==",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> AutoTokenizer, TFAutoModel

model_ckpt = <span class="hljs-string">&quot;sentence-transformers/multi-qa-mpnet-base-dot-v1&quot;</span>
tokenizer = AutoTokenizer.from_pretrained(model_ckpt)
model = TFAutoModel.from_pretrained(model_ckpt, from_pt=<span class="hljs-literal">True</span>)`,wrap:!1}}),{c(){U(a.$$.fragment),m=p(),n=j("p"),n.innerHTML=f},l(r){y(a.$$.fragment,r),m=i(r),n=T(r,"P",{"data-svelte-h":!0}),w(n)!=="svelte-w4ef9a"&&(n.innerHTML=f)},m(r,G){u(a,r,G),e(r,m,G),e(r,n,G),d=!0},i(r){d||(o(a.$$.fragment,r),d=!0)},o(r){c(a.$$.fragment,r),d=!1},d(r){r&&(s(m),s(n)),J(a,r)}}}function re(C){let a,m,n,f="Чтобы ускорить процесс построения эмбеддингов, рекомендуется переместить модель и входные данные на устройстве с графическим процессором, поэтому давайте сделаем это сейчас:",d,r,G;return a=new h({props:{code:"ZnJvbSUyMHRyYW5zZm9ybWVycyUyMGltcG9ydCUyMEF1dG9Ub2tlbml6ZXIlMkMlMjBBdXRvTW9kZWwlMEElMEFtb2RlbF9ja3B0JTIwJTNEJTIwJTIyc2VudGVuY2UtdHJhbnNmb3JtZXJzJTJGbXVsdGktcWEtbXBuZXQtYmFzZS1kb3QtdjElMjIlMEF0b2tlbml6ZXIlMjAlM0QlMjBBdXRvVG9rZW5pemVyLmZyb21fcHJldHJhaW5lZChtb2RlbF9ja3B0KSUwQW1vZGVsJTIwJTNEJTIwQXV0b01vZGVsLmZyb21fcHJldHJhaW5lZChtb2RlbF9ja3B0KQ==",highlighted:`<span class="hljs-keyword">from</span> transformers <span class="hljs-keyword">import</span> AutoTokenizer, AutoModel

model_ckpt = <span class="hljs-string">&quot;sentence-transformers/multi-qa-mpnet-base-dot-v1&quot;</span>
tokenizer = AutoTokenizer.from_pretrained(model_ckpt)
model = AutoModel.from_pretrained(model_ckpt)`,wrap:!1}}),r=new h({props:{code:"aW1wb3J0JTIwdG9yY2glMEElMEFkZXZpY2UlMjAlM0QlMjB0b3JjaC5kZXZpY2UoJTIyY3VkYSUyMiklMEFtb2RlbC50byhkZXZpY2Up",highlighted:`<span class="hljs-keyword">import</span> torch

device = torch.device(<span class="hljs-string">&quot;cuda&quot;</span>)
model.to(device)`,wrap:!1}}),{c(){U(a.$$.fragment),m=p(),n=j("p"),n.textContent=f,d=p(),U(r.$$.fragment)},l(b){y(a.$$.fragment,b),m=i(b),n=T(b,"P",{"data-svelte-h":!0}),w(n)!=="svelte-inum91"&&(n.textContent=f),d=i(b),y(r.$$.fragment,b)},m(b,Z){u(a,b,Z),e(b,m,Z),e(b,n,Z),e(b,d,Z),u(r,b,Z),G=!0},i(b){G||(o(a.$$.fragment,b),o(r.$$.fragment,b),G=!0)},o(b){c(a.$$.fragment,b),c(r.$$.fragment,b),G=!1},d(b){b&&(s(m),s(n),s(d)),J(a,b),J(r,b)}}}function Ue(C){let a,m,n,f="Мы можем проверить работу функции, передав ей первую текстовую запись в нашем корпусе и проверив размерности данных на выходе:",d,r,G,b,Z,g,R="Отлично, мы преобразовали первую запись в нашем корпусе в 768-мерный вектор! Мы можем использовать <code>Dataset.map()</code>, чтобы применить нашу функцию <code>get_embeddings()</code> к каждой строке в нашем корпусе, поэтому давайте создадим новый столбец <code>embeddings</code> следующим образом:",$,I,k;return a=new h({props:{code:"ZGVmJTIwZ2V0X2VtYmVkZGluZ3ModGV4dF9saXN0KSUzQSUwQSUyMCUyMCUyMCUyMGVuY29kZWRfaW5wdXQlMjAlM0QlMjB0b2tlbml6ZXIoJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwdGV4dF9saXN0JTJDJTIwcGFkZGluZyUzRFRydWUlMkMlMjB0cnVuY2F0aW9uJTNEVHJ1ZSUyQyUyMHJldHVybl90ZW5zb3JzJTNEJTIydGYlMjIlMEElMjAlMjAlMjAlMjApJTBBJTIwJTIwJTIwJTIwZW5jb2RlZF9pbnB1dCUyMCUzRCUyMCU3QmslM0ElMjB2JTIwZm9yJTIwayUyQyUyMHYlMjBpbiUyMGVuY29kZWRfaW5wdXQuaXRlbXMoKSU3RCUwQSUyMCUyMCUyMCUyMG1vZGVsX291dHB1dCUyMCUzRCUyMG1vZGVsKCoqZW5jb2RlZF9pbnB1dCklMEElMjAlMjAlMjAlMjByZXR1cm4lMjBjbHNfcG9vbGluZyhtb2RlbF9vdXRwdXQp",highlighted:`<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_embeddings</span>(<span class="hljs-params">text_list</span>):
    encoded_input = tokenizer(
        text_list, padding=<span class="hljs-literal">True</span>, truncation=<span class="hljs-literal">True</span>, return_tensors=<span class="hljs-string">&quot;tf&quot;</span>
    )
    encoded_input = {k: v <span class="hljs-keyword">for</span> k, v <span class="hljs-keyword">in</span> encoded_input.items()}
    model_output = model(**encoded_input)
    <span class="hljs-keyword">return</span> cls_pooling(model_output)`,wrap:!1}}),r=new h({props:{code:"ZW1iZWRkaW5nJTIwJTNEJTIwZ2V0X2VtYmVkZGluZ3MoY29tbWVudHNfZGF0YXNldCU1QiUyMnRleHQlMjIlNUQlNUIwJTVEKSUwQWVtYmVkZGluZy5zaGFwZQ==",highlighted:`embedding = get_embeddings(comments_dataset[<span class="hljs-string">&quot;text&quot;</span>][<span class="hljs-number">0</span>])
embedding.shape`,wrap:!1}}),b=new h({props:{code:"VGVuc29yU2hhcGUoJTVCMSUyQyUyMDc2OCU1RCk=",highlighted:'TensorShape([<span class="hljs-number">1</span>, <span class="hljs-number">768</span>])',wrap:!1}}),I=new h({props:{code:"ZW1iZWRkaW5nc19kYXRhc2V0JTIwJTNEJTIwY29tbWVudHNfZGF0YXNldC5tYXAoJTBBJTIwJTIwJTIwJTIwbGFtYmRhJTIweCUzQSUyMCU3QiUyMmVtYmVkZGluZ3MlMjIlM0ElMjBnZXRfZW1iZWRkaW5ncyh4JTVCJTIydGV4dCUyMiU1RCkubnVtcHkoKSU1QjAlNUQlN0QlMEEp",highlighted:`embeddings_dataset = comments_dataset.<span class="hljs-built_in">map</span>(
    <span class="hljs-keyword">lambda</span> x: {<span class="hljs-string">&quot;embeddings&quot;</span>: get_embeddings(x[<span class="hljs-string">&quot;text&quot;</span>]).numpy()[<span class="hljs-number">0</span>]}
)`,wrap:!1}}),{c(){U(a.$$.fragment),m=p(),n=j("p"),n.textContent=f,d=p(),U(r.$$.fragment),G=p(),U(b.$$.fragment),Z=p(),g=j("p"),g.innerHTML=R,$=p(),U(I.$$.fragment)},l(M){y(a.$$.fragment,M),m=i(M),n=T(M,"P",{"data-svelte-h":!0}),w(n)!=="svelte-1arf6dc"&&(n.textContent=f),d=i(M),y(r.$$.fragment,M),G=i(M),y(b.$$.fragment,M),Z=i(M),g=T(M,"P",{"data-svelte-h":!0}),w(g)!=="svelte-1lqreox"&&(g.innerHTML=R),$=i(M),y(I.$$.fragment,M)},m(M,Q){u(a,M,Q),e(M,m,Q),e(M,n,Q),e(M,d,Q),u(r,M,Q),e(M,G,Q),u(b,M,Q),e(M,Z,Q),e(M,g,Q),e(M,$,Q),u(I,M,Q),k=!0},i(M){k||(o(a.$$.fragment,M),o(r.$$.fragment,M),o(b.$$.fragment,M),o(I.$$.fragment,M),k=!0)},o(M){c(a.$$.fragment,M),c(r.$$.fragment,M),c(b.$$.fragment,M),c(I.$$.fragment,M),k=!1},d(M){M&&(s(m),s(n),s(d),s(G),s(Z),s(g),s($)),J(a,M),J(r,M),J(b,M),J(I,M)}}}function ye(C){let a,m,n,f="Мы можем проверить работу функции, передав ей первую текстовую запись в нашем корпусе и проверив размерности данных на выходе:",d,r,G,b,Z,g,R="Отлично, мы преобразовали первую запись в нашем корпусе в 768-мерный вектор! Мы можем использовать <code>Dataset.map()</code>, чтобы применить нашу функцию <code>get_embeddings()</code> к каждой строке в нашем корпусе, поэтому давайте создадим новый столбец <code>embeddings</code> следующим образом:",$,I,k;return a=new h({props:{code:"ZGVmJTIwZ2V0X2VtYmVkZGluZ3ModGV4dF9saXN0KSUzQSUwQSUyMCUyMCUyMCUyMGVuY29kZWRfaW5wdXQlMjAlM0QlMjB0b2tlbml6ZXIoJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwdGV4dF9saXN0JTJDJTIwcGFkZGluZyUzRFRydWUlMkMlMjB0cnVuY2F0aW9uJTNEVHJ1ZSUyQyUyMHJldHVybl90ZW5zb3JzJTNEJTIycHQlMjIlMEElMjAlMjAlMjAlMjApJTBBJTIwJTIwJTIwJTIwZW5jb2RlZF9pbnB1dCUyMCUzRCUyMCU3QmslM0ElMjB2LnRvKGRldmljZSklMjBmb3IlMjBrJTJDJTIwdiUyMGluJTIwZW5jb2RlZF9pbnB1dC5pdGVtcygpJTdEJTBBJTIwJTIwJTIwJTIwbW9kZWxfb3V0cHV0JTIwJTNEJTIwbW9kZWwoKiplbmNvZGVkX2lucHV0KSUwQSUyMCUyMCUyMCUyMHJldHVybiUyMGNsc19wb29saW5nKG1vZGVsX291dHB1dCk=",highlighted:`<span class="hljs-keyword">def</span> <span class="hljs-title function_">get_embeddings</span>(<span class="hljs-params">text_list</span>):
    encoded_input = tokenizer(
        text_list, padding=<span class="hljs-literal">True</span>, truncation=<span class="hljs-literal">True</span>, return_tensors=<span class="hljs-string">&quot;pt&quot;</span>
    )
    encoded_input = {k: v.to(device) <span class="hljs-keyword">for</span> k, v <span class="hljs-keyword">in</span> encoded_input.items()}
    model_output = model(**encoded_input)
    <span class="hljs-keyword">return</span> cls_pooling(model_output)`,wrap:!1}}),r=new h({props:{code:"ZW1iZWRkaW5nJTIwJTNEJTIwZ2V0X2VtYmVkZGluZ3MoY29tbWVudHNfZGF0YXNldCU1QiUyMnRleHQlMjIlNUQlNUIwJTVEKSUwQWVtYmVkZGluZy5zaGFwZQ==",highlighted:`embedding = get_embeddings(comments_dataset[<span class="hljs-string">&quot;text&quot;</span>][<span class="hljs-number">0</span>])
embedding.shape`,wrap:!1}}),b=new h({props:{code:"dG9yY2guU2l6ZSglNUIxJTJDJTIwNzY4JTVEKQ==",highlighted:'torch.Size([<span class="hljs-number">1</span>, <span class="hljs-number">768</span>])',wrap:!1}}),I=new h({props:{code:"ZW1iZWRkaW5nc19kYXRhc2V0JTIwJTNEJTIwY29tbWVudHNfZGF0YXNldC5tYXAoJTBBJTIwJTIwJTIwJTIwbGFtYmRhJTIweCUzQSUyMCU3QiUyMmVtYmVkZGluZ3MlMjIlM0ElMjBnZXRfZW1iZWRkaW5ncyh4JTVCJTIydGV4dCUyMiU1RCkuZGV0YWNoKCkuY3B1KCkubnVtcHkoKSU1QjAlNUQlN0QlMEEp",highlighted:`embeddings_dataset = comments_dataset.<span class="hljs-built_in">map</span>(
    <span class="hljs-keyword">lambda</span> x: {<span class="hljs-string">&quot;embeddings&quot;</span>: get_embeddings(x[<span class="hljs-string">&quot;text&quot;</span>]).detach().cpu().numpy()[<span class="hljs-number">0</span>]}
)`,wrap:!1}}),{c(){U(a.$$.fragment),m=p(),n=j("p"),n.textContent=f,d=p(),U(r.$$.fragment),G=p(),U(b.$$.fragment),Z=p(),g=j("p"),g.innerHTML=R,$=p(),U(I.$$.fragment)},l(M){y(a.$$.fragment,M),m=i(M),n=T(M,"P",{"data-svelte-h":!0}),w(n)!=="svelte-1arf6dc"&&(n.textContent=f),d=i(M),y(r.$$.fragment,M),G=i(M),y(b.$$.fragment,M),Z=i(M),g=T(M,"P",{"data-svelte-h":!0}),w(g)!=="svelte-1lqreox"&&(g.innerHTML=R),$=i(M),y(I.$$.fragment,M)},m(M,Q){u(a,M,Q),e(M,m,Q),e(M,n,Q),e(M,d,Q),u(r,M,Q),e(M,G,Q),u(b,M,Q),e(M,Z,Q),e(M,g,Q),e(M,$,Q),u(I,M,Q),k=!0},i(M){k||(o(a.$$.fragment,M),o(r.$$.fragment,M),o(b.$$.fragment,M),o(I.$$.fragment,M),k=!0)},o(M){c(a.$$.fragment,M),c(r.$$.fragment,M),c(b.$$.fragment,M),c(I.$$.fragment,M),k=!1},d(M){M&&(s(m),s(n),s(d),s(G),s(Z),s(g),s($)),J(a,M),J(r,M),J(b,M),J(I,M)}}}function ue(C){let a,m,n,f;return a=new h({props:{code:"cXVlc3Rpb24lMjAlM0QlMjAlMjJIb3clMjBjYW4lMjBJJTIwbG9hZCUyMGElMjBkYXRhc2V0JTIwb2ZmbGluZSUzRiUyMiUwQXF1ZXN0aW9uX2VtYmVkZGluZyUyMCUzRCUyMGdldF9lbWJlZGRpbmdzKCU1QnF1ZXN0aW9uJTVEKS5udW1weSgpJTBBcXVlc3Rpb25fZW1iZWRkaW5nLnNoYXBl",highlighted:`question = <span class="hljs-string">&quot;How can I load a dataset offline?&quot;</span>
question_embedding = get_embeddings([question]).numpy()
question_embedding.shape`,wrap:!1}}),n=new h({props:{code:"KDElMkMlMjA3Njgp",highlighted:'(<span class="hljs-number">1</span>, <span class="hljs-number">768</span>)',wrap:!1}}),{c(){U(a.$$.fragment),m=p(),U(n.$$.fragment)},l(d){y(a.$$.fragment,d),m=i(d),y(n.$$.fragment,d)},m(d,r){u(a,d,r),e(d,m,r),u(n,d,r),f=!0},i(d){f||(o(a.$$.fragment,d),o(n.$$.fragment,d),f=!0)},o(d){c(a.$$.fragment,d),c(n.$$.fragment,d),f=!1},d(d){d&&s(m),J(a,d),J(n,d)}}}function Je(C){let a,m,n,f;return a=new h({props:{code:"cXVlc3Rpb24lMjAlM0QlMjAlMjJIb3clMjBjYW4lMjBJJTIwbG9hZCUyMGElMjBkYXRhc2V0JTIwb2ZmbGluZSUzRiUyMiUwQXF1ZXN0aW9uX2VtYmVkZGluZyUyMCUzRCUyMGdldF9lbWJlZGRpbmdzKCU1QnF1ZXN0aW9uJTVEKS5jcHUoKS5kZXRhY2goKS5udW1weSgpJTBBcXVlc3Rpb25fZW1iZWRkaW5nLnNoYXBl",highlighted:`question = <span class="hljs-string">&quot;How can I load a dataset offline?&quot;</span>
question_embedding = get_embeddings([question]).cpu().detach().numpy()
question_embedding.shape`,wrap:!1}}),n=new h({props:{code:"dG9yY2guU2l6ZSglNUIxJTJDJTIwNzY4JTVEKQ==",highlighted:'torch.Size([<span class="hljs-number">1</span>, <span class="hljs-number">768</span>])',wrap:!1}}),{c(){U(a.$$.fragment),m=p(),U(n.$$.fragment)},l(d){y(a.$$.fragment,d),m=i(d),y(n.$$.fragment,d)},m(d,r){u(a,d,r),e(d,m,r),u(n,d,r),f=!0},i(d){f||(o(a.$$.fragment,d),o(n.$$.fragment,d),f=!0)},o(d){c(a.$$.fragment,d),c(n.$$.fragment,d),f=!1},d(d){d&&s(m),J(a,d),J(n,d)}}}function be(C){let a,m="✏️ <strong>Попробуйте!</strong> Создайте свой собственный запрос и посмотрите, сможете ли вы найти ответ в найденных документах. Возможно, вам придется увеличить параметр <code>k</code> в <code>Dataset.get_nearest_examples()</code>, чтобы расширить поиск.";return{c(){a=j("p"),a.innerHTML=m},l(n){a=T(n,"P",{"data-svelte-h":!0}),w(a)!=="svelte-slam50"&&(a.innerHTML=m)},m(n,f){e(n,a,f)},p:Ps,d(n){n&&s(a)}}}function je(C){let a,m,n,f,d,r,G,b,Z,g,R,$,I='В <a href="../chapter5/5">разделе 5</a> мы создали набор данных о issues и комментариях GitHub из репозитория 🤗 Datasets. В этом разделе мы будем использовать эту информацию для создания поисковой системы, которая поможет нам найти ответы на самые насущные вопросы о библиотеке!',k,M,Q,S,Ol,v,os='Как мы видели в <a href="../chapter1/1">Главе 1</a>, языковые модели на основе Transformer представляют каждую лексему в текстовом фрагменте как <em>эмбеддинг-вектор</em>. Оказывается, можно «объединить» отдельные вложения, чтобы создать векторное представление для целых предложений, абзацев или (в некоторых случаях) документов. Затем эти вложения можно использовать для поиска похожих документов в корпусе путем вычисления скалярного произведения (или какой-либо другой метрики сходства) между каждым вложением и возврата документов с наибольшим перекрытием.',lt,E,ms="В этом разделе мы будем использовать вложения для разработки семантической поисковой системы. Эти поисковые системы предлагают несколько преимуществ по сравнению с традиционными подходами, основанными на сопоставлении ключевых слов в запросе с документами.",tt,Y,rs='<img class="block dark:hidden" src="https://huggingface.co/datasets/huggingface-course/documentation-images/resolve/main/en/chapter5/semantic-search.svg" alt="Semantic search."/> <img class="hidden dark:block" src="https://huggingface.co/datasets/huggingface-course/documentation-images/resolve/main/en/chapter5/semantic-search-dark.svg" alt="Semantic search."/>',st,H,et,A,Us="Первое, что нам нужно сделать, это загрузить наш набор данных об issues GitHub, поэтому давайте воспользуемся библиотекой 🤗 Hub для получения URL-адреса, по которому наш файл хранится в Hugging Face Hub:",at,D,nt,q,ys='С URL-адресом, сохраненным в <code>data_files</code>, мы можем загрузить удаленный набор данных, используя метод, представленный в <a href="../chapter5/2">раздел 2</a>:',Mt,L,pt,K,it,P,us="Здесь мы указали подвыборку <code>train</code> по умолчанию в <code>load_dataset()</code>, поэтому он возвращает <code>Dataset</code> вместо <code>DatasetDict</code>. Первым делом нужно отфильтровать запросы на pull-requests, поскольку они, как правило, редко используются для ответов на вопросы пользователей и создают шум в нашей поисковой системе. Как должно быть уже известно, мы можем использовать функцию <code>Dataset.filter()</code>, чтобы исключить эти строки из нашего набора данных. Давайте также отфильтруем строки без комментариев, поскольку они не дают ответов на запросы пользователей:",dt,O,ct,ll,ot,tl,Js="Мы видим, что в нашем наборе данных много столбцов, большинство из которых нам не нужно для создания нашей поисковой системы. С точки зрения поиска наиболее информативными столбцами являются <code>title</code>, <code>body</code> и <code>comments</code>, а <code>html_url</code> содержит нам ссылку на исходную проблему. Давайте воспользуемся функцией <code>Dataset.remove_columns()</code>, чтобы удалить остальные столбцы:",mt,sl,rt,el,Ut,al,bs='Чтобы создать наши эмбеддинги, мы дополним каждый комментарий заголовком и телом проблемы, поскольку эти поля часто содержат полезную контекстную информацию. Поскольку наш столбец <code>comments</code> в настоящее время представляет собой список комментариев для каждой проблемы, нам нужно «развернуть» столбец, чтобы каждая строка состояла из кортежа <code>(html_url, title, body, comment)</code>. В Pandas мы можем сделать это с помощью функции <a href="https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.explode.html" rel="nofollow"><code>DataFrame.explode()</code></a>, которая создает новую строку для каждого элемента в столбце, похожем на список, при копировании всех других значений столбца. Чтобы увидеть это в действии, давайте сначала переключимся на формат Pandas <code>DataFrame</code>:',yt,nl,ut,Ml,js="Если мы проверим первую строку в этом <code>DataFrame</code>, мы увидим, что есть четыре комментария, связанных с этой проблемой:",Jt,pl,bt,il,jt,dl,Ts="Когда мы «развернем» <code>df</code>, мы ожидаем получить по одной строке для каждого из этих комментариев. Проверим, так ли это:",Tt,cl,ht,_,hs='<thead><tr style="text-align: right;"><th></th> <th>html_url</th> <th>title</th> <th>comments</th> <th>body</th></tr></thead> <tbody><tr><th>0</th> <td>https://github.com/huggingface/datasets/issues/2787</td> <td>ConnectionError: Couldn&#39;t reach https://raw.githubusercontent.com</td> <td>the bug code locate in ：\\r\\n    if data_args.task_name is not None...</td> <td>Hello,\\r\\nI am trying to run run_glue.py and it gives me this error...</td></tr> <tr><th>1</th> <td>https://github.com/huggingface/datasets/issues/2787</td> <td>ConnectionError: Couldn&#39;t reach https://raw.githubusercontent.com</td> <td>Hi @jinec,\\r\\n\\r\\nFrom time to time we get this kind of `ConnectionError` coming from the github.com website: https://raw.githubusercontent.com...</td> <td>Hello,\\r\\nI am trying to run run_glue.py and it gives me this error...</td></tr> <tr><th>2</th> <td>https://github.com/huggingface/datasets/issues/2787</td> <td>ConnectionError: Couldn&#39;t reach https://raw.githubusercontent.com</td> <td>cannot connect，even by Web browser，please check that  there is some  problems。</td> <td>Hello,\\r\\nI am trying to run run_glue.py and it gives me this error...</td></tr> <tr><th>3</th> <td>https://github.com/huggingface/datasets/issues/2787</td> <td>ConnectionError: Couldn&#39;t reach https://raw.githubusercontent.com</td> <td>I can access https://raw.githubusercontent.com/huggingface/datasets/1.7.0/datasets/glue/glue.py without problem...</td> <td>Hello,\\r\\nI am trying to run run_glue.py and it gives me this error...</td></tr></tbody>',wt,ol,ws="Отлично, мы видим, что строки были скопированы, а столбец <code>comments</code> содержит отдельные комментарии! Теперь, когда мы закончили с Pandas, мы можем быстро вернуться к <code>Dataset</code>, загрузив <code>DataFrame</code> в память:",ft,ml,Qt,rl,Zt,Ul,fs="Хорошо, это дало нам несколько тысяч комментариев для работы!",gt,z,Gt,yl,Qs="Теперь, когда у нас есть один комментарий в строке, давайте создадим новый столбец <code>comments_length</code>, содержащий количество слов в комментарии:",Ct,ul,It,Jl,Zs="Мы можем использовать этот новый столбец для фильтрации коротких комментариев, которые обычно содержат такие слова, как «cc @lewtun» или Thanks!», которые не имеют отношения к нашей поисковой системе. Нет точного числа для выбора порога числа слов, но около 15 слов кажется хорошим началом:",$t,bl,kt,jl,Rt,Tl,gs="Немного очистив наш набор данных, давайте соединим название issue, описание и комментарии вместе в новом столбце <code>text</code>. Как обычно, мы напишем простую функцию, которую мы можем передать в <code>Dataset.map()</code>:",_t,hl,Bt,wl,Gs="Наконец-то мы готовы создать несколько эмбеддингов’! Давайте взглянем.",Nt,fl,Xt,Ql,Cs='В <a href="../chapter2/1">Главе 2</a> мы видели, что можно получить эмбеддингов токенов с помощью класса AutoModel. Все, что нам нужно сделать, это выбрать подходящую контрольную точку для загрузки модели. К счастью, есть библиотека под названием <code>sentence-transformers</code>, предназначенная для создания эмбеддингов. Как описано в <a href="https://www.sbert.net/examples/applications/semantic-search/README.html#%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D1%8B%D0%B9-vs-%D0%B0%D1%81%D0%B8%D0%BC%D0%BC%D0%B5%D1%82%D1%80%D0%B8%D1%87%D0%BD%D1%8B%D0%B9-semantic-search" rel="nofollow">документации</a> библиотеки, наш вариант использования является примером <em>асимметричного семантического поиска</em> потому что у нас есть короткий запрос, ответ на который мы хотели бы найти в более длинном документе, например, в комментарии к проблеме. В удобной <a href="https://www.sbert.net/docs/pretrained_models.html#model-overview" rel="nofollow">таблице обзора модели</a> в документации указано, что контрольная точка <code>multi-qa-mpnet-base-dot-v1</code> имеет лучшую производительность для семантического поиска, поэтому мы будем использовать её для нашего приложения. Мы также загрузим токенизатор, используя ту же контрольную точку:',xt,B,N,Al,Zl,Is="Как мы упоминали ранее, мы хотели бы представить каждую запись в нашем корпусе issues GitHub как единый вектор, поэтому нам нужно каким-то образом «объединить» или усреднить наши вложения токенов. Одним из популярных подходов является выполнение <em>CLS pooling</em> выходных данных нашей модели, когда мы просто собираем последнее скрытое состояние для специального токена <code>[CLS]</code>. Следующая функция поможет нам:",Vt,gl,Wt,Gl,$s="Далее мы создадим вспомогательную функцию, которая разметит список документов, поместит тензоры в GPU, передаст их в модель и, наконец, применит CLS pooling к выходным данным:",Yt,X,x,Dl,Cl,ks="Обратите внимание, что мы преобразовали вложения в массивы NumPy — это потому, что 🤗 Datasets требуют этого формата, когда мы пытаемся проиндексировать их с помощью FAISS, что мы сделаем дальше.",zt,Il,Ft,$l,Rs='Теперь, когда у нас есть датасет с эмбеддингами, нам нужен способ поиска по ним. Для этого мы будем использовать специальную структуру данных из 🤗 Datasets, называемую <em>FAISS index</em>. <a href="https://faiss.ai/" rel="nofollow">FAISS</a> (сокращение от Facebook AI Similarity Search) — это библиотека, предоставляющая эффективные алгоритмы для быстрого поиска и кластеризации эмбеддингов.',St,kl,_s="Основная идея FAISS состоит в том, чтобы создать специальную структуру данных, называемую <em>index</em>, которая позволяет найти, какие эмбеддинги подобны входным эмбеддингам. Создать индекс FAISS в 🤗 Datasets очень просто — мы используем функцию <code>Dataset.add_faiss_index()</code> и указываем, какой столбец нашего набора данных мы хотим проиндексировать:",vt,Rl,Et,_l,Bs="Теперь мы можем выполнять запросы к этому индексу, выполняя поиск ближайшего соседа с помощью функции <code>Dataset.get_nearest_examples()</code>. Давайте проверим это, сначала внедрив вопрос следующим образом:",Ht,V,W,ql,Bl,Ns="Как и в случае с документами, теперь у нас есть 768-мерный вектор, представляющий запрос, который мы можем сравнить со всем корпусом, чтобы найти наиболее похожие объекты:",At,Nl,Dt,Xl,Xs="Функция <code>Dataset.get_nearest_examples()</code> возвращает набор оценок, которые ранжируют совпадение между запросом и документом, и соответствующий набор образцов (здесь 5 лучших совпадений). Давайте соберем их в <code>pandas.DataFrame</code>, чтобы мы могли легко их отсортировать:",qt,xl,Lt,Vl,xs="Теперь мы можем пройтись по первым нескольким строкам, чтобы увидеть, насколько наш запрос соответствует имеющимся комментариям:",Kt,Wl,Pt,Yl,Ot,zl,Vs="Неплохо! Наше второе обращение, кажется, соответствует запросу.",ls,F,ts,Fl,ss,Ll,es;d=new pe({props:{fw:C[0]}}),G=new Pl({props:{title:"Семантический поиск с помощью FAISS",local:"семантический-поиск-с-помощью-faiss",headingTag:"h1"}});const Ws=[ce,de],Sl=[];function Ys(l,t){return l[0]==="pt"?0:1}Z=Ys(C),g=Sl[Z]=Ws[Z](C),M=new Me({props:{id:"OATCgQtNX2o"}}),S=new Pl({props:{title:"Использование эмбеддингов для семанического поиска",local:"использование-эмбеддингов-для-семанического-поиска",headingTag:"h2"}}),H=new Pl({props:{title:"Загрузка и подготовка датасета",local:"загрузка-и-подготовка-датасета",headingTag:"h2"}}),D=new h({props:{code:"ZnJvbSUyMGh1Z2dpbmdmYWNlX2h1YiUyMGltcG9ydCUyMGhmX2h1Yl91cmwlMEElMEFkYXRhX2ZpbGVzJTIwJTNEJTIwaGZfaHViX3VybCglMEElMjAlMjAlMjAlMjByZXBvX2lkJTNEJTIybGV3dHVuJTJGZ2l0aHViLWlzc3VlcyUyMiUyQyUwQSUyMCUyMCUyMCUyMGZpbGVuYW1lJTNEJTIyZGF0YXNldHMtaXNzdWVzLXdpdGgtY29tbWVudHMuanNvbmwlMjIlMkMlMEElMjAlMjAlMjAlMjByZXBvX3R5cGUlM0QlMjJkYXRhc2V0JTIyJTJDJTBBKQ==",highlighted:`<span class="hljs-keyword">from</span> huggingface_hub <span class="hljs-keyword">import</span> hf_hub_url

data_files = hf_hub_url(
    repo_id=<span class="hljs-string">&quot;lewtun/github-issues&quot;</span>,
    filename=<span class="hljs-string">&quot;datasets-issues-with-comments.jsonl&quot;</span>,
    repo_type=<span class="hljs-string">&quot;dataset&quot;</span>,
)`,wrap:!1}}),L=new h({props:{code:"ZnJvbSUyMGRhdGFzZXRzJTIwaW1wb3J0JTIwbG9hZF9kYXRhc2V0JTBBJTBBaXNzdWVzX2RhdGFzZXQlMjAlM0QlMjBsb2FkX2RhdGFzZXQoJTIyanNvbiUyMiUyQyUyMGRhdGFfZmlsZXMlM0RkYXRhX2ZpbGVzJTJDJTIwc3BsaXQlM0QlMjJ0cmFpbiUyMiklMEFpc3N1ZXNfZGF0YXNldA==",highlighted:`<span class="hljs-keyword">from</span> datasets <span class="hljs-keyword">import</span> load_dataset

issues_dataset = load_dataset(<span class="hljs-string">&quot;json&quot;</span>, data_files=data_files, split=<span class="hljs-string">&quot;train&quot;</span>)
issues_dataset`,wrap:!1}}),K=new h({props:{code:"RGF0YXNldCglN0IlMEElMjAlMjAlMjAlMjBmZWF0dXJlcyUzQSUyMCU1Qid1cmwnJTJDJTIwJ3JlcG9zaXRvcnlfdXJsJyUyQyUyMCdsYWJlbHNfdXJsJyUyQyUyMCdjb21tZW50c191cmwnJTJDJTIwJ2V2ZW50c191cmwnJTJDJTIwJ2h0bWxfdXJsJyUyQyUyMCdpZCclMkMlMjAnbm9kZV9pZCclMkMlMjAnbnVtYmVyJyUyQyUyMCd0aXRsZSclMkMlMjAndXNlciclMkMlMjAnbGFiZWxzJyUyQyUyMCdzdGF0ZSclMkMlMjAnbG9ja2VkJyUyQyUyMCdhc3NpZ25lZSclMkMlMjAnYXNzaWduZWVzJyUyQyUyMCdtaWxlc3RvbmUnJTJDJTIwJ2NvbW1lbnRzJyUyQyUyMCdjcmVhdGVkX2F0JyUyQyUyMCd1cGRhdGVkX2F0JyUyQyUyMCdjbG9zZWRfYXQnJTJDJTIwJ2F1dGhvcl9hc3NvY2lhdGlvbiclMkMlMjAnYWN0aXZlX2xvY2tfcmVhc29uJyUyQyUyMCdwdWxsX3JlcXVlc3QnJTJDJTIwJ2JvZHknJTJDJTIwJ3BlcmZvcm1lZF92aWFfZ2l0aHViX2FwcCclMkMlMjAnaXNfcHVsbF9yZXF1ZXN0JyU1RCUyQyUwQSUyMCUyMCUyMCUyMG51bV9yb3dzJTNBJTIwMjg1NSUwQSU3RCk=",highlighted:`Dataset({
    features: [<span class="hljs-string">&#x27;url&#x27;</span>, <span class="hljs-string">&#x27;repository_url&#x27;</span>, <span class="hljs-string">&#x27;labels_url&#x27;</span>, <span class="hljs-string">&#x27;comments_url&#x27;</span>, <span class="hljs-string">&#x27;events_url&#x27;</span>, <span class="hljs-string">&#x27;html_url&#x27;</span>, <span class="hljs-string">&#x27;id&#x27;</span>, <span class="hljs-string">&#x27;node_id&#x27;</span>, <span class="hljs-string">&#x27;number&#x27;</span>, <span class="hljs-string">&#x27;title&#x27;</span>, <span class="hljs-string">&#x27;user&#x27;</span>, <span class="hljs-string">&#x27;labels&#x27;</span>, <span class="hljs-string">&#x27;state&#x27;</span>, <span class="hljs-string">&#x27;locked&#x27;</span>, <span class="hljs-string">&#x27;assignee&#x27;</span>, <span class="hljs-string">&#x27;assignees&#x27;</span>, <span class="hljs-string">&#x27;milestone&#x27;</span>, <span class="hljs-string">&#x27;comments&#x27;</span>, <span class="hljs-string">&#x27;created_at&#x27;</span>, <span class="hljs-string">&#x27;updated_at&#x27;</span>, <span class="hljs-string">&#x27;closed_at&#x27;</span>, <span class="hljs-string">&#x27;author_association&#x27;</span>, <span class="hljs-string">&#x27;active_lock_reason&#x27;</span>, <span class="hljs-string">&#x27;pull_request&#x27;</span>, <span class="hljs-string">&#x27;body&#x27;</span>, <span class="hljs-string">&#x27;performed_via_github_app&#x27;</span>, <span class="hljs-string">&#x27;is_pull_request&#x27;</span>],
    num_rows: <span class="hljs-number">2855</span>
})`,wrap:!1}}),O=new h({props:{code:"aXNzdWVzX2RhdGFzZXQlMjAlM0QlMjBpc3N1ZXNfZGF0YXNldC5maWx0ZXIoJTBBJTIwJTIwJTIwJTIwbGFtYmRhJTIweCUzQSUyMCh4JTVCJTIyaXNfcHVsbF9yZXF1ZXN0JTIyJTVEJTIwJTNEJTNEJTIwRmFsc2UlMjBhbmQlMjBsZW4oeCU1QiUyMmNvbW1lbnRzJTIyJTVEKSUyMCUzRSUyMDApJTBBKSUwQWlzc3Vlc19kYXRhc2V0",highlighted:`issues_dataset = issues_dataset.<span class="hljs-built_in">filter</span>(
    <span class="hljs-keyword">lambda</span> x: (x[<span class="hljs-string">&quot;is_pull_request&quot;</span>] == <span class="hljs-literal">False</span> <span class="hljs-keyword">and</span> <span class="hljs-built_in">len</span>(x[<span class="hljs-string">&quot;comments&quot;</span>]) &gt; <span class="hljs-number">0</span>)
)
issues_dataset`,wrap:!1}}),ll=new h({props:{code:"RGF0YXNldCglN0IlMEElMjAlMjAlMjAlMjBmZWF0dXJlcyUzQSUyMCU1Qid1cmwnJTJDJTIwJ3JlcG9zaXRvcnlfdXJsJyUyQyUyMCdsYWJlbHNfdXJsJyUyQyUyMCdjb21tZW50c191cmwnJTJDJTIwJ2V2ZW50c191cmwnJTJDJTIwJ2h0bWxfdXJsJyUyQyUyMCdpZCclMkMlMjAnbm9kZV9pZCclMkMlMjAnbnVtYmVyJyUyQyUyMCd0aXRsZSclMkMlMjAndXNlciclMkMlMjAnbGFiZWxzJyUyQyUyMCdzdGF0ZSclMkMlMjAnbG9ja2VkJyUyQyUyMCdhc3NpZ25lZSclMkMlMjAnYXNzaWduZWVzJyUyQyUyMCdtaWxlc3RvbmUnJTJDJTIwJ2NvbW1lbnRzJyUyQyUyMCdjcmVhdGVkX2F0JyUyQyUyMCd1cGRhdGVkX2F0JyUyQyUyMCdjbG9zZWRfYXQnJTJDJTIwJ2F1dGhvcl9hc3NvY2lhdGlvbiclMkMlMjAnYWN0aXZlX2xvY2tfcmVhc29uJyUyQyUyMCdwdWxsX3JlcXVlc3QnJTJDJTIwJ2JvZHknJTJDJTIwJ3BlcmZvcm1lZF92aWFfZ2l0aHViX2FwcCclMkMlMjAnaXNfcHVsbF9yZXF1ZXN0JyU1RCUyQyUwQSUyMCUyMCUyMCUyMG51bV9yb3dzJTNBJTIwNzcxJTBBJTdEKQ==",highlighted:`Dataset({
    features: [<span class="hljs-string">&#x27;url&#x27;</span>, <span class="hljs-string">&#x27;repository_url&#x27;</span>, <span class="hljs-string">&#x27;labels_url&#x27;</span>, <span class="hljs-string">&#x27;comments_url&#x27;</span>, <span class="hljs-string">&#x27;events_url&#x27;</span>, <span class="hljs-string">&#x27;html_url&#x27;</span>, <span class="hljs-string">&#x27;id&#x27;</span>, <span class="hljs-string">&#x27;node_id&#x27;</span>, <span class="hljs-string">&#x27;number&#x27;</span>, <span class="hljs-string">&#x27;title&#x27;</span>, <span class="hljs-string">&#x27;user&#x27;</span>, <span class="hljs-string">&#x27;labels&#x27;</span>, <span class="hljs-string">&#x27;state&#x27;</span>, <span class="hljs-string">&#x27;locked&#x27;</span>, <span class="hljs-string">&#x27;assignee&#x27;</span>, <span class="hljs-string">&#x27;assignees&#x27;</span>, <span class="hljs-string">&#x27;milestone&#x27;</span>, <span class="hljs-string">&#x27;comments&#x27;</span>, <span class="hljs-string">&#x27;created_at&#x27;</span>, <span class="hljs-string">&#x27;updated_at&#x27;</span>, <span class="hljs-string">&#x27;closed_at&#x27;</span>, <span class="hljs-string">&#x27;author_association&#x27;</span>, <span class="hljs-string">&#x27;active_lock_reason&#x27;</span>, <span class="hljs-string">&#x27;pull_request&#x27;</span>, <span class="hljs-string">&#x27;body&#x27;</span>, <span class="hljs-string">&#x27;performed_via_github_app&#x27;</span>, <span class="hljs-string">&#x27;is_pull_request&#x27;</span>],
    num_rows: <span class="hljs-number">771</span>
})`,wrap:!1}}),sl=new h({props:{code:"Y29sdW1ucyUyMCUzRCUyMGlzc3Vlc19kYXRhc2V0LmNvbHVtbl9uYW1lcyUwQWNvbHVtbnNfdG9fa2VlcCUyMCUzRCUyMCU1QiUyMnRpdGxlJTIyJTJDJTIwJTIyYm9keSUyMiUyQyUyMCUyMmh0bWxfdXJsJTIyJTJDJTIwJTIyY29tbWVudHMlMjIlNUQlMEFjb2x1bW5zX3RvX3JlbW92ZSUyMCUzRCUyMHNldChjb2x1bW5zX3RvX2tlZXApLnN5bW1ldHJpY19kaWZmZXJlbmNlKGNvbHVtbnMpJTBBaXNzdWVzX2RhdGFzZXQlMjAlM0QlMjBpc3N1ZXNfZGF0YXNldC5yZW1vdmVfY29sdW1ucyhjb2x1bW5zX3RvX3JlbW92ZSklMEFpc3N1ZXNfZGF0YXNldA==",highlighted:`columns = issues_dataset.column_names
columns_to_keep = [<span class="hljs-string">&quot;title&quot;</span>, <span class="hljs-string">&quot;body&quot;</span>, <span class="hljs-string">&quot;html_url&quot;</span>, <span class="hljs-string">&quot;comments&quot;</span>]
columns_to_remove = <span class="hljs-built_in">set</span>(columns_to_keep).symmetric_difference(columns)
issues_dataset = issues_dataset.remove_columns(columns_to_remove)
issues_dataset`,wrap:!1}}),el=new h({props:{code:"RGF0YXNldCglN0IlMEElMjAlMjAlMjAlMjBmZWF0dXJlcyUzQSUyMCU1QidodG1sX3VybCclMkMlMjAndGl0bGUnJTJDJTIwJ2NvbW1lbnRzJyUyQyUyMCdib2R5JyU1RCUyQyUwQSUyMCUyMCUyMCUyMG51bV9yb3dzJTNBJTIwNzcxJTBBJTdEKQ==",highlighted:`Dataset({
    features: [<span class="hljs-string">&#x27;html_url&#x27;</span>, <span class="hljs-string">&#x27;title&#x27;</span>, <span class="hljs-string">&#x27;comments&#x27;</span>, <span class="hljs-string">&#x27;body&#x27;</span>],
    num_rows: <span class="hljs-number">771</span>
})`,wrap:!1}}),nl=new h({props:{code:"aXNzdWVzX2RhdGFzZXQuc2V0X2Zvcm1hdCglMjJwYW5kYXMlMjIpJTBBZGYlMjAlM0QlMjBpc3N1ZXNfZGF0YXNldCU1QiUzQSU1RA==",highlighted:`issues_dataset.set_format(<span class="hljs-string">&quot;pandas&quot;</span>)
df = issues_dataset[:]`,wrap:!1}}),pl=new h({props:{code:"ZGYlNUIlMjJjb21tZW50cyUyMiU1RCU1QjAlNUQudG9saXN0KCk=",highlighted:'df[<span class="hljs-string">&quot;comments&quot;</span>][<span class="hljs-number">0</span>].tolist()',wrap:!1}}),il=new h({props:{code:"JTVCJ3RoZSUyMGJ1ZyUyMGNvZGUlMjBsb2NhdGUlMjBpbiUyMCVFRiVCQyU5QSU1Q3IlNUNuJTIwJTIwJTIwJTIwaWYlMjBkYXRhX2FyZ3MudGFza19uYW1lJTIwaXMlMjBub3QlMjBOb25lJTNBJTVDciU1Q24lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjMlMjBEb3dubG9hZGluZyUyMGFuZCUyMGxvYWRpbmclMjBhJTIwZGF0YXNldCUyMGZyb20lMjB0aGUlMjBodWIuJTVDciU1Q24lMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBkYXRhc2V0cyUyMCUzRCUyMGxvYWRfZGF0YXNldCglMjJnbHVlJTIyJTJDJTIwZGF0YV9hcmdzLnRhc2tfbmFtZSUyQyUyMGNhY2hlX2RpciUzRG1vZGVsX2FyZ3MuY2FjaGVfZGlyKSclMkMlMEElMjAnSGklMjAlNDBqaW5lYyUyQyU1Q3IlNUNuJTVDciU1Q25Gcm9tJTIwdGltZSUyMHRvJTIwdGltZSUyMHdlJTIwZ2V0JTIwdGhpcyUyMGtpbmQlMjBvZiUyMCU2MENvbm5lY3Rpb25FcnJvciU2MCUyMGNvbWluZyUyMGZyb20lMjB0aGUlMjBnaXRodWIuY29tJTIwd2Vic2l0ZSUzQSUyMGh0dHBzJTNBJTJGJTJGcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSU1Q3IlNUNuJTVDciU1Q25Ob3JtYWxseSUyQyUyMGl0JTIwc2hvdWxkJTIwd29yayUyMGlmJTIweW91JTIwd2FpdCUyMGElMjBsaXR0bGUlMjBhbmQlMjB0aGVuJTIwcmV0cnkuJTVDciU1Q24lNUNyJTVDbkNvdWxkJTIweW91JTIwcGxlYXNlJTIwY29uZmlybSUyMGlmJTIwdGhlJTIwcHJvYmxlbSUyMHBlcnNpc3RzJTNGJyUyQyUwQSUyMCdjYW5ub3QlMjBjb25uZWN0JUVGJUJDJThDZXZlbiUyMGJ5JTIwV2ViJTIwYnJvd3NlciVFRiVCQyU4Q3BsZWFzZSUyMGNoZWNrJTIwdGhhdCUyMCUyMHRoZXJlJTIwaXMlMjBzb21lJTIwJTIwcHJvYmxlbXMlRTMlODAlODInJTJDJTBBJTIwJ0klMjBjYW4lMjBhY2Nlc3MlMjBodHRwcyUzQSUyRiUyRnJhdy5naXRodWJ1c2VyY29udGVudC5jb20lMkZodWdnaW5nZmFjZSUyRmRhdGFzZXRzJTJGMS43LjAlMkZkYXRhc2V0cyUyRmdsdWUlMkZnbHVlLnB5JTIwd2l0aG91dCUyMHByb2JsZW0uLi4nJTVE",highlighted:`[<span class="hljs-string">&#x27;the bug code locate in ：\\r\\n    if data_args.task_name is not None:\\r\\n        # Downloading and loading a dataset from the hub.\\r\\n        datasets = load_dataset(&quot;glue&quot;, data_args.task_name, cache_dir=model_args.cache_dir)&#x27;</span>,
 <span class="hljs-string">&#x27;Hi @jinec,\\r\\n\\r\\nFrom time to time we get this kind of \`ConnectionError\` coming from the github.com website: https://raw.githubusercontent.com\\r\\n\\r\\nNormally, it should work if you wait a little and then retry.\\r\\n\\r\\nCould you please confirm if the problem persists?&#x27;</span>,
 <span class="hljs-string">&#x27;cannot connect，even by Web browser，please check that  there is some  problems。&#x27;</span>,
 <span class="hljs-string">&#x27;I can access https://raw.githubusercontent.com/huggingface/datasets/1.7.0/datasets/glue/glue.py without problem...&#x27;</span>]`,wrap:!1}}),cl=new h({props:{code:"Y29tbWVudHNfZGYlMjAlM0QlMjBkZi5leHBsb2RlKCUyMmNvbW1lbnRzJTIyJTJDJTIwaWdub3JlX2luZGV4JTNEVHJ1ZSklMEFjb21tZW50c19kZi5oZWFkKDQp",highlighted:`comments_df = df.explode(<span class="hljs-string">&quot;comments&quot;</span>, ignore_index=<span class="hljs-literal">True</span>)
comments_df.head(<span class="hljs-number">4</span>)`,wrap:!1}}),ml=new h({props:{code:"ZnJvbSUyMGRhdGFzZXRzJTIwaW1wb3J0JTIwRGF0YXNldCUwQSUwQWNvbW1lbnRzX2RhdGFzZXQlMjAlM0QlMjBEYXRhc2V0LmZyb21fcGFuZGFzKGNvbW1lbnRzX2RmKSUwQWNvbW1lbnRzX2RhdGFzZXQ=",highlighted:`<span class="hljs-keyword">from</span> datasets <span class="hljs-keyword">import</span> Dataset

comments_dataset = Dataset.from_pandas(comments_df)
comments_dataset`,wrap:!1}}),rl=new h({props:{code:"RGF0YXNldCglN0IlMEElMjAlMjAlMjAlMjBmZWF0dXJlcyUzQSUyMCU1QidodG1sX3VybCclMkMlMjAndGl0bGUnJTJDJTIwJ2NvbW1lbnRzJyUyQyUyMCdib2R5JyU1RCUyQyUwQSUyMCUyMCUyMCUyMG51bV9yb3dzJTNBJTIwMjg0MiUwQSU3RCk=",highlighted:`Dataset({
    features: [<span class="hljs-string">&#x27;html_url&#x27;</span>, <span class="hljs-string">&#x27;title&#x27;</span>, <span class="hljs-string">&#x27;comments&#x27;</span>, <span class="hljs-string">&#x27;body&#x27;</span>],
    num_rows: <span class="hljs-number">2842</span>
})`,wrap:!1}}),z=new Ks({props:{$$slots:{default:[oe]},$$scope:{ctx:C}}}),ul=new h({props:{code:"Y29tbWVudHNfZGF0YXNldCUyMCUzRCUyMGNvbW1lbnRzX2RhdGFzZXQubWFwKCUwQSUyMCUyMCUyMCUyMGxhbWJkYSUyMHglM0ElMjAlN0IlMjJjb21tZW50X2xlbmd0aCUyMiUzQSUyMGxlbih4JTVCJTIyY29tbWVudHMlMjIlNUQuc3BsaXQoKSklN0QlMEEp",highlighted:`comments_dataset = comments_dataset.<span class="hljs-built_in">map</span>(
    <span class="hljs-keyword">lambda</span> x: {<span class="hljs-string">&quot;comment_length&quot;</span>: <span class="hljs-built_in">len</span>(x[<span class="hljs-string">&quot;comments&quot;</span>].split())}
)`,wrap:!1}}),bl=new h({props:{code:"Y29tbWVudHNfZGF0YXNldCUyMCUzRCUyMGNvbW1lbnRzX2RhdGFzZXQuZmlsdGVyKGxhbWJkYSUyMHglM0ElMjB4JTVCJTIyY29tbWVudF9sZW5ndGglMjIlNUQlMjAlM0UlMjAxNSklMEFjb21tZW50c19kYXRhc2V0",highlighted:`comments_dataset = comments_dataset.<span class="hljs-built_in">filter</span>(<span class="hljs-keyword">lambda</span> x: x[<span class="hljs-string">&quot;comment_length&quot;</span>] &gt; <span class="hljs-number">15</span>)
comments_dataset`,wrap:!1}}),jl=new h({props:{code:"RGF0YXNldCglN0IlMEElMjAlMjAlMjAlMjBmZWF0dXJlcyUzQSUyMCU1QidodG1sX3VybCclMkMlMjAndGl0bGUnJTJDJTIwJ2NvbW1lbnRzJyUyQyUyMCdib2R5JyUyQyUyMCdjb21tZW50X2xlbmd0aCclNUQlMkMlMEElMjAlMjAlMjAlMjBudW1fcm93cyUzQSUyMDIwOTglMEElN0Qp",highlighted:`Dataset({
    features: [<span class="hljs-string">&#x27;html_url&#x27;</span>, <span class="hljs-string">&#x27;title&#x27;</span>, <span class="hljs-string">&#x27;comments&#x27;</span>, <span class="hljs-string">&#x27;body&#x27;</span>, <span class="hljs-string">&#x27;comment_length&#x27;</span>],
    num_rows: <span class="hljs-number">2098</span>
})`,wrap:!1}}),hl=new h({props:{code:"ZGVmJTIwY29uY2F0ZW5hdGVfdGV4dChleGFtcGxlcyklM0ElMEElMjAlMjAlMjAlMjByZXR1cm4lMjAlN0IlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjJ0ZXh0JTIyJTNBJTIwZXhhbXBsZXMlNUIlMjJ0aXRsZSUyMiU1RCUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyQiUyMCUyMiUyMCU1Q24lMjAlMjIlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMkIlMjBleGFtcGxlcyU1QiUyMmJvZHklMjIlNUQlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjAlMkIlMjAlMjIlMjAlNUNuJTIwJTIyJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTJCJTIwZXhhbXBsZXMlNUIlMjJjb21tZW50cyUyMiU1RCUwQSUyMCUyMCUyMCUyMCU3RCUwQSUwQSUwQWNvbW1lbnRzX2RhdGFzZXQlMjAlM0QlMjBjb21tZW50c19kYXRhc2V0Lm1hcChjb25jYXRlbmF0ZV90ZXh0KQ==",highlighted:`<span class="hljs-keyword">def</span> <span class="hljs-title function_">concatenate_text</span>(<span class="hljs-params">examples</span>):
    <span class="hljs-keyword">return</span> {
        <span class="hljs-string">&quot;text&quot;</span>: examples[<span class="hljs-string">&quot;title&quot;</span>]
        + <span class="hljs-string">&quot; \\n &quot;</span>
        + examples[<span class="hljs-string">&quot;body&quot;</span>]
        + <span class="hljs-string">&quot; \\n &quot;</span>
        + examples[<span class="hljs-string">&quot;comments&quot;</span>]
    }


comments_dataset = comments_dataset.<span class="hljs-built_in">map</span>(concatenate_text)`,wrap:!1}}),fl=new Pl({props:{title:"Создание текстовых эмбединнгов",local:"создание-текстовых-эмбединнгов",headingTag:"h2"}});const zs=[re,me],vl=[];function Fs(l,t){return l[0]==="pt"?0:1}B=Fs(C),N=vl[B]=zs[B](C),gl=new h({props:{code:"ZGVmJTIwY2xzX3Bvb2xpbmcobW9kZWxfb3V0cHV0KSUzQSUwQSUyMCUyMCUyMCUyMHJldHVybiUyMG1vZGVsX291dHB1dC5sYXN0X2hpZGRlbl9zdGF0ZSU1QiUzQSUyQyUyMDAlNUQ=",highlighted:`<span class="hljs-keyword">def</span> <span class="hljs-title function_">cls_pooling</span>(<span class="hljs-params">model_output</span>):
    <span class="hljs-keyword">return</span> model_output.last_hidden_state[:, <span class="hljs-number">0</span>]`,wrap:!1}});const Ss=[ye,Ue],El=[];function vs(l,t){return l[0]==="pt"?0:1}X=vs(C),x=El[X]=Ss[X](C),Il=new Pl({props:{title:"Использование FAISS для эффективного семантического поиска",local:"использование-faiss-для-эффективного-семантического-поиска",headingTag:"h2"}}),Rl=new h({props:{code:"ZW1iZWRkaW5nc19kYXRhc2V0LmFkZF9mYWlzc19pbmRleChjb2x1bW4lM0QlMjJlbWJlZGRpbmdzJTIyKQ==",highlighted:'embeddings_dataset.add_faiss_index(column=<span class="hljs-string">&quot;embeddings&quot;</span>)',wrap:!1}});const Es=[Je,ue],Hl=[];function Hs(l,t){return l[0]==="pt"?0:1}return V=Hs(C),W=Hl[V]=Es[V](C),Nl=new h({props:{code:"c2NvcmVzJTJDJTIwc2FtcGxlcyUyMCUzRCUyMGVtYmVkZGluZ3NfZGF0YXNldC5nZXRfbmVhcmVzdF9leGFtcGxlcyglMEElMjAlMjAlMjAlMjAlMjJlbWJlZGRpbmdzJTIyJTJDJTIwcXVlc3Rpb25fZW1iZWRkaW5nJTJDJTIwayUzRDUlMEEp",highlighted:`scores, samples = embeddings_dataset.get_nearest_examples(
    <span class="hljs-string">&quot;embeddings&quot;</span>, question_embedding, k=<span class="hljs-number">5</span>
)`,wrap:!1}}),xl=new h({props:{code:"aW1wb3J0JTIwcGFuZGFzJTIwYXMlMjBwZCUwQSUwQXNhbXBsZXNfZGYlMjAlM0QlMjBwZC5EYXRhRnJhbWUuZnJvbV9kaWN0KHNhbXBsZXMpJTBBc2FtcGxlc19kZiU1QiUyMnNjb3JlcyUyMiU1RCUyMCUzRCUyMHNjb3JlcyUwQXNhbXBsZXNfZGYuc29ydF92YWx1ZXMoJTIyc2NvcmVzJTIyJTJDJTIwYXNjZW5kaW5nJTNERmFsc2UlMkMlMjBpbnBsYWNlJTNEVHJ1ZSk=",highlighted:`<span class="hljs-keyword">import</span> pandas <span class="hljs-keyword">as</span> pd

samples_df = pd.DataFrame.from_dict(samples)
samples_df[<span class="hljs-string">&quot;scores&quot;</span>] = scores
samples_df.sort_values(<span class="hljs-string">&quot;scores&quot;</span>, ascending=<span class="hljs-literal">False</span>, inplace=<span class="hljs-literal">True</span>)`,wrap:!1}}),Wl=new h({props:{code:"Zm9yJTIwXyUyQyUyMHJvdyUyMGluJTIwc2FtcGxlc19kZi5pdGVycm93cygpJTNBJTBBJTIwJTIwJTIwJTIwcHJpbnQoZiUyMkNPTU1FTlQlM0ElMjAlN0Jyb3cuY29tbWVudHMlN0QlMjIpJTBBJTIwJTIwJTIwJTIwcHJpbnQoZiUyMlNDT1JFJTNBJTIwJTdCcm93LnNjb3JlcyU3RCUyMiklMEElMjAlMjAlMjAlMjBwcmludChmJTIyVElUTEUlM0ElMjAlN0Jyb3cudGl0bGUlN0QlMjIpJTBBJTIwJTIwJTIwJTIwcHJpbnQoZiUyMlVSTCUzQSUyMCU3QnJvdy5odG1sX3VybCU3RCUyMiklMEElMjAlMjAlMjAlMjBwcmludCglMjIlM0QlMjIlMjAqJTIwNTApJTBBJTIwJTIwJTIwJTIwcHJpbnQoKQ==",highlighted:`<span class="hljs-keyword">for</span> _, row <span class="hljs-keyword">in</span> samples_df.iterrows():
    <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;COMMENT: <span class="hljs-subst">{row.comments}</span>&quot;</span>)
    <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;SCORE: <span class="hljs-subst">{row.scores}</span>&quot;</span>)
    <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;TITLE: <span class="hljs-subst">{row.title}</span>&quot;</span>)
    <span class="hljs-built_in">print</span>(<span class="hljs-string">f&quot;URL: <span class="hljs-subst">{row.html_url}</span>&quot;</span>)
    <span class="hljs-built_in">print</span>(<span class="hljs-string">&quot;=&quot;</span> * <span class="hljs-number">50</span>)
    <span class="hljs-built_in">print</span>()`,wrap:!1}}),Yl=new h({props:{code:" ",highlighted:`<span class="hljs-string">&quot;&quot;&quot;
COMMENT: Requiring online connection is a deal breaker in some cases unfortunately so it&#x27;d be great if offline mode is added similar to how \`transformers\` loads models offline fine.

@mandubian&#x27;s second bullet point suggests that there&#x27;s a workaround allowing you to use your offline (custom?) dataset with \`datasets\`. Could you please elaborate on how that should look like?
SCORE: 25.505046844482422
TITLE: Discussion using datasets in offline mode
URL: https://github.com/huggingface/datasets/issues/824
==================================================

COMMENT: The local dataset builders (csv, text , json and pandas) are now part of the \`datasets\` package since #1726 :)
You can now use them offline
\\\`\\\`\\\`python
datasets = load_dataset(&quot;text&quot;, data_files=data_files)
\\\`\\\`\\\`

We&#x27;ll do a new release soon
SCORE: 24.555509567260742
TITLE: Discussion using datasets in offline mode
URL: https://github.com/huggingface/datasets/issues/824
==================================================

COMMENT: I opened a PR that allows to reload modules that have already been loaded once even if there&#x27;s no internet.

Let me know if you know other ways that can make the offline mode experience better. I&#x27;d be happy to add them :)

I already note the &quot;freeze&quot; modules option, to prevent local modules updates. It would be a cool feature.

----------

&gt; @mandubian&#x27;s second bullet point suggests that there&#x27;s a workaround allowing you to use your offline (custom?) dataset with \`datasets\`. Could you please elaborate on how that should look like?

Indeed \`load_dataset\` allows to load remote dataset script (squad, glue, etc.) but also you own local ones.
For example if you have a dataset script at \`./my_dataset/my_dataset.py\` then you can do
\\\`\\\`\\\`python
load_dataset(&quot;./my_dataset&quot;)
\\\`\\\`\\\`
and the dataset script will generate your dataset once and for all.

----------

About I&#x27;m looking into having \`csv\`, \`json\`, \`text\`, \`pandas\` dataset builders already included in the \`datasets\` package, so that they are available offline by default, as opposed to the other datasets that require the script to be downloaded.
cf #1724
SCORE: 24.14896583557129
TITLE: Discussion using datasets in offline mode
URL: https://github.com/huggingface/datasets/issues/824
==================================================

COMMENT: &gt; here is my way to load a dataset offline, but it **requires** an online machine
&gt;
&gt; 1. (online machine)
&gt;
&gt; \`\`\`
&gt;
&gt; import datasets
&gt;
&gt; data = datasets.load_dataset(...)
&gt;
&gt; data.save_to_disk(/YOUR/DATASET/DIR)
&gt;
&gt; \`\`\`
&gt;
&gt; 2. copy the dir from online to the offline machine
&gt;
&gt; 3. (offline machine)
&gt;
&gt; \`\`\`
&gt;
&gt; import datasets
&gt;
&gt; data = datasets.load_from_disk(/SAVED/DATA/DIR)
&gt;
&gt; \`\`\`
&gt;
&gt;
&gt;
&gt; HTH.


SCORE: 22.893993377685547
TITLE: Discussion using datasets in offline mode
URL: https://github.com/huggingface/datasets/issues/824
==================================================

COMMENT: here is my way to load a dataset offline, but it **requires** an online machine
1. (online machine)
\\\`\\\`\\\`
import datasets
data = datasets.load_dataset(...)
data.save_to_disk(/YOUR/DATASET/DIR)
\\\`\\\`\\\`
2. copy the dir from online to the offline machine
3. (offline machine)
\\\`\\\`\\\`
import datasets
data = datasets.load_from_disk(/SAVED/DATA/DIR)
\\\`\\\`\\\`

HTH.
SCORE: 22.406635284423828
TITLE: Discussion using datasets in offline mode
URL: https://github.com/huggingface/datasets/issues/824
==================================================
&quot;&quot;&quot;</span>`,wrap:!1}}),F=new Ks({props:{$$slots:{default:[be]},$$scope:{ctx:C}}}),Fl=new ie({props:{source:"https://github.com/huggingface/course/blob/main/chapters/ru/chapter5/6.mdx"}}),{c(){a=j("meta"),m=p(),n=j("p"),f=p(),U(d.$$.fragment),r=p(),U(G.$$.fragment),b=p(),g.c(),R=p(),$=j("p"),$.innerHTML=I,k=p(),U(M.$$.fragment),Q=p(),U(S.$$.fragment),Ol=p(),v=j("p"),v.innerHTML=os,lt=p(),E=j("p"),E.textContent=ms,tt=p(),Y=j("div"),Y.innerHTML=rs,st=p(),U(H.$$.fragment),et=p(),A=j("p"),A.textContent=Us,at=p(),U(D.$$.fragment),nt=p(),q=j("p"),q.innerHTML=ys,Mt=p(),U(L.$$.fragment),pt=p(),U(K.$$.fragment),it=p(),P=j("p"),P.innerHTML=us,dt=p(),U(O.$$.fragment),ct=p(),U(ll.$$.fragment),ot=p(),tl=j("p"),tl.innerHTML=Js,mt=p(),U(sl.$$.fragment),rt=p(),U(el.$$.fragment),Ut=p(),al=j("p"),al.innerHTML=bs,yt=p(),U(nl.$$.fragment),ut=p(),Ml=j("p"),Ml.innerHTML=js,Jt=p(),U(pl.$$.fragment),bt=p(),U(il.$$.fragment),jt=p(),dl=j("p"),dl.innerHTML=Ts,Tt=p(),U(cl.$$.fragment),ht=p(),_=j("table"),_.innerHTML=hs,wt=p(),ol=j("p"),ol.innerHTML=ws,ft=p(),U(ml.$$.fragment),Qt=p(),U(rl.$$.fragment),Zt=p(),Ul=j("p"),Ul.textContent=fs,gt=p(),U(z.$$.fragment),Gt=p(),yl=j("p"),yl.innerHTML=Qs,Ct=p(),U(ul.$$.fragment),It=p(),Jl=j("p"),Jl.textContent=Zs,$t=p(),U(bl.$$.fragment),kt=p(),U(jl.$$.fragment),Rt=p(),Tl=j("p"),Tl.innerHTML=gs,_t=p(),U(hl.$$.fragment),Bt=p(),wl=j("p"),wl.textContent=Gs,Nt=p(),U(fl.$$.fragment),Xt=p(),Ql=j("p"),Ql.innerHTML=Cs,xt=p(),N.c(),Al=p(),Zl=j("p"),Zl.innerHTML=Is,Vt=p(),U(gl.$$.fragment),Wt=p(),Gl=j("p"),Gl.textContent=$s,Yt=p(),x.c(),Dl=p(),Cl=j("p"),Cl.textContent=ks,zt=p(),U(Il.$$.fragment),Ft=p(),$l=j("p"),$l.innerHTML=Rs,St=p(),kl=j("p"),kl.innerHTML=_s,vt=p(),U(Rl.$$.fragment),Et=p(),_l=j("p"),_l.innerHTML=Bs,Ht=p(),W.c(),ql=p(),Bl=j("p"),Bl.textContent=Ns,At=p(),U(Nl.$$.fragment),Dt=p(),Xl=j("p"),Xl.innerHTML=Xs,qt=p(),U(xl.$$.fragment),Lt=p(),Vl=j("p"),Vl.textContent=xs,Kt=p(),U(Wl.$$.fragment),Pt=p(),U(Yl.$$.fragment),Ot=p(),zl=j("p"),zl.textContent=Vs,ls=p(),U(F.$$.fragment),ts=p(),U(Fl.$$.fragment),ss=p(),Ll=j("p"),this.h()},l(l){const t=ae("svelte-u9bgzb",document.head);a=T(t,"META",{name:!0,content:!0}),t.forEach(s),m=i(l),n=T(l,"P",{}),Ls(n).forEach(s),f=i(l),y(d.$$.fragment,l),r=i(l),y(G.$$.fragment,l),b=i(l),g.l(l),R=i(l),$=T(l,"P",{"data-svelte-h":!0}),w($)!=="svelte-1kqyvl2"&&($.innerHTML=I),k=i(l),y(M.$$.fragment,l),Q=i(l),y(S.$$.fragment,l),Ol=i(l),v=T(l,"P",{"data-svelte-h":!0}),w(v)!=="svelte-u7ovj5"&&(v.innerHTML=os),lt=i(l),E=T(l,"P",{"data-svelte-h":!0}),w(E)!=="svelte-dm8pdq"&&(E.textContent=ms),tt=i(l),Y=T(l,"DIV",{class:!0,"data-svelte-h":!0}),w(Y)!=="svelte-yxatr"&&(Y.innerHTML=rs),st=i(l),y(H.$$.fragment,l),et=i(l),A=T(l,"P",{"data-svelte-h":!0}),w(A)!=="svelte-8ar22o"&&(A.textContent=Us),at=i(l),y(D.$$.fragment,l),nt=i(l),q=T(l,"P",{"data-svelte-h":!0}),w(q)!=="svelte-1ucdqs"&&(q.innerHTML=ys),Mt=i(l),y(L.$$.fragment,l),pt=i(l),y(K.$$.fragment,l),it=i(l),P=T(l,"P",{"data-svelte-h":!0}),w(P)!=="svelte-1ab3s1i"&&(P.innerHTML=us),dt=i(l),y(O.$$.fragment,l),ct=i(l),y(ll.$$.fragment,l),ot=i(l),tl=T(l,"P",{"data-svelte-h":!0}),w(tl)!=="svelte-g25nn8"&&(tl.innerHTML=Js),mt=i(l),y(sl.$$.fragment,l),rt=i(l),y(el.$$.fragment,l),Ut=i(l),al=T(l,"P",{"data-svelte-h":!0}),w(al)!=="svelte-kf244j"&&(al.innerHTML=bs),yt=i(l),y(nl.$$.fragment,l),ut=i(l),Ml=T(l,"P",{"data-svelte-h":!0}),w(Ml)!=="svelte-garzmz"&&(Ml.innerHTML=js),Jt=i(l),y(pl.$$.fragment,l),bt=i(l),y(il.$$.fragment,l),jt=i(l),dl=T(l,"P",{"data-svelte-h":!0}),w(dl)!=="svelte-81f1dh"&&(dl.innerHTML=Ts),Tt=i(l),y(cl.$$.fragment,l),ht=i(l),_=T(l,"TABLE",{border:!0,class:!0,style:!0,"data-svelte-h":!0}),w(_)!=="svelte-1g5whzd"&&(_.innerHTML=hs),wt=i(l),ol=T(l,"P",{"data-svelte-h":!0}),w(ol)!=="svelte-s611ju"&&(ol.innerHTML=ws),ft=i(l),y(ml.$$.fragment,l),Qt=i(l),y(rl.$$.fragment,l),Zt=i(l),Ul=T(l,"P",{"data-svelte-h":!0}),w(Ul)!=="svelte-iyjal4"&&(Ul.textContent=fs),gt=i(l),y(z.$$.fragment,l),Gt=i(l),yl=T(l,"P",{"data-svelte-h":!0}),w(yl)!=="svelte-opu2kq"&&(yl.innerHTML=Qs),Ct=i(l),y(ul.$$.fragment,l),It=i(l),Jl=T(l,"P",{"data-svelte-h":!0}),w(Jl)!=="svelte-7k4b3c"&&(Jl.textContent=Zs),$t=i(l),y(bl.$$.fragment,l),kt=i(l),y(jl.$$.fragment,l),Rt=i(l),Tl=T(l,"P",{"data-svelte-h":!0}),w(Tl)!=="svelte-qjfuzk"&&(Tl.innerHTML=gs),_t=i(l),y(hl.$$.fragment,l),Bt=i(l),wl=T(l,"P",{"data-svelte-h":!0}),w(wl)!=="svelte-12xaa86"&&(wl.textContent=Gs),Nt=i(l),y(fl.$$.fragment,l),Xt=i(l),Ql=T(l,"P",{"data-svelte-h":!0}),w(Ql)!=="svelte-m3fi2j"&&(Ql.innerHTML=Cs),xt=i(l),N.l(l),Al=i(l),Zl=T(l,"P",{"data-svelte-h":!0}),w(Zl)!=="svelte-1hrvssd"&&(Zl.innerHTML=Is),Vt=i(l),y(gl.$$.fragment,l),Wt=i(l),Gl=T(l,"P",{"data-svelte-h":!0}),w(Gl)!=="svelte-x8q51b"&&(Gl.textContent=$s),Yt=i(l),x.l(l),Dl=i(l),Cl=T(l,"P",{"data-svelte-h":!0}),w(Cl)!=="svelte-1o2epj6"&&(Cl.textContent=ks),zt=i(l),y(Il.$$.fragment,l),Ft=i(l),$l=T(l,"P",{"data-svelte-h":!0}),w($l)!=="svelte-l8ge7o"&&($l.innerHTML=Rs),St=i(l),kl=T(l,"P",{"data-svelte-h":!0}),w(kl)!=="svelte-u31vl5"&&(kl.innerHTML=_s),vt=i(l),y(Rl.$$.fragment,l),Et=i(l),_l=T(l,"P",{"data-svelte-h":!0}),w(_l)!=="svelte-1uma1g4"&&(_l.innerHTML=Bs),Ht=i(l),W.l(l),ql=i(l),Bl=T(l,"P",{"data-svelte-h":!0}),w(Bl)!=="svelte-eam6de"&&(Bl.textContent=Ns),At=i(l),y(Nl.$$.fragment,l),Dt=i(l),Xl=T(l,"P",{"data-svelte-h":!0}),w(Xl)!=="svelte-8i9jhj"&&(Xl.innerHTML=Xs),qt=i(l),y(xl.$$.fragment,l),Lt=i(l),Vl=T(l,"P",{"data-svelte-h":!0}),w(Vl)!=="svelte-j9fzh3"&&(Vl.textContent=xs),Kt=i(l),y(Wl.$$.fragment,l),Pt=i(l),y(Yl.$$.fragment,l),Ot=i(l),zl=T(l,"P",{"data-svelte-h":!0}),w(zl)!=="svelte-bi04jq"&&(zl.textContent=Vs),ls=i(l),y(F.$$.fragment,l),ts=i(l),y(Fl.$$.fragment,l),ss=i(l),Ll=T(l,"P",{}),Ls(Ll).forEach(s),this.h()},h(){Kl(a,"name","hf:doc:metadata"),Kl(a,"content",Te),Kl(Y,"class","flex justify-center"),Kl(_,"border","1"),Kl(_,"class","dataframe"),cs(_,"table-layout","fixed"),cs(_,"word-wrap","break-word"),cs(_,"width","100%")},m(l,t){ne(document.head,a),e(l,m,t),e(l,n,t),e(l,f,t),u(d,l,t),e(l,r,t),u(G,l,t),e(l,b,t),Sl[Z].m(l,t),e(l,R,t),e(l,$,t),e(l,k,t),u(M,l,t),e(l,Q,t),u(S,l,t),e(l,Ol,t),e(l,v,t),e(l,lt,t),e(l,E,t),e(l,tt,t),e(l,Y,t),e(l,st,t),u(H,l,t),e(l,et,t),e(l,A,t),e(l,at,t),u(D,l,t),e(l,nt,t),e(l,q,t),e(l,Mt,t),u(L,l,t),e(l,pt,t),u(K,l,t),e(l,it,t),e(l,P,t),e(l,dt,t),u(O,l,t),e(l,ct,t),u(ll,l,t),e(l,ot,t),e(l,tl,t),e(l,mt,t),u(sl,l,t),e(l,rt,t),u(el,l,t),e(l,Ut,t),e(l,al,t),e(l,yt,t),u(nl,l,t),e(l,ut,t),e(l,Ml,t),e(l,Jt,t),u(pl,l,t),e(l,bt,t),u(il,l,t),e(l,jt,t),e(l,dl,t),e(l,Tt,t),u(cl,l,t),e(l,ht,t),e(l,_,t),e(l,wt,t),e(l,ol,t),e(l,ft,t),u(ml,l,t),e(l,Qt,t),u(rl,l,t),e(l,Zt,t),e(l,Ul,t),e(l,gt,t),u(z,l,t),e(l,Gt,t),e(l,yl,t),e(l,Ct,t),u(ul,l,t),e(l,It,t),e(l,Jl,t),e(l,$t,t),u(bl,l,t),e(l,kt,t),u(jl,l,t),e(l,Rt,t),e(l,Tl,t),e(l,_t,t),u(hl,l,t),e(l,Bt,t),e(l,wl,t),e(l,Nt,t),u(fl,l,t),e(l,Xt,t),e(l,Ql,t),e(l,xt,t),vl[B].m(l,t),e(l,Al,t),e(l,Zl,t),e(l,Vt,t),u(gl,l,t),e(l,Wt,t),e(l,Gl,t),e(l,Yt,t),El[X].m(l,t),e(l,Dl,t),e(l,Cl,t),e(l,zt,t),u(Il,l,t),e(l,Ft,t),e(l,$l,t),e(l,St,t),e(l,kl,t),e(l,vt,t),u(Rl,l,t),e(l,Et,t),e(l,_l,t),e(l,Ht,t),Hl[V].m(l,t),e(l,ql,t),e(l,Bl,t),e(l,At,t),u(Nl,l,t),e(l,Dt,t),e(l,Xl,t),e(l,qt,t),u(xl,l,t),e(l,Lt,t),e(l,Vl,t),e(l,Kt,t),u(Wl,l,t),e(l,Pt,t),u(Yl,l,t),e(l,Ot,t),e(l,zl,t),e(l,ls,t),u(F,l,t),e(l,ts,t),u(Fl,l,t),e(l,ss,t),e(l,Ll,t),es=!0},p(l,[t]){const As={};t&1&&(As.fw=l[0]),d.$set(As);let Ms=Z;Z=Ys(l),Z!==Ms&&(ns(),c(Sl[Ms],1,1,()=>{Sl[Ms]=null}),as(),g=Sl[Z],g||(g=Sl[Z]=Ws[Z](l),g.c()),o(g,1),g.m(R.parentNode,R));const Ds={};t&2&&(Ds.$$scope={dirty:t,ctx:l}),z.$set(Ds);let ps=B;B=Fs(l),B!==ps&&(ns(),c(vl[ps],1,1,()=>{vl[ps]=null}),as(),N=vl[B],N||(N=vl[B]=zs[B](l),N.c()),o(N,1),N.m(Al.parentNode,Al));let is=X;X=vs(l),X!==is&&(ns(),c(El[is],1,1,()=>{El[is]=null}),as(),x=El[X],x||(x=El[X]=Ss[X](l),x.c()),o(x,1),x.m(Dl.parentNode,Dl));let ds=V;V=Hs(l),V!==ds&&(ns(),c(Hl[ds],1,1,()=>{Hl[ds]=null}),as(),W=Hl[V],W||(W=Hl[V]=Es[V](l),W.c()),o(W,1),W.m(ql.parentNode,ql));const qs={};t&2&&(qs.$$scope={dirty:t,ctx:l}),F.$set(qs)},i(l){es||(o(d.$$.fragment,l),o(G.$$.fragment,l),o(g),o(M.$$.fragment,l),o(S.$$.fragment,l),o(H.$$.fragment,l),o(D.$$.fragment,l),o(L.$$.fragment,l),o(K.$$.fragment,l),o(O.$$.fragment,l),o(ll.$$.fragment,l),o(sl.$$.fragment,l),o(el.$$.fragment,l),o(nl.$$.fragment,l),o(pl.$$.fragment,l),o(il.$$.fragment,l),o(cl.$$.fragment,l),o(ml.$$.fragment,l),o(rl.$$.fragment,l),o(z.$$.fragment,l),o(ul.$$.fragment,l),o(bl.$$.fragment,l),o(jl.$$.fragment,l),o(hl.$$.fragment,l),o(fl.$$.fragment,l),o(N),o(gl.$$.fragment,l),o(x),o(Il.$$.fragment,l),o(Rl.$$.fragment,l),o(W),o(Nl.$$.fragment,l),o(xl.$$.fragment,l),o(Wl.$$.fragment,l),o(Yl.$$.fragment,l),o(F.$$.fragment,l),o(Fl.$$.fragment,l),es=!0)},o(l){c(d.$$.fragment,l),c(G.$$.fragment,l),c(g),c(M.$$.fragment,l),c(S.$$.fragment,l),c(H.$$.fragment,l),c(D.$$.fragment,l),c(L.$$.fragment,l),c(K.$$.fragment,l),c(O.$$.fragment,l),c(ll.$$.fragment,l),c(sl.$$.fragment,l),c(el.$$.fragment,l),c(nl.$$.fragment,l),c(pl.$$.fragment,l),c(il.$$.fragment,l),c(cl.$$.fragment,l),c(ml.$$.fragment,l),c(rl.$$.fragment,l),c(z.$$.fragment,l),c(ul.$$.fragment,l),c(bl.$$.fragment,l),c(jl.$$.fragment,l),c(hl.$$.fragment,l),c(fl.$$.fragment,l),c(N),c(gl.$$.fragment,l),c(x),c(Il.$$.fragment,l),c(Rl.$$.fragment,l),c(W),c(Nl.$$.fragment,l),c(xl.$$.fragment,l),c(Wl.$$.fragment,l),c(Yl.$$.fragment,l),c(F.$$.fragment,l),c(Fl.$$.fragment,l),es=!1},d(l){l&&(s(m),s(n),s(f),s(r),s(b),s(R),s($),s(k),s(Q),s(Ol),s(v),s(lt),s(E),s(tt),s(Y),s(st),s(et),s(A),s(at),s(nt),s(q),s(Mt),s(pt),s(it),s(P),s(dt),s(ct),s(ot),s(tl),s(mt),s(rt),s(Ut),s(al),s(yt),s(ut),s(Ml),s(Jt),s(bt),s(jt),s(dl),s(Tt),s(ht),s(_),s(wt),s(ol),s(ft),s(Qt),s(Zt),s(Ul),s(gt),s(Gt),s(yl),s(Ct),s(It),s(Jl),s($t),s(kt),s(Rt),s(Tl),s(_t),s(Bt),s(wl),s(Nt),s(Xt),s(Ql),s(xt),s(Al),s(Zl),s(Vt),s(Wt),s(Gl),s(Yt),s(Dl),s(Cl),s(zt),s(Ft),s($l),s(St),s(kl),s(vt),s(Et),s(_l),s(Ht),s(ql),s(Bl),s(At),s(Dt),s(Xl),s(qt),s(Lt),s(Vl),s(Kt),s(Pt),s(Ot),s(zl),s(ls),s(ts),s(ss),s(Ll)),s(a),J(d,l),J(G,l),Sl[Z].d(l),J(M,l),J(S,l),J(H,l),J(D,l),J(L,l),J(K,l),J(O,l),J(ll,l),J(sl,l),J(el,l),J(nl,l),J(pl,l),J(il,l),J(cl,l),J(ml,l),J(rl,l),J(z,l),J(ul,l),J(bl,l),J(jl,l),J(hl,l),J(fl,l),vl[B].d(l),J(gl,l),El[X].d(l),J(Il,l),J(Rl,l),Hl[V].d(l),J(Nl,l),J(xl,l),J(Wl,l),J(Yl,l),J(F,l),J(Fl,l)}}}const Te='{"title":"Семантический поиск с помощью FAISS","local":"семантический-поиск-с-помощью-faiss","sections":[{"title":"Использование эмбеддингов для семанического поиска","local":"использование-эмбеддингов-для-семанического-поиска","sections":[],"depth":2},{"title":"Загрузка и подготовка датасета","local":"загрузка-и-подготовка-датасета","sections":[],"depth":2},{"title":"Создание текстовых эмбединнгов","local":"создание-текстовых-эмбединнгов","sections":[],"depth":2},{"title":"Использование FAISS для эффективного семантического поиска","local":"использование-faiss-для-эффективного-семантического-поиска","sections":[],"depth":2}],"depth":1}';function he(C,a,m){let n="pt";return te(()=>{const f=new URLSearchParams(window.location.search);m(0,n=f.get("fw")||"pt")}),[n]}class $e extends se{constructor(a){super(),ee(this,a,he,je,le,{})}}export{$e as component};
