Я изучаю встраивание слов FastText, реализованное в gensim.Я использую корпус 20 News Group (from sklearn.datasets import fetch_20newsgroups
) для обучения моделям FastText.После базовой очистки (удаление знаков препинания, стоп-слов и цифр) в корпусе содержится ~ 30 тыс. Слов для порога min_count=4
, который используется для обучения модели:
fastmodel = FastText(all_tokens, size=300, window=3, min_count=4, iter=30, sg=1)
После обучения я использую модель длянайдите наиболее похожие слова:
fastmodel.wv.most_similar(positive=['baseball'], topn=10, restrict_vocab=30000)
>>>[('eyeball', 0.6450698375701904),
('fireball', 0.6277647018432617),
('basketball', 0.6046291589736938),
('softball', 0.5981404781341553),
('fastball', 0.5965794324874878),
('pinball', 0.5785440802574158),
('oddball', 0.5607066750526428),
('spaceball', 0.5140796899795532),
('football', 0.5082539319992065),
('ball', 0.5010384321212769)]
Вы видите, что половина из первых 10 слов имеет смысл.Тем не менее, остальные 5 слов, включая два верхних, наиболее похожих слова («глазное яблоко» и «огненный шар»), являются странными (каламбур).Единственное сходство, которое они имеют с «бейсболом», - это слово «мяч», но это не семантическое сходство, это больше похоже на синтаксическое сходство.
Я думаю, я понимаю, почему это происходит.FastText разбивает слова на нграммы, а четырехграммный «шар» передает свой вектор всем содержащим его словам.Однако это понимание не помогает решить проблему фильтрации этих слов.
Я нашел сообщение , посвященное аналогичному вопросу.Там, однако, проблема заключалась в том, что бессмысленные слова были возвращены.Это было решено с помощью restrict_vocab
, установленным на 50000. В моем случае, однако, возвращаемые слова не бессмысленны, они являются реальными словами, просто не похожими семантически.
Интересно, является ли это неотъемлемым ограничением метода FastText.Однако я не смог найти никаких признаков такого ограничения, упомянутых в Интернете, поэтому вполне возможно, что я что-то здесь упускаю.