Как правило, подобия слов, подобные этим, вычисляются с использованием косинусного сходства между соответствующими им векторами слов. Слова, часто используемые в одних и тех же контекстах, оказываются в одинаковых местах в векторном пространстве, при условии, что слова, которые используются одинаково, означают похожие вещи. Например, Король и Королева могут быть похожими, и Король и Человек могут быть похожими, но Королева и Человек должны быть немного менее похожими (хотя они все еще оба относятся к «людям», и они оба являются существительными, так что они, вероятно, все же быть более похожим, чем, скажем, Man and Combusted).
Вы хотите, чтобы эти слова («Позитивные» и «Негативные») были отрицательными по отношению друг к другу (косинусное сходство -1), но они похожи, потому что они почти точно такие же слова, за исключением того, что одно является отрицанием другой. Глобальное семантическое векторное пространство включает в себя гораздо больше идей, чем просто отрицание, и поэтому эти два слова оказываются очень похожими в других отношениях. Что вы можете сделать, так это вычислить их средний вектор, тогда Positive -> average = - (Negative -> average)
, и этот вектор разности Positive -> average
(или, точнее, "Positive" - ("Positive" - "Negative") / 2
) будет приближать идею отрицания, которая вас особенно интересует. затем можно добавить этот вектор в другие случаи, чтобы отрицать их тоже, например, "Yes" + ("Negative" - "Positive") ~= "No"
Все, что нужно сказать, эффект, который вы наблюдаете, не является ошибкой Spacy, и вы не избежите этого, используя Gensim или Sklearn, это связано с природой того, что означает «сходство» в этом контексте. Если вам нужны более понятные, разработанные человеком семантические отношения между словами, подумайте о том, чтобы взглянуть на WordNet, который создан вручную и с большей вероятностью явно будет иметь какое-то отношение «отрицание» между вашими двумя словами.