Представление Fasttext для короткой фразы, но не для более длинной фразы, содержащей короткую

Я использую Gensim для загрузки немецких .bin файлов из Fasttext, чтобы получить векторные представления для слов и фраз, не входящих в словарь. Пока все работает нормально, и в целом я достиг хороших результатов.
Я знаком с KeyError :'all ngrams for word <word> absent from model'. Очевидно, что модель не обеспечивает векторное представление для всех возможных комбинаций ngram.
Но теперь я столкнулся с запутанной (по крайней мере, для меня) проблема.
Я просто приведу краткий пример:
модель предоставляет представление для фразы AuM Wert.
Но когда я хочу получить представление для AuM Wert 50 Mio. Eur, я получу KeyError упомянутый выше. Таким образом, модель, очевидно, имеет представление для более короткой фразы, но не для расширенной.
Она даже возвращает представление для AuM Wert 50 Mio.Eur (я просто удалил пробел между «Mio» и «Eur»)
Я имею в виду, что Утверждение в Error просто неверно, потому что первый пример показывает, что он знает некоторые из ngrams. Кто-нибудь может мне это объяснить? Что я тут не понимаю? Является ли мое понимание ngrams неправильным?

Вот код:

from gensim.models.wrappers import FastText
model = FastText.load_fasttext_format('cc.de.300.bin')
model.wv['AuM Wert'] #returns a vector
model.wv['AuM Wert 50 Mio.EUR'] #returns a vector
model.wv['AuM Wert 50 Mio. EUR'] #triggers the error

Заранее спасибо,
Амос


person Amos Poznanski    schedule 06.03.2019    source источник
comment
Можете ли вы показать (добавив к своему вопросу) точный код, который вы используете, чтобы получить представление из модели для определенных входных данных, и показать вывод или ошибки, которые вызывает код?   -  person gojomo    schedule 06.03.2019
comment
только что обновил его   -  person Amos Poznanski    schedule 10.03.2019


Ответы (1)


Я не уверен, что вызывает поведение, которое вы видите, хотя у меня есть теория ниже.

Но обратите внимание, что текущее поведение gensim (до 3.7.1), иногда возвращающее KeyError: all ngrams for word <...> absent для слова OOV, не соответствует поведению исходной реализации FastText Facebook и, таким образом, считается ошибкой.

Это должно быть исправлено в следующем релизе. Вы можете прочитать примечание об изменении о новом совместимом поведении.

Таким образом, в ближайшем будущем с обновленной версией gensim вы никогда не увидите эту ошибку KeyError.

В то же время, факторы, которые могут объяснить наблюдаемое вами поведение, включают:

  • Не принято передавать фразы, разделенные пробелами, в FastText. Кроме того, обычные токенизации обучающих текстов будут передавать только словесные токены без каких-либо внутренних пробелов. Таким образом, для типичной модели нет никаких шансов, что такие фразы, содержащие пробелы, будут иметь векторы полных слов. И ни одна из их символьных n-грамм, содержащих пробелы, также не будет отображаться на n-граммы, увиденные во время обучения. В той мере, в какой вы вообще получите вектор в gensim 3.7.1 и более ранних версиях, это будет связано с тем, что некоторые из n-грамм, не содержащие пробелы, были замечены при обучении. (После версии 3.7.1 вы всегда будете получать вектор, хотя он может быть составлен из случайных столкновений новых n-грамм слова-запроса с n-граммами, полученными при обучении, или просто со случайно-инициализированными, но никогда не обучаемыми векторов внутри хеш-таблицы n-грамм модели.)
  • N-граммы изучаются с помощью синтетического префикса начала слова и суффикса конца слова, в частности, символов < и >. А диапазон размеров n-грамм по умолчанию составляет от 4 до 6 символов. Таким образом, ваша строка 'AuM Wert' будет среди своих n-грамм включать '<AuM', 'Wert' и 'ert>'. (Все другие его n-граммы будут включать пробел и, следовательно, не могут быть в наборе n-грамм, изученных во время обучения словам без пробелов.). Но обратите внимание, что более длинная фраза, в которой вы получаете сообщение об ошибке, не будет включать n-грамму 'ert>', потому что предыдущая лексема конца была заменена пробелом. Таким образом, n-граммы более короткой фразы не являются правильным подмножеством n-грамм более крупной фразы, и более крупная фраза может привести к ошибке там, где ее нет. (И ваша более длинная фраза без пробела, которая не содержит ошибок, также включает ряд дополнительных n-грамм из 4-6 символов, которые могли быть в обучающих данных, которых нет во фразе с ошибкой.)
person gojomo    schedule 10.03.2019
comment
Ничего себе, это определенно освещающий ответ! Я должен глубже погрузиться в изучение ngrams. Большое спасибо! Как только я получу новые знания, я оставлю их здесь, в разделе комментариев. К сожалению, мой голос не показывается публично, так как моя репутация меньше 15. - person Amos Poznanski; 10.03.2019
comment
Post 3.7.1, you will always get a vector Не думаю, что это правда. Я использую gensim 4.0.1, а с моделью fasttext-wiki-news-subwords-300 есть много фраз, которые дают Key not present KeyErrors, например. Нью-Йорк, социальная поддержка и т. д. - person Blue482; 29.07.2021
comment
Мне нужно больше узнать о параметрах этой модели и коде, который вы используете для загрузки модели и запуска KeyError, а также полное сообщение об ошибке, чтобы больше прокомментировать происходящее. (Возможно: новый вопрос?) Но: глядя на текущий (gensim-4.0.1+) код для FastTextKeyedVectors.get_vector(), KeyError можно сгенерировать только в том случае, если значение bucket модели равно 0, что означает, что в ней вообще нет информации о подсловах, поэтому это не реальный/полный набор векторов FT. (Вы уверены, что не загрузили только векторы полных слов?) - person gojomo; 29.07.2021
comment
Спасибо! Я использую gensim.downloader.load() для загрузки модели быстрого текста. Теперь я думаю, что в модели может просто не быть подслова для нью-йорка (хотя в нем есть нью-йорк и нью-йорк). Сюрприз для меня, учитывая размер его учебных корпусов. - person Blue482; 30.07.2021
comment
В fasttext.cc/docs/en/faqs.html упоминается Currently the best approach to represent word phrases or sentence is to take a bag of words of word vectors. Additionally, for phrases like “New York”, preprocessing the data so that it becomes a single token “New_York” can greatly help. - person Blue482; 30.07.2021
comment
Я лично избегаю косвенного использования gensim.downloader, так как это может скрыть исходный код и может загружать/запускать другой неверсионный код вне обычного процесса управления пакетами. (См. github.com/RaRe-Technologies/gensim/issues/2283) . Загрузка необработанных данных из первоисточников гарантирует, что вы знаете, что у вас есть, от первоначального создателя и в каких именно локальных файлах/путях, а также какие методы использовались для их переноса в память – все это бесполезно скрыто. api.load(). - person gojomo; 30.07.2021
comment
Почему вы думаете, что в модели нет подслов для строки 'new york'? Какой код вы запустили, чтобы сделать это определение, и какой вывод или ошибку он дал? На какой модели вы работаете? - person gojomo; 30.07.2021
comment
Посмотрев на ‹github.com/ RaRe-Technologies/gensim-data/releases/tag/›, в частности код __init__.py вне контроля версий, который загружается и запускается при вызове api.load("fasttext-wiki-news-subwords-300"), я вижу, что он загружает эти векторы только как объект KeyedVectors , который может возвращать векторы только для точных полных слов в наборе векторов. То есть код api.load("fasttext-wiki-news-subwords-300") не создает объект, специфичный для FastText, и поэтому никогда не сможет вернуть вектор для слова OOV. - person gojomo; 30.07.2021