Сравнение нескольких строк, чтобы найти "среднюю" / наиболее распространенную строку

SB18 спросил: 11 марта 2019 в 07:41 в: python

Проблема:

Я пытаюсь найти общую (наиболее распространенную или даже "среднюю") фразу по ряду строк. Структура различных строк очень плохая и полна несогласованности. К многим строкам добавлены уникальные биты, которые не имеют отношения к требуемому выводу: новая строка, которая действует как своего рода сводка набора строк.

Для демонстрации я привел небольшой пример, фактические данные более сложны и состоят из множества других строк:

Пример данных:

1. Small house, red roof, 2 windows, no garden
2. Big house, red roof, 2 windows, garage with driveway
3. Small house, red roof, 2 windows, nice view 

Требуемый вывод должен быть близок к:

Small house, red roof, 2 windows

Что я пробовал и с чем сталкиваюсь:

В меньшем наборе данных с гораздо большей структурой я полагался на счетчики слов раньше:

words = df['Phrases'].str.split(expand=True).stack().value_counts()
words = words.reset_index()summary = ""
for i in range(3):
    summary += f"{words['index'][i]} "

В этом простом наборе данных это сработало, просто взяв n наиболее распространенных фраз и получив полезные резюме.

Рассматривая похожие вопросы (например, Новая строка из нескольких строк с наиболее распространенными словами или найдите наиболее распространенную строку в ArrayList () ) между ними довольно много общего. Либо "общая фраза" существует во всех предоставленных строках, либо существует установленное пороговое значение для случаев появления слов. Ни один из этих случаев здесь не так.

Еще одна вещь, которую я попробовал, - это использование пересечений:

phrases = []
for phrase in df['Phrases']:
    phrases.append(phrase.split())def intersect(list1, list2):
    return list(set(list1) & set(list2))print (intersect(phrases[0], phrases[1])

Используя данные примера, вы получите:

house red roof 2 windows

Проблема с пересечениями и более чем двумя списками заключается в том, что для каждого дополнительного списка / строки удаляются только новые и новые. Если во фразах достаточно различий, вы быстро получите пустое пересечение всех фраз.

Проблемы:

  • Не гарантировано, что во всех строках есть одна общая фраза. .
  • Фразы не гарантированно упорядочены последовательно.
  • Длина строки резюме не зафиксирована.
  • Слова часто (но не всегда) объединяются в группы: например большой / маленький дом

Возможные решения:

Одна вещь, которую я хочу попробовать, но не знаю, как правильно заняться, - это использование wordcounts, установленных в процентах, это устранит установленное количество пороговых значений для появления слов, но все равно потребуется неизвестный процентный порог. Пары / группы слов также не будут содержаться. Поэтому его было бы легче масштабировать, но, вероятно, это не правильное решение.

Другая идея состояла бы в том, чтобы реализовать некоторую форму приблизительного сопоставления строк, но, похоже, это работает только одним способом: выразить сходство между двумя строками. , Поэтому он не предоставляет новую строку, которая имеет наибольшее сходство со всеми заданными строками.

0 ответов