Проблема БЕРТА с контекстно-семантическим поиском на итальянском языке

#machine-learning #nlp #bert-language-model

Вопрос:

Я использую модель БЕРТА для контекстного поиска на итальянском языке, но она не понимает контекстуального значения предложения и возвращает неверный результат.

в приведенном ниже примере кода, когда я сравниваю «молоко со вкусом шоколада» с двумя другими видами молока и одним шоколадом, он возвращает высокое сходство с шоколадом. это должно вернуть высокое сходство с другими молочными продуктами.

может ли кто-нибудь предложить мне какие-либо улучшения в приведенном ниже коде, чтобы он мог возвращать семантические результаты?

Код :

 !python -m spacy download it_core_news_lg
!pip install sentence-transformers


import scipy
import numpy as np
from sentence_transformers import models, SentenceTransformer
model = SentenceTransformer('distiluse-base-multilingual-cased') # workes with Arabic, Chinese, Dutch, English, French, German, Italian, Korean, Polish, Portuguese, Russian, Spanish, Turkish

corpus = [
          "Alpro, Cioccolato bevanda a base di soia 1 ltr", #Alpro, Chocolate soy drink 1 ltr(soya milk)
          "Milka  cioccolato al latte 100 g", #Milka milk chocolate 100 g
          "Danone, HiPRO 25g Proteine gusto cioccolato 330 ml", #Danone, HiPRO 25g Protein chocolate flavor 330 ml(milk with chocolate flabor)
         ]
corpus_embeddings = model.encode(corpus)


queries = [
            'latte al cioccolato', #milk with chocolate flavor,
          ]
query_embeddings = model.encode(queries)


# Calculate Cosine similarity of query against each sentence i
closest_n = 10
for query, query_embedding in zip(queries, query_embeddings):
    distances = scipy.spatial.distance.cdist([query_embedding], corpus_embeddings, "cosine")[0]

    results = zip(range(len(distances)), distances)
    results = sorted(results, key=lambda x: x[1])

    print("n======================n")
    print("Query:", query)
    print("nTop 10 most similar sentences in corpus:")

    for idx, distance in results[0:closest_n]:
        print(corpus[idx].strip(), "(Score: %.4f)" % (1-distance))
 

Выход :

 ======================

Query: latte al cioccolato

Top 10 most similar sentences in corpus:
Milka  cioccolato al latte 100 g (Score: 0.7714)
Alpro, Cioccolato bevanda a base di soia 1 ltr (Score: 0.5586)
Danone, HiPRO 25g Proteine gusto cioccolato 330 ml (Score: 0.4569)
 

Ответ №1:

Проблема не в вашем коде, а просто в недостаточной производительности модели.

Есть несколько вещей, которые вы можете сделать. Во-первых, вы можете попробовать Универсальный кодировщик предложений (USE). По моему опыту, их вложения немного лучше, по крайней мере, на английском языке.

Во-вторых, вы можете попробовать другую модель, например sentence-transformers/xlm-r-distilroberta-base-paraphrase-v1 . Он основан на Роберте и может дать лучшую производительность.

Теперь вы можете объединить вложения из нескольких моделей (просто объединив представления). В некоторых случаях это помогает, за счет гораздо более тяжелых вычислений.

И, наконец, вы можете создать свою собственную модель. Хорошо известно, что одноязыковые модели работают значительно лучше, чем многоязычные. Вы можете следовать руководству и обучать свою собственную итальянскую модель.