#python #pandas #gensim #word2vec #similarity
#python #панды #gensim #word2vec #сходство
Вопрос:
У меня есть набор данных
Title Year
0 Sport, there will be a match between United and Tottenham ... 2020
1 Forecasting says that it will be cold next week 2019
2 Sport, Mourinho is approaching the anniversary at Tottenham 2020
3 Sport, Tottenham are sixth favourites for the title behind Arsenal. 2020
4 Pochettino says clear-out of fringe players at Tottenham is inevitable. 2018
... ... ...
Я хотел бы изучить сходство текста в течение того же года, а не во всем наборе данных. Чтобы найти большинство похожих текстов, я использую подобие расстояния WM.
Для двух текст будет:
word2vec_model = gensim.models.KeyedVectors.load_word2vec_format('GoogleNews-vectors-negative300.bin', binary=True)
distance = word2vec_model.wmdistance("string 1".split(), "string 2".split())
Однако мне нужно было бы повторить расстояние между предложениями за тот же год, чтобы получить сходство каждого текста с другими, создав список похожего текста для каждой строки в dataframe.
Не могли бы вы рассказать мне, как выполнить итерацию функции wmdistance по тексту, опубликованному в том же году, чтобы получить для каждого текста наиболее похожие за тот же период?
Ответ №1:
Генерация матрицы расстояний для каждой группы, а затем выбор минимального значения должны работать. Это даст вам один ближайший индекс документа за данный год. Вы должны иметь возможность легко модифицировать этот код, если вам нужны n документов или что-то еще в этом роде.
from scipy.spatial.distance import pdist, squareform
def nearest_doc(group):
sq = squareform(pdist(group.to_numpy()[:,None], metric=lambda x, y:word2vec_model.wmdistance(x[0], y[0])))
return group.index.to_numpy()[np.argmin(np.where(sq==0, np.inf, sq), axis=1)]
df['nearest_doc'] = df.groupby('Year')['Title'].transform(nearest_doc)
Результат:
Title Year nearest_doc
0 Sport, there will be a match between United an... 2020 3
1 Forecasting says that it will be cold next week 2019 1
2 Sport, Mourinho is approaching the anniversary... 2020 3
3 Sport, Tottenham are sixth favourites for the ... 2020 2
4 Pochettino says clear-out of fringe players at... 2018 4