Как работать с «Ergänzungsstrichen» и «Bindestrichen» в немецкой обработке естественного языка?

Вопрос или проблема

Проблема

Во фразе на немецком языке “Haupt- und Nebensatz” в точности такое же значение, как и у “Hauptsatz und Nebensatz”. Однако при преобразовании обеих фраз с использованием, например, конвейера de_core_news_sm из spacy, косинусное сходство полученных векторов значительно различается:

token1 token2 similarity
Haupt- Hauptsatz 0.07
und und 0.67
Nebensatz Nebenssatz 0.87

Код для воспроизведения

import spacy
import numpy as np

def calc_cosine_similarity(a, b):
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

nlp = spacy.load("de_core_news_sm")
doc1 = nlp("Hauptsatz und Nebensatz")
doc2 = nlp("Haupt- und Nebensatz")
for token1, token2 in zip(doc1, doc2):
    similarity = calc_cosine_similarity(token1.vector, token2.vector)
    print(f"{token1.text}: {similarity}")

Мои исследования для решения

В этой бакалаврской диссертации на странице 5 указано:

Различие проводится между фразами с дополнительным дефисом, как в “главные и подчиненные предложения”, и фразами с дефисом, как в “соотношение цены и качества”. Первые разделяются на несколько токенов, вторые образуют один токен. (перевод с оригинального немецкого)

Это звучит так, как будто решение предобработки уже доступно? Однако пока я не нашел никакого решения, например, на https://github.com/adbar/German-NLP, но возможно, я что-то упустил.

Сегодня протестировал bert-base-german-cased из huggingface. Результаты все еще различаются, но стали гораздо более похожими. Кроме того, токенайзер разделяет слова желаемым образом. Это уже может работать для моего случая, так что отмечаю вопрос как решенный.

token1 token2 cos-similarity
[CLS] [CLS] 0.982
Haupt Haupt 0.933
##satz 0.824
und und 0.967
Neben Neben 0.951
##satz ##satz 0.958
[SEP] [SEP] 0.977

Код для воспроизведения:

from transformers import BertTokenizer, BertModel, AutoModel
import numpy as np

tokenizer = AutoTokenizer.from_pretrained("bert-base-german-cased")
model = AutoModel.from_pretrained("bert-base-german-cased")

def calc_cosine_similarity(a, b):
    return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))

def calc_bert_embeddings(text):
  """Возвращает вектор (N,768), представляющий эмбеддинги для N токенов."""
  tokens = tokenizer(text, return_tensors="pt") 
  output = model(**tokens)
  return tokens.tokens(), output["last_hidden_state"][0,:,:].detach().numpy()

tokens1, vec1 = calc_bert_embeddings("Haupt- und Nebensatz")
tokens2, vec2 = calc_bert_embeddings("Hauptsatz und Nebensatz")
for idx in range(len(tokens1)):
  similarity = calc_cosine_similarity(vec1[idx,:], vec2[idx,:])
  print(f"{tokens1[idx]};{tokens2[idx]};{similarity:.3f}")

Ответ или решение

Теория

Работа с текстами на немецком языке в обработке естественного языка (NLP) может быть затруднена из-за различных особенностей языка. Одной из таких особенностей является использование разных типов тире: "Ergänzungsstrich" (дополнительное тире) и "Bindestrich" (дефис). Unterschied между "Ergänzungsstrich" и "Bindestrich" кроется в их функциональном назначении. "Ergänzungsstrich" используется для объединения частей составных слов, как в "Haupt- und Nebensatz", тогда как "Bindestrich" связывает сами слова, как в "Preis-Leistungs-Verhältnis". Для автоматической обработки текста важно корректно различать эти случаи, чтобы избежать ошибок в токенизации и интерпретации данных.

Пример

В представленной проблеме фраза "Haupt- und Nebensatz" распознается иначе, чем "Hauptsatz und Nebensatz", так как используемая NLP-библиотека SpaCy проводит токенизацию по дефолтным правилам без учета семантической идентичности выражений. Это приводит к различиям в косинусной схожести между векторами токенов, например, 0.07 для пары "Haupt-" и "Hauptsatz", что существенно влияет на семантический анализ.

Применение

Для обработки таких случаев существует несколько подходов:

  1. Предобработка текста: создание специальных скриптов для замены "Ergänzungsstrich" на соответствующее слово может повысить точность анализа. Например, "Haupt- und Nebensatz" можно автоматически преобразовывать в "Hauptsatz und Nebensatz" до использования в NLP моделях.

  2. Оптимизация токенизации: использование более продвинутых моделей, таких как BERT (bert-base-german-cased), показало, что такой подход более устойчив к подобным синтаксическим отличиям. BERT производит токенизацию на уровне морфем, что позволяет более тонко различать и обрабатывать такие случаи.

  3. Адаптация моделей: обучение NLP моделей на специализированных корпусах, где учтены такие особенности, как использование Ergänzungsstrich, может снизить количество ошибок интерпретации.

Таким образом, комбинация предобработки данных и использования современных языковых моделей может помочь достичь более точной семантической оценки для немецких текстов в задачах NLP.

Оцените материал
Добавить комментарий

Капча загружается...