Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import difflib
- import pandas as pd
- pd.set_option('max_colwidth', 50)
- pd.set_option('display.width', 500)
- '''
- Алгоритм:
- difflib.SequenceMatcher использует алгоритм Ratcliff/Obershelp,
- который вычисляет удвоенное количество совпадающих символов,
- деленное на общее количество символов в две строки.
- '''
- names = [
- 'Акционерное общество "Русская Телефонная Компания"'
- 'АО',
- 'АО "РТК"',
- 'АО "РТК"',
- 'АО "ртк", СПЕЦИАЛИСТ ПО ПРОДАЖАМ',
- 'АО "Русская Телефонная Компания"',
- 'АО "Русская телефонная компания"-специалист',
- 'АО "РТК',
- 'АО "РТК"',
- 'АО "Русская Телефонная Компания "',
- 'АО "РУССКАЯ ТЕЛЕФОННАЯ КОМПАНИЯ"',
- 'АО «РТК»',
- 'АО «русская телефонная компания»',
- 'АО МТС',
- 'АО РТК',
- 'АО РТК МТС',
- 'АО русская телефоная компания',
- 'АО Русская телефонная компания',
- 'Ао русская телефонная компания (салон свящи мтс)',
- 'АО Русская телефонная компаня',
- 'Ао" ртк"',
- 'АО"РТК"',
- 'аор ртк мтс',
- 'АР "РТК"',
- 'Армия России',
- 'ЗАО "Русская телефонная компания"',
- 'ЗАО РТК',
- 'ЗАО русская телефонная компания',
- 'ЗАО"РТК"',
- 'Мтс',
- 'ОА "РТК"',
- 'ОАО РТК',
- 'ООО "РТК"',
- 'ООО РТК',
- 'ООО спецперсонал',
- 'ПАО "мтс"',
- 'ПАО МТС',
- 'по ртк',
- 'РТК'
- ]
- exclude = ["акционерное общество ", "пао&", "зао&","ао&", "&", "quot", "ооо", "оао ", "зао ", "аор ",
- "пао ", "ао ", "ар ", "оа ", "по ", "'", ";", ",", '"', "«", "»", "(", ")"]
- min_size = 5
- fnames = [x.lower() for x in names] # Переводим в нижний регистр
- df_names = pd.DataFrame() # Датафрейм для отображения имен до фильтрации и после (не включая правила аббревиатур)
- df_names['name_old'] = fnames
- # Убираем лишние слова
- for i in range(len(fnames)):
- for el in exclude:
- if el in fnames[i]:
- while el in fnames[i]:
- fnames[i] = fnames[i].replace(el, "").strip()
- df_names['name_new'] = fnames
- print(df_names)
- lst = []
- for i in range(len(fnames)):
- for j in range(i + 1, len(fnames)):
- # Точное совпадение
- if fnames[i] == fnames[j]:
- lst.append([names[i], names[j], 1])
- # Проверка аббревиатур 1
- elif len(fnames[i]) <= min_size and (" " in fnames[j]) and len(fnames[j].split(" ")) > 0:
- name2 = ''.join(x[0] for x in fnames[j].split(" "))
- name1 = fnames[i]
- lst.append([names[i], names[j], difflib.SequenceMatcher(None, name1, name2).ratio()])
- # Проверка аббревиатур 2
- elif len(fnames[j]) <= min_size and (" " in fnames[i]) and len(fnames[i].split(" ")) > 0:
- name2 = ''.join(x[0] for x in fnames[i].split(" "))
- name1 = fnames[j]
- lst.append([names[j], names[i], difflib.SequenceMatcher(None, name1, name2).ratio()])
- # Обычная проверка
- else:
- lst.append([names[i], names[j], difflib.SequenceMatcher(None, fnames[i], fnames[j]).ratio()])
- result = pd.DataFrame(lst, columns=['name_1', 'name_2', 'corr']) # Create data frame
- result = result.sort_values(by=['corr'], ascending=False) # Сортируем по убыванию коэф-та корреляции
- print(result)
- # result.to_excel("result.xlsx") # Сохранение в файл
Add Comment
Please, Sign In to add comment