Сходство и соответствие текста Python - увеличение веса, когда термины вместе
У меня есть два столбца в пандах, которые содержат последовательность терминов, и моя цель состоит в том, чтобы найти запись из столбца B, которая наиболее близко соответствует записям в столбце A. Я использовал TF-IDF, чтобы найти сходство между две колонки, но проблема в том, что он ищет вхождения отдельных слов и не отдает приоритет словам, сгруппированным вместе.
Как мне придать больший вес словам, которые встречаются вместе?
например, "Кошка сидела на коврике" должна больше совпадать с записями, в которых есть фраза "сидел на коврике", чем с записями, в которых "кошка сидит на собачьей упряжке на слоне".
2 ответа
То, что вы хотите, это сходство документов. Я провел много исследований в этой области, и, исходя из своего опыта, расстояние Word Mover в настоящее время является наиболее эффективным алгоритмом.
Самый простой способ сделать это:
- Загрузите официальные вложения Google News.
- Загрузите их в модель Word2Vec от Gensim, используя
load_word2vec_format
метод. - Использовать
wmdistance
метод вычисления сходства документов.
Например, вы можете перебирать размеры окон по столбцам.
Если вам нужны совпадения по группам, которые указывают на то, что вам нужно обратить внимание на порядок слов в предложениях.
В качестве примера возьмем предложения "кот сидел на коврике" и "сидел на коврике".
Создайте размер окна укороченного предложения "сидя на коврике", выполните итерации по обоим столбцам и уменьшите размер окна на 1 после завершения итерации.
Вы получаете совпадения для каждого размера окна и можете учитывать их по своему усмотрению.
E: если вы хотите ранжировать более длинные совпадения, вам нужно будет найти предложение, которое имеет наибольшее количество совпадений.
E2: Я не уверен, почему это получает отрицательное голосование / Вы должны построить кортежи или окна над вашими предложениями, нет другого способа соответствовать, когда слово oder имеет значение. К сожалению, у меня недостаточно репутации, чтобы поместить это в раздел комментариев.
E3:
def find_ngrams(input_list, n):
return zip(*[input_list[i:] for i in range(n)])
sent_a = 'the cat sat on the mat'.split()
sent_b = 'sat on the mat'.split()
nga = find_ngrams(sent_a, len(sent_b))
ngb = find_ngrams(sent_b, len(sent_b))
ct = 0
for ngramone in nga:
for ngramtwo in ngb:
if ngramone == ngramtwo:
ct += 1
In [30]: ct
Out[30]: 1
Если вы хотите найти все совпадения, параметр 'n' для find_ngrams должен уменьшаться на одну каждую итерацию, пока он не достигнет значения два, вы уже сопоставили отдельные слова с помощью TF-IDF.
Что касается того, как вы их учитываете, предоставлено слишком мало данных. Мое лучшее предположение было бы сделать поиск, если вы хотите ранжировать их выше, чем совпадения TF-DF.
Я не уверен, включено ли это каким-либо образом в библиотеку панд, но само сопоставление довольно просто и может быть сделано в несколько строк.