Процент совпадения как найти

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


Студворк — интернет-сервис помощи студентам

Здравствуйте, подскажите как вычислить процент совпадения двух строк? Берем их из файла или массива не важно.
например есть строка «Мама мыла раму» в нашем массиве array1 и такая же строка есть в массиве array2.
Совпадение 100%.
в массиве array1 есть строка «Мама мыла раму» и в массиве array2 есть строка «Мама мыла малину»
Совпадение 70%



0



id_2020

20 / 20 / 17

Регистрация: 12.12.2015

Сообщений: 71

19.01.2017, 04:09

2

Python
1
2
3
4
5
6
7
8
9
def fun(s1, s2):
    if len(s1) > len(s2):
        s1, s2 = s2, s1
    p = 0
    for i in range(len(s1)):
        if s1[i] == s2[i]:
            p += 1
    return str(int(p/len(s1)*100))+'%'
print(fun(input(), input()))



0



Garry Galler

Эксперт Python

5407 / 3831 / 1214

Регистрация: 28.10.2013

Сообщений: 9,554

Записей в блоге: 1

19.01.2017, 13:30

3

Редакционные расстояния между строкамисловами вычисляются специализированными функциями статистической направленности с применением тех или иных метрик. Для строк традиционно используется метрика Левенштейна (хотя есть еще и уточненная метрика Левенштейна-Дамерау, метрика Хэмминга (работает только для словстрок одинаковой длины), менее точная чем прочие метрика Джаро-Винклера и т.д.)
Вот пример использования соответствующих функций из сторонних модулей:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from fuzzywuzzy import fuzz
import Levenshtein
import statistics as st
 
# токенизируем слова по пробелу - самый элементарный способ, хотя в модулях для natural language processing (например, nltk) есть спец. токенизаторы
sentences = "Мама мыла раму".split(), 'Мама мыла малину'.split()
l =[]
l2=[]
l3=[]
for w1,w2 in zip(sentences[0],sentences[1]):
    l.append(Levenshtein.ratio(w1,w2))
    l2.append(fuzz.ratio(w1,w2))
    l3.append(Levenshtein.jaro_winkler(w1,w2))
 
print('Levenshtein:',st.mean(l))   # 0.8
print('fuzzywuzzy %:',st.mean(l2)) # 80
print('jaro_winkler:',st.mean(l3)) # 0.8796296296296297

Того же результата можно добиться и с помощью встроенного модуля difflib, который для вычисления дистанций пользуется, похоже, той же метрикой Левенштейна:

Python
1
2
3
from difflib import SequenceMatcher
s = SequenceMatcher(lambda x: x==" ", "Мама мыла раму", "Мама мыла малину") 
print('difflib:',s.ratio())  #0.8



1



Wi0M

394 / 122 / 48

Регистрация: 26.10.2013

Сообщений: 734

19.01.2017, 14:12

4

id_2020, немного не точно.
так точнее будет

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# -*- coding: utf-8 -*-
 
s1 = 'Мама мыла раму'
s2 = 'Мама мыла малину'
 
 
def search_partial_text(src, dst):
    dst_buf = dst
    result = 0
    for char in src:
        if char in dst_buf:
            dst_buf = dst_buf.replace(char, '', 1)
            result += 1
    r1 = int(result / len(src) * 100)
    r2 = int(result / len(dst) * 100)
    return '{}%'.format(r1 if r1 < r2 else r2)
 
print(search_partial_text(s1, s2))

результат 81%

Добавлено через 8 минут

Не по теме:

Garry Galler, ну вот… а я тут со своими костылями :D



0



Эксперт Python

4607 / 2028 / 359

Регистрация: 17.03.2012

Сообщений: 10,086

Записей в блоге: 6

19.01.2017, 16:01

5

lepus007, так каков алгоритм?
«Мама» и » Мама», с пробелом в начале — насколько совпадают?



0



Garry Galler

Эксперт Python

5407 / 3831 / 1214

Регистрация: 28.10.2013

Сообщений: 9,554

Записей в блоге: 1

19.01.2017, 16:22

6

Wi0M,
Высчитывать разницусовпадение между словами по всякому можно, просто в вашем случае это чистая алгебра, а не статистика получается.
То есть если взять классическое сравнение «ABCD», «DCBA», то ваш алгоритм скажет, что строки идентичны, поскольку просто вычитает символы одной строки из другой, тогда как стат. алгоритмы сравнения считают кол-во операций вставкиудалениязамены минимально необходимых для превращения одной строки в другую (плюс еще могут учитываться веса каждой операции и пр. вещи).

Python
1
2
3
4
print(search_partial_text("ABCD", "DCBA"))      # 100 %
print(fuzz.ratio("ABCD", "DCBA"))               # 25
print(Levenshtein.ratio("ABCD", "DCBA"))        # 0.25
print(Levenshtein.jaro_winkler("ABCD", "DCBA")) # 0.5



1



 

Приветствую всех!  
Имеется таблица. В ней столбцы с числовыми значениями. Мне нужно определить процент совпадения значений. В Excel я нашёл функцию «=СРОТКЛ(число1; число2)», которая частично решила мою задачу. Для полного решения я изменил функцию на =100-СРОТКЛ(H20:I20).  
Вопрос, есть ли для предназначенная этой задачи функция или это самый оптимальный метод?  
Пример.  
Магазин Базар Процент совпадения  
10 10,5 99,75  
11 11,8 99,6  
12 12,1 99,95  
13 13,7 99,65  
14 12 99  
15 11 98  
16 19 98,5  
17 14 98,5  
18 18 100  
19 19,1 99,95  
20 20 100  
Спасибо!

 

Вот теперь точная формула: =100-ABS(A18-B18).  
ABS, чтобы извлечь положительные значения чисел. 100 — от этого неё отнимаю разницу двух чисел/ячеек и получается процент совпадения.  
Вопрос, есть ли для предназначенная этой задачи функция или это самый оптимальный метод?  
Пример.  
Магазин Базар Процент совпадения  
10 10,5 99,75  
11 11,8 99,6  
12 12,1 99,95  
13 13,7 99,65  
14 12 99  
15 11 98  
16 19 98,5  
17 14 98,5  
18 18 100  
19 19,1 99,95  
20 20 100  
Спасибо

 

vikttur

Пользователь

Сообщений: 47199
Регистрация: 15.09.2012

Хотел Вам сразу предложить =100-ABS(A18-B18), но смутил результат в Вашем примере.  
100-ABS(10-10,5)=99,5, но никак не 99,75, и т.д.

 

MCH

Пользователь

Сообщений: 3886
Регистрация: 22.12.2012

я бы предложил формулу:  
=1-ABS(A1/B1-1)  
формат ячеек процентный  

  или  
=МИН(A1;B1)/МАКС(A1;B1)

 

Вы правы! Просто я разместил результат не от формулы =100-ABS(число1-число2). А от =100-СРОТКЛ(число1;число2). Для лучшего понимания прилагаю файл и кусочек примера.  
Магазин Базар «=100-СРОТКЛ(число1;число2)» «=100-ABS(число1-число2)»  
10 10,5 99,75 99,5  
11 11,8 99,6 99,2  
12 12,1 99,95 99,9  
13 13,7 99,65 99,3  
14 12 99 98  
15 11 98 96  
16 19 98,5 97  
17 14 98,5 97  
18 18 100 100  
19 19,1 99,95 99,9  
20 20 100 100

 

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 можно так же сравнивать строки.

Понравилась статья? Поделить с друзьями:
  • Как найти через скайп по номеру телефона
  • Быстрая зарядка в телефоне как найти
  • Как составить график работы при 40 рабочей недели
  • Как найти работу чтобы ничего не делать
  • Финансовый кризис как найти работу