Возможно, вы заметили, что теперь мы показываем сводку по редактированию в вики-сообщениях сообщества:
Сообщество вики
220 ревизий, 48 пользователей
Я также хотел бы показать пользователю, который «владеет большинством» окончательного содержимого, отображаемого на странице, в процентах от оставшегося текста:
Сообщество вики
220 ревизий, 48 пользователей
кроноз 87%
Да, могут быть верхние (n) "владельцы", но сейчас я хочу топ 1.
Предположим, у вас есть эта структура данных, список пар пользователь / текст, упорядоченных в хронологическом порядке ко времени публикации:
User Id Post-Text
------- ---------
12 The quick brown fox jumps over the lazy dog.
27 The quick brown fox jumps, sometimes.
30 I always see the speedy brown fox jumping over the lazy dog.
Кто из этих пользователей наиболее "владеет" окончательным текстом?
Я ищу разумный алгоритм - он может быть приблизительным, он не должен быть идеальным - чтобы определить владельца. Идеально выражается в процентах.
Обратите внимание, что мы должны учитывать правки, удаления и вставки, поэтому окончательный результат кажется разумным и правильным. В качестве тестового корпуса вы можете использовать любую публикацию stackoverflow с достойной историей ревизий (не просто повторной маркировкой, но частыми изменениями тела сообщения). Вот хороший, с 15 ревизиями от 14 разных авторов. Кто такой "владелец"?
https://stackoverflow.com/revisions/327973/list
Нажмите «просмотреть исходный код», чтобы получить необработанный текст каждой ревизии.
Я должен предупредить вас, что чисто алгоритмическое решение может оказаться формой самой длинной общей проблемы с подстрокой . Но, как я уже говорил, аппроксимации и оценки тоже хороши, если они работают хорошо.
Приветствуются решения на любом языке , но я предпочитаю решения, которые
- Довольно легко перевести на c #.
- Без зависимостей.
- Поместите простоту перед эффективностью.
Чрезвычайно редко для публикации в SO более 25 ревизий. Но это должно «чувствовать» точно, поэтому, если вы оценили внесенные изменения, вы согласитесь с окончательным решением. Я рекомендую вам проверить свой алгоритм на постах переполнения стека с историями изменений и посмотреть, согласны ли вы с окончательным выводом.
Я развернул следующую аппроксимацию, которую вы можете увидеть в действии для каждой новой сохраненной ревизии в сообщениях сообщества Wiki
- делать разность на основе строки каждой ревизии, где изменяется основной текст
- сумма строк вставки и удаления для каждой ревизии как "editcount"
- каждый идентификатор пользователя получает сумму "editcount", которую они внесли
- автор первой ревизии получает 2x * "editcount" в качестве начального балла в качестве основного авторского бонуса
- для определения окончательного процента владения: общее количество отредактированных строк каждого пользователя, поделенное на общее количество отредактированных строк во всех ревизиях
(Существуют также некоторые защитные условия для простых простых условий, таких как 1 ревизия, только 1 автор и т. Д. При использовании различий на основе строк достаточно быстро выполнить пересчет для всех ревизий; в типичном случае, скажем, 10 ревизий это ~ 50 мс .)
Это неплохо работает в моем тестировании. Это немного ломается, когда у вас есть небольшие 1 или 2 посты, которые редактируют несколько человек, но я думаю, что это неизбежно. Принятие ответа Джоэла Нили как наиболее близкого по духу к тому, с чем я пошел, и отказался от всего остального, что казалось работоспособным.