Mam 2 listy ponad miliona nazw z nieco innymi konwencjami nazewnictwa. Celem jest dopasowanie podobnych rekordów, z logiką 95% pewności.Dopasowywanie ciągów rozmytych w języku Python
Poinformowano mnie, że istnieją biblioteki, na których mogę działać, takie jak moduł FuzzyWuzzy w Pythonie.
Jednak pod względem przetwarzania wydaje się, że zajmie zbyt dużo zasobów, mając każdy ciąg na 1 liście, aby porównać go z drugim, co w tym przypadku wydaje się wymagać miliona pomnożonego przez kolejny milion liczby iteracji.
Czy istnieją inne, bardziej skuteczne metody tego problemu?
UPDATE:
Stworzyłem więc funkcję bucketing i zastosowano prostą normalizację usuwania spacją, symboli i wartości konwersji na małe litery itp ...
for n in list(dftest['YM'].unique()):
n = str(n)
frame = dftest['Name'][dftest['YM'] == n]
print len(frame)
print n
for names in tqdm(frame):
closest = process.extractOne(names,frame)
za pomocą pytonów pand, dane jest ładowany do mniejszych segmentów pogrupowanych według lat, a następnie za pomocą modułu FuzzyWuzzy, process.extractOne
służy do najlepszego dopasowania.
Wyniki są nadal nieco rozczarowujące. Podczas testu powyższy kod jest używany w ramce danych testowych zawierającej tylko 5 tysięcy nazw i zajmuje prawie całą godzinę.
Dane testowe są podzielone przez.
- Nazwa
- Rok Miesiąc Data urodzenia
A ja porównując je przez wiader, gdzie ich YMS są w tym samym segmencie.
Czy problem może wynikać z modułu FuzzyWuzzy, którego używam? Doceniam każdą pomoc.
Możesz spróbować znormalizować nazwy i porównać znormalizowane formularze. To staje się całkiem możliwe do zrównoleglenia. – Alec
Jak poleciłbyś normalizacje? Czy istnieje standardowa metoda, którą mogę zastosować? Doceniam Twoją opinię. – BernardL
Cóż, zależy to od rodzaju różnic w nazewnictwie? Jako prosty przykład, pasujące nazwy firm, mogę odciąć rzeczy takie jak 'LTD' lub' INC', a może nawet bez liter. – Alec