Conceptnet Numberbatch (многоязычный) OOV слова
Я работаю над проблемой классификации текста (над французским корпусом) и экспериментирую с различными вложениями слов. Мне было очень интересно, что может предложить ConceptNet, поэтому я решил попробовать.
Мне не удалось найти специальный учебник для моей конкретной задачи, поэтому я последовал совету из их блога:
Как использовать ConceptNet Numberbatch?
Чтобы сделать это как можно проще:
Изучите любой учебник по машинному обучению для НЛП, в котором используются семантические векторы. Переходим к той части, где вам говорят использовать word2vec. (Особенно просвещенный учебник может посоветовать вам использовать GloVe 1.2.)
Получите данные ConceptNet Numberbatch и используйте их вместо них. Получите лучшие результаты, которые также можно будет использовать на других языках.
Ниже вы можете найти мой подход (обратите внимание, что 'numberbatch.txt' - это файл, содержащий рекомендуемую многоязычную версию: ConceptNet Numberbatch 19.08):
embeddings_index = dict()
f = open('numberbatch.txt')
for line in f:
values = line.split()
word = values[0]
coefs = asarray(values[1:], dtype='float32')
embeddings_index[word] = coefs
f.close()
print('Loaded %s word vectors.' % len(embeddings_index))
Я начал с проверки, существует ли слово:
word = 'fille'
missingWords = 0
if word not in embeddings_index:
missingWords += 1
print(missingWords)
Я обнаружил удивление, что такого простого слова, как "fille" (девушка по-французски) не встречается. Затем я создал функцию для печати всех слов OOV из моего корпуса. Я был еще более удивлен при анализе результатов: более 22 тысяч слов не были найдены (включая такие слова, как "nous" (мы), "être" (быть) и т. Д.).
Я также попробовал подход, предложенный на странице GitHub для слов OOV (с тем же результатом):
Стратегия отсутствия словарного запаса
ConceptNet Numberbatch оценивается с использованием стратегии отсутствия словарного запаса, которая помогает его работе при наличии незнакомых слов. Стратегия реализована в кодовой базе ConceptNet. Его можно резюмировать следующим образом:
Учитывая неизвестное слово, язык которого не является английским, попробуйте найти слово с эквивалентным написанием в английских вложениях (потому что английские слова, как правило, попадают в текст на всех языках).
Учитывая неизвестное слово, удалите букву с конца и посмотрите, не является ли это префиксом известных слов. Если да, усредните вложения этих известных слов.
Если префикс все еще неизвестен, продолжайте удалять буквы с конца, пока не будет найден известный префикс. Сдавайтесь, когда остается единственный персонаж.
Я что-то не так делаю в своем подходе?
1 ответ
Вы принимаете во внимание формат ConceptNet Numberbatch? Как показано в GitHub проекта, это выглядит так:
/ c / en / absolute_value -0.0847 -0.1316 -0.0800 -0.0708 -0.2514 -0.1687 -...
/ c / en / absolute_zero 0,0056 -0,0051 0,0332 -0,1525 -0,0955 -0,0902 0,07...
Этот формат означает, что
fille
не будет найдено, но
/c/fr/fille
будут.