Guest User

Untitled

a guest
Jun 20th, 2018
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.01 KB | None | 0 0
  1. import difflib
  2. import pandas as pd
  3. pd.set_option('max_colwidth', 50)
  4. pd.set_option('display.width', 500)
  5.  
  6.  
  7. '''
  8. Алгоритм:
  9.  
  10. difflib.SequenceMatcher использует алгоритм Ratcliff/Obershelp,
  11. который вычисляет удвоенное количество совпадающих символов,
  12. деленное на общее количество символов в две строки.
  13. '''
  14.  
  15.  
  16. names = [
  17. 'Акционерное общество "Русская Телефонная Компания"'
  18. 'АО',
  19. 'АО "РТК"',
  20. 'АО "РТК"',
  21. 'АО "ртк", СПЕЦИАЛИСТ ПО ПРОДАЖАМ',
  22. 'АО "Русская Телефонная Компания"',
  23. 'АО "Русская телефонная компания"-специалист',
  24. 'АО "РТК',
  25. 'АО "РТК"',
  26. 'АО "Русская Телефонная Компания "',
  27. 'АО "РУССКАЯ ТЕЛЕФОННАЯ КОМПАНИЯ"',
  28. 'АО «РТК»',
  29. 'АО «русская телефонная компания»',
  30. 'АО МТС',
  31. 'АО РТК',
  32. 'АО РТК МТС',
  33. 'АО русская телефоная компания',
  34. 'АО Русская телефонная компания',
  35. 'Ао русская телефонная компания (салон свящи мтс)',
  36. 'АО Русская телефонная компаня',
  37. 'Ао" ртк"',
  38. 'АО"РТК"',
  39. 'аор ртк мтс',
  40. 'АР "РТК"',
  41. 'Армия России',
  42. 'ЗАО "Русская телефонная компания"',
  43. 'ЗАО РТК',
  44. 'ЗАО русская телефонная компания',
  45. 'ЗАО"РТК"',
  46. 'Мтс',
  47. 'ОА "РТК"',
  48. 'ОАО РТК',
  49. 'ООО "РТК"',
  50. 'ООО РТК',
  51. 'ООО спецперсонал',
  52. 'ПАО "мтс"',
  53. 'ПАО МТС',
  54. 'по ртк',
  55. 'РТК'
  56. ]
  57.  
  58. exclude = ["акционерное общество ", "пао&amp", "зао&amp","ао&amp", "&amp", "quot", "ооо", "оао ", "зао ", "аор ",
  59. "пао ", "ао ", "ар ", "оа ", "по ", "'", ";", ",", '"', "«", "»", "(", ")"]
  60.  
  61. min_size = 5
  62. fnames = [x.lower() for x in names] # Переводим в нижний регистр
  63.  
  64. df_names = pd.DataFrame() # Датафрейм для отображения имен до фильтрации и после (не включая правила аббревиатур)
  65. df_names['name_old'] = fnames
  66.  
  67. # Убираем лишние слова
  68. for i in range(len(fnames)):
  69. for el in exclude:
  70. if el in fnames[i]:
  71. while el in fnames[i]:
  72. fnames[i] = fnames[i].replace(el, "").strip()
  73.  
  74. df_names['name_new'] = fnames
  75. print(df_names)
  76.  
  77. lst = []
  78.  
  79. for i in range(len(fnames)):
  80. for j in range(i + 1, len(fnames)):
  81.  
  82. # Точное совпадение
  83. if fnames[i] == fnames[j]:
  84. lst.append([names[i], names[j], 1])
  85.  
  86. # Проверка аббревиатур 1
  87. elif len(fnames[i]) <= min_size and (" " in fnames[j]) and len(fnames[j].split(" ")) > 0:
  88. name2 = ''.join(x[0] for x in fnames[j].split(" "))
  89. name1 = fnames[i]
  90. lst.append([names[i], names[j], difflib.SequenceMatcher(None, name1, name2).ratio()])
  91.  
  92. # Проверка аббревиатур 2
  93. elif len(fnames[j]) <= min_size and (" " in fnames[i]) and len(fnames[i].split(" ")) > 0:
  94. name2 = ''.join(x[0] for x in fnames[i].split(" "))
  95. name1 = fnames[j]
  96. lst.append([names[j], names[i], difflib.SequenceMatcher(None, name1, name2).ratio()])
  97.  
  98. # Обычная проверка
  99. else:
  100. lst.append([names[i], names[j], difflib.SequenceMatcher(None, fnames[i], fnames[j]).ratio()])
  101.  
  102. result = pd.DataFrame(lst, columns=['name_1', 'name_2', 'corr']) # Create data frame
  103. result = result.sort_values(by=['corr'], ascending=False) # Сортируем по убыванию коэф-та корреляции
  104.  
  105. print(result)
  106.  
  107. # result.to_excel("result.xlsx") # Сохранение в файл
Add Comment
Please, Sign In to add comment