Сопоставьте одинаковые элементы столбца, используя панд и fuzzwuzzy - PullRequest
0 голосов
/ 03 октября 2018

У меня есть файл Excel, который содержит более 1000 наименований компаний в одном столбце и около 20 000 наименований компаний в другом столбце.

Цель состоит в том, чтобы найти как можно больше имен.Проблема в том, что имена в первом столбце (1000 +) плохо отформатированы, что означает, что строка «Название компании» может выглядеть примерно как "9Com (panynAm9e00" . Я пытаюсьчтобы выяснить лучший способ решить эту проблему (точно совпадают только 12 имен)

Попробовав разные методы, я попытался сопоставить 4-5 или более символов в каждом имени, в зависимости отдлина каждой строки с использованием регулярных выражений. Но я просто пытаюсь найти наиболее эффективный способ сделать это.

Например:

Столбец 1

 1. 9Com(panynAm9e00 
 2. NikE4 
 3. Mitrosof2

Столбец 2

 1. Microsoft
 2. Company Name
 3. Nike

Возьмите первый элемент в Столбец 1 и найдите совпадение в Столбец 2 .Если нет точного соответствия, ищите строку с 4-5 одинаковыми символами.

Есть предложения?

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

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

  1. преобразовать все (столбцы 1 и 2) в строчные буквы
  2. Для каждой известной компании в столбце2, сохранить каждую уникальную букву и сколько раз она появляется (считать) в словаре
  3. Проделайте то же самое (шаг 2) для каждой записи в столбце 1
  4. Для каждой записи в столбце 1найдите ближайший пакет букв (словарь из шага 2) из ​​списка реальных названий компаний

Реализация словарного расстояния зависит от вас.

0 голосов
/ 03 октября 2018

Я бы предложил прочитать ваш файл Excel с pandas и pd.read_excel(), а затем использовать fuzzywuzzy для сопоставления, например:

import pandas as pd
from fuzzywuzzy import process, fuzz

df = pd.DataFrame([['9Com(panynAm9e00'],
        ['NikE4'],
        ['Mitrosof2']],
        columns=['Name'])

known_list = ['Microsoft','Company Name','Nike']

def find_match(x):

  match = process.extractOne(x, known_list, scorer=fuzz.partial_token_sort_ratio)[0]
  return match

df['match found'] = [find_match(row) for row in df['Name']]

Выход:

               Name   match found
0  9Com(panynAm9e00  Company Name
1             NikE4          Nike
2         Mitrosof2     Microsoft
...