Подобие текста с использованием WMD за тот же период времени

#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