I have a 2 lists which needs to find match percentage.
A = ['Apple','Apricots','Avocados','Bananas','Cherries','Dragon Fruit','Grapes','Guava','Jackfruit','Kiwi','Lychee','Mango','Melon','Oranges','Pomegranate','Pineapple','Raspberries','Strawberries','Watermelon','Star Fruit']
B = ['Apple','Apricots','Avocados','Bananas','Cherries','Dragon Fruit','Grapes','Guava','Jackfruit','Kiwi','Lychee','Mango','Melon','Oranges','Pomegranate','Pineapple']
I have written code like this to find the percentage of words for A.
print(f"Count of A: {len(A)}")
print(f'Count of B: {len(B)}')
d = len(A)+len(B)
print(f"Match Percentage: {round(100-((len(A)-len(B))/d*100), 2)}%")
Output as:
Count of A: 20
Count of B: 16
Match Percentage: 88.89%
Here A will not change, and B will change dynamically.
Ideally percentage looks like correct but Is this the right way to find the match percentage for list A with list B?
If this way of approach is not correct, can anyone help me with alternate approach?
Частично проблема решается алгоритмом шинглов, который неплохо находит похожие тексты. Но хороший рерайтер легкло сделает текст отличающимся на 40-60% при сохранинеии смысла. А в последнее время можно вообще сделать магию: «чатгпт, перепиши этот текст другими словами добавив тоски о былом величии римской империи», и все это за считанные секунды и бесплатно.
в качестве примера перефразированный ваш вопрос
Каким образом можно определить процент схожести между текстом, который только что был написан, и текстом, который уже хранится в базе данных MySQL? Это необходимо для того, чтобы исключить повторения текстов. Например, если кто-то создает новость о происшествии, а она была опубликована два дня назад другим человеком, то это будет считаться дублем. Я знаю, что можно сравнивать тексты посредством перебора, но это займет много времени и будет нагружать MySQL. Есть ли какие-то другие методы, кроме использования Sphinx Search, чтобы достичь этой цели?
По расчетам вот этого сервиса процент схожести менее 30%
Ну и да, Rsa97 прав, чтобы избежать ложных срабатываний придется не просто сравнивать слова, а разбирать текст на смыслы, делать фактографический разбор, а это совсем не простая работа.
0 / 0 / 0 Регистрация: 05.09.2015 Сообщений: 45 |
|
1 |
|
19.01.2017, 01:19. Показов 34524. Ответов 5
Здравствуйте, подскажите как вычислить процент совпадения двух строк? Берем их из файла или массива не важно.
0 |
id_2020 20 / 20 / 17 Регистрация: 12.12.2015 Сообщений: 71 |
||||
19.01.2017, 04:09 |
2 |
|||
0 |
Garry Galler 5407 / 3831 / 1214 Регистрация: 28.10.2013 Сообщений: 9,554 Записей в блоге: 1 |
||||||||
19.01.2017, 13:30 |
3 |
|||||||
Редакционные расстояния между строкамисловами вычисляются специализированными функциями статистической направленности с применением тех или иных метрик. Для строк традиционно используется метрика Левенштейна (хотя есть еще и уточненная метрика Левенштейна-Дамерау, метрика Хэмминга (работает только для словстрок одинаковой длины), менее точная чем прочие метрика Джаро-Винклера и т.д.)
Того же результата можно добиться и с помощью встроенного модуля difflib, который для вычисления дистанций пользуется, похоже, той же метрикой Левенштейна:
1 |
Wi0M 394 / 122 / 48 Регистрация: 26.10.2013 Сообщений: 734 |
||||
19.01.2017, 14:12 |
4 |
|||
id_2020, немного не точно.
результат 81% Добавлено через 8 минут Не по теме: Garry Galler, ну вот… а я тут со своими костылями
0 |
4607 / 2028 / 359 Регистрация: 17.03.2012 Сообщений: 10,086 Записей в блоге: 6 |
|
19.01.2017, 16:01 |
5 |
lepus007, так каков алгоритм?
0 |
Garry Galler 5407 / 3831 / 1214 Регистрация: 28.10.2013 Сообщений: 9,554 Записей в блоге: 1 |
||||
19.01.2017, 16:22 |
6 |
|||
Wi0M,
1 |
Приветствую всех! |
|
Вот теперь точная формула: =100-ABS(A18-B18). |
|
vikttur Пользователь Сообщений: 47199 |
Хотел Вам сразу предложить =100-ABS(A18-B18), но смутил результат в Вашем примере. |
MCH Пользователь Сообщений: 3886 |
я бы предложил формулу: или |
Вы правы! Просто я разместил результат не от формулы =100-ABS(число1-число2). А от =100-СРОТКЛ(число1;число2). Для лучшего понимания прилагаю файл и кусочек примера. |
|
Ericbek Гость |
#6 02.08.2011 13:57:37 MCH и vikttur, большое вам спасибо! |
Я могу предложить такой вариант:
import difflib
def similarity(s1, s2):
matcher = difflib.SequenceMatcher(None, s1, s2)
return matcher.ratio()
string_1 = list('Пример первой строки.')
string_2 = list('Пример второй строки?')
print(f'Процент схожести двух списков составляет: {int(similarity(string_1, string_2) * 100)}%')
Вывод:
Процент схожести двух списков составляет: 80%
С помощью библиотеки difflib можно так же сравнивать строки.