Я искал и пытался реализовать модель встраивания слов, чтобы предсказать сходство между словами. У меня есть набор данных, состоящий из 3550 названий компаний, идея состоит в том, что пользователь может предоставить новое слово (которого нет в словаре) и вычислить сходство между новым именем и существующими.
Во время предварительной обработкиЯ избавился от стоп-слов и знаков препинания (дефисы, точки, запятые и т. Д.). Кроме того, я применил стволовые и разделенные префиксы в надежде получить больше точности. Затем такие слова, как BIOCHEMICAL
, в конечном итоге стали BIO
CHEMIC
, то есть словом, разделенным на два (префикс и слово основы)
Средняя длина названия компании составляет 3 слова со следующей частотой:
Токены, являющиеся результатом предварительной обработки, отправляются в 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)
В наборе данных у меня есть такие слова, как лапы или уход за питомцами, но другие слова создают отношения с pet
word.
Это распределение ближайших слов для pet
:
С другой стороны, когда я использовал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)
Это распределение ближайших слов:
Я хотел бы получить ваш совет по следующим вопросам:
- Подходит ли этот набор данных для продолжения работы с этой моделью?
- Достаточна ли длина набора данных, чтобы
word2vec
"выучил" отношения между словами? - Что можно сделать, чтобы улучшить модель, чтобы
word2vec
создал отношениятот же тип, что и в GoogleNews, где, например, слово pet
правильно задано среди похожих слов? - Возможно ли реализовать другую альтернативу, например
fasttext
, учитывая природу текущего набора данных? - Знаете ли вы какой-либо общедоступный набор данных, который можно использовать вместе с текущим набором данных для создания этих отношений?
Спасибо