Алгоритм для обнаружения аналогичных документов в [закрытом] сценарии Python

Версия Swift:

FIRApp.configure()

// Creating a second app to create user without logging in
FIRApp.configure(withName: "CreatingUsersApp", options: FIRApp.defaultApp()!.options)

if let secondaryApp = FIRApp(named: "CreatingUsersApp") {
    let secondaryAppAuth = FIRAuth(app: secondaryApp)
    secondaryAppAuth?.createUser(...)
}
8
задан Franz Kafka 16 April 2013 в 11:40
поделиться

10 ответов

Если это чистые текстовые документы, или у Вас есть метод для извлечения текста из документов, можно использовать технику, названную shingling.

Вы сначала вычисляете уникальный хеш для каждого документа. Если это то же, Вы сделаны.

В противном случае Вы разламываете каждый документ на меньшие блоки. Это Ваш 'опоясывающий лишай'.

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

Другая техника, которую можно использовать, состоит в том, чтобы генерировать n-граммы всех документов и вычислить число подобных n-грамм в каждом документе и произвести взвешенный счет к каждому документу. В основном n-грамма разделяет слово на меньшие блоки. 'яблоко' стало бы, 'AP', 'приложение', 'люди', 'ple', 'le '. (Это - технически 3 грамма), Этот подход может стать вполне в вычислительном отношении дорогим по большому количеству документов или более чем двух очень больших документов. Конечно, общие n-граммы', th ', th', и т.д. должен быть взвешен для выигрыша их ниже.

Я отправил об этом на моем блоге и существуют некоторые ссылки в сообщении к нескольким другим статьям о подчиненном Shingling - это не только для кровельщиков.

Всего наилучшего

10
ответ дан 5 December 2019 в 04:35
поделиться

Байесовские фильтры имеют точно эту цель. Это - техно, которого Вы найдете в большинстве инструментов, которые определяют спам.

Пример, для обнаружения языка (из http://sebsauvage.net/python/snyppets/#bayesian):

from reverend.thomas import Bayes
guesser = Bayes()
guesser.train('french','La souris est rentrée dans son trou.')
guesser.train('english','my tailor is rich.')
guesser.train('french','Je ne sais pas si je viendrai demain.')
guesser.train('english','I do not plan to update my website soon.')

>>> print guesser.guess('Jumping out of cliffs it not a good idea.')
[('english', 0.99990000000000001), ('french', 9.9999999999988987e-005)]

>>> print guesser.guess('Demain il fera très probablement chaud.')
[('french', 0.99990000000000001), ('english', 9.9999999999988987e-005)]

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

19
ответ дан 5 December 2019 в 04:35
поделиться

Можно использовать или наконец изучить difflib от stdlib Python для написания кода.

Это очень гибко, и имеет алгоритмы, чтобы найти различия между списками строк и указать на эти различия. Затем можно использовать get_close_matches() найти подобные слова:

>>> get_close_matches('appel', ['ape', 'apple', 'peach', 'puppy'])
['apple', 'ape']

Это не решение, но возможно это - запуск.

7
ответ дан 5 December 2019 в 04:35
поделиться

Необходимо сделать вопрос более конкретным. Если Вы уже прочитали газеты снятия отпечатков пальцев, Вы уже знаете, что принципы на работе, таким образом описывая общие подходы здесь не были бы выгодны. Если Вы не имеете, необходимо также проверить статьи о "дублирующемся обнаружении" и различном веб-спаме связанные с обнаружением бумаги, которые вышли из Стэнфорда, Google, Yahoo и MS в последние годы.

У Вас есть определенные проблемы с кодированием описанных алгоритмов?

Начало работы проблемы?

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

3
ответ дан 5 December 2019 в 04:35
поделиться

Подобие может быть найдено легко без классификации. Попробуйте этот O (n2), но хорошо работает.

def jaccard_similarity(doc1, doc2):
    a = sets(doc1.split())
    b = sets(doc2.split())
    similarity = float(len(a.intersection(b))*1.0/len(a.union(b))) #similarity belongs to [0,1] 1 means its exact replica.
    return similarity
7
ответ дан 5 December 2019 в 04:35
поделиться

Существует довольно хороший разговор о нейронных сетях на Google Techtalks, который говорит об использовании многоуровневых машин Больцмана для генерации характеристических векторов для документов, которые могут затем использоваться для измерения расстояния документа. Основным вопросом является требование, чтобы установить документ большой выборки, чтобы обучить сеть обнаруживать соответствующие функции.

2
ответ дан 5 December 2019 в 04:35
поделиться

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

http://xapian.org/

http://xapian.org/docs/bindings/python/

1
ответ дан 5 December 2019 в 04:35
поделиться

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

0
ответ дан 5 December 2019 в 04:35
поделиться

Я думаю, что Jeremy попал в точку - если Вы просто хотите обнаружить, если файлы отличаются, хеш-алгоритм как MD5 или SHA1 является хорошим способом пойти.

Программное обеспечение управления исходным кодом Мерзавца Linus Torvalds использует хеширование SHA1 просто этим способом - для проверки, когда файлы были изменены.

0
ответ дан 5 December 2019 в 04:35
поделиться

Вы можете изучить алгоритм DustBuster, описанный в этой статье .

Из бумаги они могут обнаруживать повторяющиеся страницы, даже не исследуя их содержимое. Конечно, изучение содержимого увеличивает эффективность, но использование необработанных журналов сервера является адекватным методом обнаружения повторяющихся страниц.

Подобно рекомендации использовать хеши MD5 или SHA1, метод DustBuster в значительной степени полагается на сравнение размера файла в качестве основного сигнала. Как бы просто это ни звучало, это довольно эффективно для первого прохода.

0
ответ дан 5 December 2019 в 04:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: