Gensim `model.wv.most_s Similar` возвращает фонологически похожие слова - PullRequest
2 голосов
/ 03 мая 2020

gensim's wv.most_similar возвращает фонологически близкие слова (похожие звуки) вместо семантически похожих. Это нормально? Почему это может случиться?

Вот документация по most_similar: https://radimrehurek.com/gensim/models/keyedvectors.html#gensim .models.keyedvectors.WordEmbeddingsKeyedVectors.most_s Similar

In [144]: len(vectors.vocab)
Out[144]: 32966

... 

In [140]: vectors.most_similar('fight')
Out[140]:
[('Night', 0.9940935373306274),
 ('knight', 0.9928507804870605),
 ('fright', 0.9925899505615234),
 ('light', 0.9919329285621643),
 ('bright', 0.9914385080337524),
 ('plight', 0.9912853240966797),
 ('Eight', 0.9912533760070801),
 ('sight', 0.9908033013343811),
 ('playwright', 0.9905624985694885),
 ('slight', 0.990411102771759)]

In [141]: vectors.most_similar('care')
Out[141]:
[('spare', 0.9710584878921509),
 ('scare', 0.9626247882843018),
 ('share', 0.9594929218292236),
 ('prepare', 0.9584596157073975),
 ('aware', 0.9551078081130981),
 ('negare', 0.9550014138221741),
 ('glassware', 0.9507938027381897),
 ('Welfare', 0.9489598274230957),
 ('warfare', 0.9487678408622742),
 ('square', 0.9473209381103516)]

Учебные данные содержат научные документы c и это был мой учебный сценарий:

from gensim.models.fasttext import FastText as FT_gensim
import gensim.models.keyedvectors as word2vec

dim_size = 300
epochs = 10
model = FT_gensim(size=dim_size, window=3, min_count=1)
model.build_vocab(sentences=corpus_reader, progress_per=1000)
model.train(sentences=corpus_reader, total_examples=total_examples, epochs=epochs)

# saving vectors to disk
path = "/home/ubuntu/volume/my_vectors.vectors"
model.wv.save_word2vec_format(path, binary=True)

# loading vectors 
vectors = word2vec.KeyedVectors.load_word2vec_format(path)

Ответы [ 2 ]

2 голосов
/ 04 мая 2020

Вы решили использовать алгоритм FastText для обучения ваших векторов. Этот алгоритм специально использует фрагменты подслов (например, 'ight' или 'are'), чтобы иметь возможность синтезировать хорошие угадывающие векторы для слов из словаря, которых не было в обучающем наборе, и которые могли бы быть один вкладчик в результаты, которые вы видите.

Однако обычно преобладают уникальные значения слов, причем влияние таких подслов проявляется только для неизвестных слов. И очень редко подобные списки из любых слов в здоровом наборе слов-векторов имеют столько 0.99 + сходств.

Итак, я подозреваю, что в ваших тренировочных данных есть что-то странное или недостаточное.

Что это за текст, и сколько всего он содержит примеров слов употребления?

Были ли какие-либо сложные аспекты прогресса / скорости обучения, показанные в журналах уровня INFO во время обучения?

(300 измерений также могут быть немного чрезмерными, если словарь состоит только из 33K уникальных слов; это векторный размер, который часто встречается в работе с сотнями тысяч до миллионов уникальных слов и обильными данными обучения.)

0 голосов
/ 05 мая 2020

Это хороший призыв к размеру измерения. Сокращение этого параметра определенно имело значение.

1. Воспроизведение оригинального поведения (где dim_size = 300) с большим корпусом (33k -> 275k уникального вокаба):

Примечание: я также настроил несколько других параметров, таких как min_count, window , et c.)

from gensim.models.fasttext import FastText as FT_gensim

fmodel0 = FT_gensim(size=300, window=5, min_count=3, workers=10) # window is The maximum distance between the current and predicted word within a sentence.
fmodel0.build_vocab(sentences=corpus)
fmodel0.train(sentences=corpus, total_examples=fmodel0.corpus_count, epochs=5)

fmodel0.wv.vocab['cancer'].count  # number of times the word occurred in the corpus
fmodel0.wv.most_similar('cancer')
fmodel0.wv.most_similar('care')
fmodel0.wv.most_similar('fight')

# -----------
# cancer 
[('breastcancer', 0.9182084798812866),
 ('noncancer', 0.9133851528167725),
 ('skincancer', 0.898530900478363),
 ('cancerous', 0.892244279384613),
 ('cancers', 0.8634265065193176),
 ('anticancer', 0.8527657985687256),
 ('Cancer', 0.8359113931655884),
 ('lancer', 0.8296531438827515),
 ('Anticancer', 0.826178252696991),
 ('precancerous', 0.8116365671157837)]

# care
[('_care', 0.9151567816734314),
 ('încălcare', 0.874087929725647),
 ('Nexcare', 0.8578598499298096),
 ('diacare', 0.8515325784683228),
 ('încercare', 0.8445525765419006),
 ('fiecare', 0.8335763812065125),
 ('Mulcare', 0.8296753168106079),
 ('Fiecare', 0.8292017579078674),
 ('homecare', 0.8251558542251587),
 ('carece', 0.8141698837280273)]

# fight
[('Ifight', 0.892048180103302),
 ('fistfight', 0.8553390502929688),
 ('dogfight', 0.8371964693069458),
 ('fighter', 0.8167843818664551),
 ('bullfight', 0.8025394678115845),
 ('gunfight', 0.7972971200942993),
 ('fights', 0.790093183517456),
 ('Gunfight', 0.7893823385238647),
 ('fighting', 0.775499701499939),
 ('Fistfight', 0.770946741104126)]

2. Уменьшение размера измерения до 5:

_fmodel = FT_gensim(size=5, window=5, min_count=3, workers=10)
_fmodel.build_vocab(sentences=corpus)
_fmodel.train(sentences=corpus, total_examples=_fmodel.corpus_count, epochs=5)  # workers is specified in the constructor


_fmodel.wv.vocab['cancer'].count  # number of times the word occurred in the corpus
_fmodel.wv.most_similar('cancer')
_fmodel.wv.most_similar('care')
_fmodel.wv.most_similar('fight')

# cancer 
[('nutrient', 0.999614417552948),
 ('reuptake', 0.9987781047821045),
 ('organ', 0.9987629652023315),
 ('tracheal', 0.9985960721969604),
 ('digestion', 0.9984923601150513),
 ('cortes', 0.9977986812591553),
 ('liposomes', 0.9977765679359436),
 ('adder', 0.997713565826416),
 ('adrenals', 0.9977011680603027),
 ('digestive', 0.9976763129234314)]

# care
[('lappropriate', 0.9990135431289673),
 ('coping', 0.9984776973724365),
 ('promovem', 0.9983049035072327),
 ('requièrent', 0.9982239603996277),
 ('diverso', 0.9977829456329346),
 ('feebleness', 0.9977156519889832),
 ('pathetical', 0.9975940585136414),
 ('procure', 0.997504472732544),
 ('delinking', 0.9973599910736084),
 ('entonces', 0.99733966588974)]

# fight 
[('decied', 0.9996457099914551),
 ('uprightly', 0.999250054359436),
 ('chillies', 0.9990670680999756),
 ('stuttered', 0.998710036277771),
 ('cries', 0.9985755681991577),
 ('famish', 0.998246431350708),
 ('immortalizes', 0.9981046915054321),
 ('misled', 0.9980905055999756),
 ('whore', 0.9980045557022095),
 ('chanted', 0.9978444576263428)]

Это не БОЛЬШОЙ, но больше не возвращает слова, которые просто содержат подслов.

3. И для хорошей оценки, сравните с Word2Ve c:

from gensim.models.word2vec import Word2Vec

wmodel300 = Word2Vec(corpus, size=300, window=5, min_count=2, workers=10)
wmodel300.total_train_time  # 187.1828162111342
wmodel300.wv.most_similar('cancer')

[('cancers', 0.6576876640319824),
 ('melanoma', 0.6564366817474365),
 ('malignancy', 0.6342018842697144),
 ('leukemia', 0.6293295621871948),
 ('disease', 0.6270142197608948),
 ('adenocarcinoma', 0.6181445121765137),
 ('Cancer', 0.6010828614234924),
 ('tumors', 0.5926551222801208),
 ('carcinoma', 0.5917977094650269),
 ('malignant', 0.5778893828392029)]

^ Лучше фиксирует сходство распределений + гораздо больше реализуемости c мер сходства.

Но с меньшим размером dim_size результат несколько хуже (также сходство менее реалистично c, вокруг 0,99):

wmodel5 = Word2Vec(corpus, size=5, window=5, min_count=2, workers=10)
wmodel5.total_train_time  # 151.4945764541626
wmodel5.wv.most_similar('cancer')

[('insulin', 0.9990534782409668),
 ('reaction', 0.9970406889915466),
 ('embryos', 0.9970351457595825),
 ('antibiotics', 0.9967449903488159),
 ('supplements', 0.9962579011917114),
 ('synthesize', 0.996055543422699),
 ('allergies', 0.9959680438041687),
 ('gadgets', 0.9957243204116821),
 ('mild', 0.9953152537345886),
 ('asthma', 0.994774580001831)]

Следовательно, увеличение размера измерения, похоже, помогает Word2Ve c, но не fastText ...

Я уверен, что этот контраст связан с тем фактом, что модель fastText изучает информацию подслова и каким-то образом взаимодействует с параметром таким образом, что увеличивает его значение. Но я не уверен, как именно ... Я пытаюсь согласовать этот вывод с интуицией, что увеличение размера векторов должно помочь в целом, потому что большие векторы собирают больше информации.

...