Возможно, вы заметили, что теперь мы показываем сводку изменений в сообщениях сообщества Wiki:
сообщество wiki
220 версий, 48 пользователей
Я также хотел бы показать пользователю, который "наиболее владеет" окончательным содержимым, отображаемым на странице, в процентах от оставшегося текста:
сообщество wiki
220 изменений, 48 пользователей
кронос 87%
Да, могут быть верхние (n) "владельцы", но на данный момент я хочу верхнюю часть.
Предположим, что у вас есть эта структура данных, список пар пользователь/текст, упорядоченный хронологически к моменту публикации:
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
Нажмите "просмотреть исходный код", чтобы получить исходный текст каждой ревизии.
Я должен предупредить вас, что чисто алгоритмическое решение может оказаться формой Самая длинная общая проблема подстроки. Но, как я уже упоминал, аппроксимации и оценки тоже хороши, если они хорошо работают.
Решения на любом языке приветствуются, но я предпочитаю решения, которые
- Довольно легко перевести на С#.
- Без зависимостей.
- Положите простоту перед эффективностью.
Чрезвычайно редко для сообщения на SO имеется более 25 версий. Но он должен "чувствовать" точный, поэтому, если вы заглянули в редакцию, вы согласитесь с окончательным решением. Я рекомендую вам протестировать ваш алгоритм на сообщениях с историями ревизий и посмотреть, согласны ли вы с окончательным результатом.
Теперь я развернул следующее приближение, которое вы можете увидеть в действии для каждой новой сохраненной версии в сообщениях сообщества Wiki
- выполните линейный diff каждой ревизии, где изменяется основной текст.
- суммируйте строки вставки и удаления для каждой ревизии как "editcount"
- каждый userid получает сумму "editcount" , которую они внесли.
- автор первой версии получает 2x * "editcount" в качестве начального балла, в качестве основного бонуса авторства
- чтобы определить окончательный процент владения: каждый пользователь отредактировал общее количество строк, деленное на общее количество отредактированных строк во всех версиях.
(Существуют также некоторые защитные оговорки для простых простых условий, таких как 1 ревизия, только 1 автор и т.д. Линейный diff делает его довольно быстрым для пересчета для всех ревизий, в типичном случае, скажем, 10 ревизий, это ~ 50 мс.)
Это хорошо работает в моем тестировании. Он немного ломается, когда у вас есть небольшие 1 или 2 строковые сообщения, которые редактируют несколько человек, но я думаю, что это неизбежно. Принимая Джоэл Нили, отвечайте как можно ближе к тому, с чем я пошел, и поддержали все остальное, что казалось выполнимым.