Difflib.SequenceMatcher isjunk необязательный параметр запроса: как игнорировать пробелы, табуляции, пустые строки? - PullRequest
2 голосов
/ 29 сентября 2008

Я пытаюсь использовать Difflib.SequenceMatcher для вычисления сходства между двумя файлами. Эти два файла практически идентичны, за исключением того, что один содержит несколько лишних пробелов, пустые строки, а другие нет. Я пытаюсь использовать

s=difflib.SequenceMatcher(isjunk,text1,text2)
ratio =s.ratio()

для этой цели.

Итак, вопрос в том, как написать лямбда-выражение для этого метода isjunk, чтобы метод SequenceMatcher игнорировал все пробелы, пустые строки и т. Д. Я попытался использовать параметр lambda x: x == "", но результат не так хорошо Для двух похожих текстов соотношение очень низкое. Это очень противоречит интуиции.

Для целей тестирования, вот две строки, которые вы можете использовать при тестировании:

Что мотивирует JWOVU делать вашу работу Что ж? Хорошо, это запись пытается выиграть 100 долларов на разработку программного обеспечения книги, несмотря на то, что я не читать

книги по программированию. Для того, чтобы выиграть приз вы должны написать запись и
что мотивирует fggmum делать свою работу Что ж. Отсюда и этот пост. Первый мотивация

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

Как будто деньги - это табу в программировании Мир. Я знаю, что есть люди, которые не может быть мотивировано деньгами. Мадам, на с другой стороны, я живу в реальном мир,

с ипотекой дома, чтобы заплатить, я сам корма и счета для покрытия. Так что я не могу действительно исключить деньги из моего рассмотрение. Если я могу получить большой сумма денег за

делает хорошую работу, тогда определенно повысить мой моральный дух Мне все равно, Я использую старую рабочую станцию, или вынуждены делить комнаты или кабину с другое

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

для меня, чтобы преодолеть все препятствия, мириться со всеми острыми чувствами и больно эго, терпеть медленный компьютер и даже терпеть

А вот еще одна строка

Что мотивирует вас делать свою работу Что ж? Хорошо, это запись пытается выиграть 100 долларов на разработку программного обеспечения книги, несмотря на то, что я не читать книги по программированию. Чтобы выиграть приз, вы должны написать запись и описывает, что мотивирует вас хорошо делать свою работу Отсюда и этот пост.

Первая мотивация, деньги. Я знаю это не звучит как большое вдохновение и сказать, что деньги - это одно из факторов мотивации может просто упусти мои шансы. Как будто деньги табу в мире программирования. я знаю есть люди, которые не могут быть мотивированы деньгами. Слава им. Мне, с другой стороны, я живу в реальном мир, с ипотекой, чтобы заплатить, себя кормить и счета покрывать. Так Я не могу исключить деньги из моего рассмотрение.

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

Я выполнил указанную выше команду и установил для isjunk значение lambda x: x == "", соотношение составляет всего 0,36.

Ответы [ 4 ]

6 голосов
/ 29 сентября 2008

Если вы сопоставите все пробелы, сходство будет лучше:

difflib.SequenceMatcher(lambda x: x in " \t\n", doc1, doc2).ratio()

Тем не менее, difflib не идеален для такой проблемы, потому что это два почти идентичных документа, но опечатки и другие приводят к различиям в difflib, где человек не увидит многих.

Попробуйте прочесть по tf-idf , Байесовская вероятность , Векторные космические модели и w-shingling

Я написал реализацию tf-idf , применив ее к векторному пространству и используя скалярное произведение в качестве меры расстояния для классификации документов.

1 голос
/ 29 сентября 2008

Учитывая вышеприведенные тексты, тест действительно соответствует предложенному:

difflib.SequenceMatcher(lambda x: x in " \t\n", doc1, doc2).ratio()

Однако, чтобы немного ускорить процесс, вы можете воспользоваться метод-оберткой CPython :

difflib.SequenceMatcher(" \t\n".__contains__, doc1, doc2).ratio()

Это позволяет избежать многих вызовов функций Python.

1 голос
/ 29 сентября 2008

Использование ваших примеров строк:

>>> s=difflib.SequenceMatcher(lambda x: x == '\n', s1, s2)
>>> s.ratio()
0.94669848846459825

Интересно, если '' также включено как мусор:

>>> s=difflib.SequenceMatcher(lambda x: x in ' \n', s1, s2)
>>> s.ratio()
0.7653142402545744

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

1 голос
/ 29 сентября 2008

Я не использовал Difflib.SequenceMatcher, но рассматривали ли вы предварительную обработку файлов для удаления всех пустых строк и пробелов (возможно, с помощью регулярных выражений), а затем выполняете сравнение?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...