Модель встраивания слов - PullRequest
0 голосов
/ 04 октября 2019

Я искал и пытался реализовать модель встраивания слов, чтобы предсказать сходство между словами. У меня есть набор данных, состоящий из 3550 названий компаний, идея состоит в том, что пользователь может предоставить новое слово (которого нет в словаре) и вычислить сходство между новым именем и существующими.

Во время предварительной обработкиЯ избавился от стоп-слов и знаков препинания (дефисы, точки, запятые и т. Д.). Кроме того, я применил стволовые и разделенные префиксы в надежде получить больше точности. Затем такие слова, как BIOCHEMICAL, в конечном итоге стали BIO CHEMIC, то есть словом, разделенным на два (префикс и слово основы)

Средняя длина названия компании составляет 3 слова со следующей частотой:

enter image description here

Токены, являющиеся результатом предварительной обработки, отправляются в word2vec:

#window: Maximum distance between the current and predicted word within a sentence
#min_count: Ignores all words with total frequency lower than this.
#workers: Use these many worker threads to train the model
#sg: The training algorithm, either CBOW(0) or skip gram(1). Default is 0s
word2vec_model = Word2Vec(prepWords,size=300, window=2, min_count=1, workers=7, sg=1)

После того, как модель включает все словав словаре средний вектор предложения вычисляется для каждого названия компании: df ['avg_vector'] = df2.apply (лямбда-строка: avg_sentence_vector (row, model = word2vec_model, num_features = 300, index2word_set = set (word2vec_model.wv.index2word))). tolist ())

Затем вектор сохраняется для дальнейших поисков:

##Saving name and vector values in file
df.to_csv('name-submission-vectors.csv',encoding='utf-8', index=False)

Если новое имя компании не включено в словарь после предварительной обработки (удаление стоп-слов ипунктуация), затем я продолжаю создавать модель снова, вычисляю средний вектор предложения и сохраняю его снова.

Я обнаружил, что эта модель работает не так, как ожидалось. Например, при вычислении наиболее похожих слов pet получаются следующие результаты:

ms=word2vec_model.most_similar('pet')

('fastfood', 0.20879755914211273)
('hammer', 0.20450574159622192)
('allur', 0.20118337869644165)
('wright', 0.20001833140850067)
('daili', 0.1990675926208496)
('mgt', 0.1908089816570282)
('mcintosh', 0.18571510910987854)
('autopart', 0.1729743778705597)
('metamorphosi', 0.16965581476688385)
('doak', 0.16890916228294373)

В наборе данных у меня есть такие слова, как лапы или уход за питомцами, но другие слова создают отношения с petword.

Это распределение ближайших слов для pet:

enter image description here

С другой стороны, когда я использовалGoogleNews-vectors-negative300.bin.gz, я не мог добавить новые слова в словарь, но сходство между pet и словами вокруг было, как и ожидалось:

ms=word2vec_model.most_similar('pet')
('pets', 0.771199643611908)
('Pet', 0.723974347114563)
('dog', 0.7164785265922546)
('puppy', 0.6972636580467224)
('cat', 0.6891531348228455)
('cats', 0.6719794869422913)
('pooch', 0.6579219102859497)
('Pets', 0.636363685131073)
('animal', 0.6338439583778381)
('dogs', 0.6224827170372009)

Это распределение ближайших слов:

enter image description here

Я хотел бы получить ваш совет по следующим вопросам:

  • Подходит ли этот набор данных для продолжения работы с этой моделью?
  • Достаточна ли длина набора данных, чтобы word2vec "выучил" отношения между словами?
  • Что можно сделать, чтобы улучшить модель, чтобы word2vec создал отношениятот же тип, что и в GoogleNews, где, например, слово pet правильно задано среди похожих слов?
  • Возможно ли реализовать другую альтернативу, например fasttext, учитывая природу текущего набора данных?
  • Знаете ли вы какой-либо общедоступный набор данных, который можно использовать вместе с текущим набором данных для создания этих отношений?

Спасибо

Ответы [ 3 ]

1 голос
/ 04 октября 2019

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

На первый взгляд, я думаю, что вы также можете использовать FastText без необходимости ставить слова,Он также вычисляет векторы для неизвестных слов.

Из FAQ по FastText :

Одной из ключевых особенностей представления слов fastText является его способность создавать векторы для любых слов, даже составных. Действительно, векторы слова fastText построены из векторов подстрок символов, содержащихся в нем. Это позволяет создавать векторы даже для слов с ошибками или конкатенации слов.

FastText представляется полезным для вашей цели. Для вашей задачи вы можете следовать учебному руководству FastText .

Если ваш корпус окажется слишком маленьким, вы можете построить свою модель, начиная с доступных предварительно обученных векторов ( параметр pretrainedVectors ).

1 голос
/ 05 октября 2019

3500 текстов (названий компаний), состоящих всего из ~ 3 слов каждый, составляют всего около 10 тыс. Обучающих слов с гораздо меньшим словарным запасом уникальных слов.

Это очень, очень мало для word2vec и связанных с ним алгоритмов, которые полагаются на большое количество данных и достаточно разнообразные данные, чтобы обучить полезным векторным расположениям.

Возможно, вы сможете сжатьнекоторая значимая тренировка на основе ограниченных данных с использованием гораздо более эпох обучения, чем стандартные epochs=5, и гораздо меньших векторов, чем стандартные size=100. С такими корректировками вы можете начать видеть более значимые most_similar() результаты.

Но неясно, соответствует ли word2vec и, в частности, word2vec в ваших сравнениях по усреднению имени,ваши конечные цели.

Word2vec нуждается в большом количестве данных, не смотрит на единицы подслов и не может ничего сказать о жетонах слов, не замеченных во время обучения. Среднее число векторов-слов часто может служить простой отправной точкой для сравнения текстов, состоящих из нескольких слов, но также может ослабить влияние некоторых слов по сравнению с другими методами.

В число рассматриваемых вопросов могут входить:

  • Алгоритмы, связанные с Word2vec, такие как FastText, которые также запоминают векторы для подслов, и, таким образом, могут загружать неплохие векторы угадывания для слов, не замеченных в обучении. (Но они также требуют большого количества данных, и для использования в небольшом наборе данных вы снова захотите уменьшить размер вектора, увеличить эпохи и дополнительно уменьшить число buckets, используемых для изучения подслов.)

  • Более сложные сравнения многословных текстов, таких как «Расстояние до слова». (Это может быть довольно дорого для длинных текстов, но для имен / названий всего несколько слов может оказаться практичным.)

  • Поиск большего количества данных, которые соответствуют вашим целям создания более сильной модели. Может помочь большая база данных названий компаний. Если вы просто хотите, чтобы ваш анализ понимал английские слова / корни, могут подойти и более общие учебные тексты.

  • Для многих целей просто лексикографическое сравнение - редактирование расстояний, подсчет общих символов -n-граммы - также могут быть полезны, хотя и не обнаружат всех синонимов / семантически похожих слов.

1 голос
/ 04 октября 2019

Word2vec не обобщается на невидимые слова.

Он даже не работает хорошо для подопечных, которые видны, но редко . Это действительно зависит от множества примеров использования слов. Кроме того, вам нужен достаточный контекст слева и справа, но вы используете только названия компаний - они слишком короткие. Вероятно, поэтому ваши вложения работают так плохо: слишком мало данных и слишком короткие тексты.

Следовательно, это неправильный подход для вас. Переучивание модели с новым названием компании недостаточно - у вас все еще есть только одна точка данных. Вы можете также пропустить невидимые слова, word2vec не может работать лучше, чем это, даже если вы переучиваетесь.

...