Frage

Mir wurde eine Tabelle mit etwa 18.000 Zeilen ausgehändigt.Jeder Datensatz beschreibt den Standort eines Kunden.Das Problem besteht darin, dass die Person beim Erstellen der Tabelle kein Feld für „Firmenname“, sondern nur „Standortname“ hinzugefügt hat und ein Unternehmen viele Standorte haben kann.

Hier sind beispielsweise einige Datensätze, die denselben Kunden beschreiben:

Standorttabelle

 ID  Location_Name     
 1   TownShop#1        
 2   Town Shop - Loc 2 
 3   The Town Shop     
 4   TTS - Someplace   
 5   Town Shop,the 3   
 6   Toen Shop4        

Mein Ziel ist es, dass es so aussieht:

Standorttabelle

 ID  Company_ID   Location_Name     
 1   1            Town Shop#1       
 2   1            Town Shop - Loc 2 
 3   1            The Town Shop     
 4   1            TTS - Someplace   
 5   1            Town Shop,the 3   
 6   1            Toen Shop4        

Firmentisch

 Company_ID  Company_Name  
 1           The Town Shop 

Es gibt keine Tabelle „Firma“. Ich muss die Firmennamenliste aus dem aussagekräftigsten oder besten Standortnamen erstellen, der die mehreren Standorte repräsentiert.

Momentan denke ich, dass ich eine Liste ähnlicher Ortsnamen erstellen und diese Liste dann manuell durchgehen muss.

Für Vorschläge, wie ich das angehen kann, bin ich dankbar.

@Neall, vielen Dank für Ihre Aussage, aber leider ist jeder Ortsname unterschiedlich, es gibt keine doppelten Ortsnamen, nur ähnliche.In den Ergebnissen Ihrer Anweisung ist „repcount“ also 1 in jeder Zeile.

@yukondude, Ihr Schritt 4 ist der Kern meiner Frage.

War es hilfreich?

Lösung

Bitte aktualisieren Sie die Frage. Steht Ihnen eine Liste mit Firmennamen zur Verfügung?Ich frage, weil Sie möglicherweise den Levenshtein-Algorithmus verwenden können, um eine Beziehung zwischen Ihrer Liste von Firmennamen und Standortnamen zu finden.


Aktualisieren

Es gibt keine Liste mit Firmennamen. Ich muss den Firmennamen aus dem aussagekräftigsten oder besten Standortnamen generieren, der die mehreren Standorte repräsentiert.

Okay...Versuche dies:

  1. Erstellen Sie eine Liste mit möglichen Firmennamen, indem Sie nach Standortnamen suchen, die größtenteils oder ausschließlich aus Buchstaben bestehen.Sie können verwenden Reguläre Ausdrücke dafür.Speichern Sie diese Liste in einer separaten Tabelle.
  2. Sortieren Sie diese Liste alphabetisch und bestimmen Sie (manuell), welche Einträge Firmennamen sein sollen.
  3. Vergleichen Sie jeden Firmennamen mit jedem Standortnamen und ermitteln Sie einen Übereinstimmungswert (verwenden Sie Levenstein oder ein anderer String-Matching-Algorithmus).Speichern Sie das Ergebnis in einer separaten Tabelle.
  4. Legen Sie einen Schwellenwert fest, sodass ein MatchScore < Schwellenwert nicht als Übereinstimmung für einen bestimmten Firmennamen angesehen wird.
  5. Manuell durch die Standortnamen von CompanyName | durch die Standortnamen zitieren | Standortname | Matchscore und finden Sie heraus, welche tatsächlich übereinstimmen.Die Sortierung nach MatchScore sollte den Prozess weniger mühsam machen.

Der gesamte Zweck der oben genannten Maßnahmen besteht darin, Teile zu automatisieren und den Umfang Ihres Problems einzuschränken.Es ist alles andere als perfekt, erspart Ihnen aber hoffentlich die Mühe, 18K-Datensätze manuell durchzugehen.

Andere Tipps

Ich musste das schon einmal machen.Die einzige wirkliche Möglichkeit besteht darin, die verschiedenen Standorte manuell abzugleichen.Verwenden Sie die Konsolenschnittstelle Ihrer Datenbank und gruppieren Sie SELECT-Anweisungen.Fügen Sie zunächst das Feld „Firmenname“ hinzu.Dann:

SELECT count(*) AS repcount, "Location Name" FROM mytable
 WHERE "Company Name" IS NULL
 GROUP BY "Location Name"
 ORDER BY repcount DESC
 LIMIT 5;

Finden Sie heraus, zu welchem ​​Unternehmen der Standort oben in der Liste gehört, und aktualisieren Sie dann das Feld „Firmenname“ mit einem UPDATE ...WHERE „Standortname“ = „Der Standort“-Anweisung.

P.S.- Sie sollten Ihre Firmennamen und Standortnamen wirklich in separate Tabellen aufteilen und mit ihren Primärschlüsseln darauf verweisen.

Aktualisieren:- Wow – keine Duplikate?Wie viele Datensätze haben Sie?

Ich wollte einen komplizierten Token-Matching-Algorithmus empfehlen, aber es ist wirklich schwierig, ihn richtig zu machen, und wenn Ihre Daten keine große Korrelation aufweisen (Tippfehler usw.), werden keine sehr guten Ergebnisse erzielt.

Ich würde Ihnen empfehlen, einen Job bei der einzureichen Amazon Mechanical Turk und lass es einen Menschen regeln.

Idealerweise möchten Sie wahrscheinlich eine separate Tabelle mit dem Namen „Company“ und dann eine Spalte „company_id“ in dieser „Location“-Tabelle, die ein Fremdschlüssel für den Primärschlüssel der Company-Tabelle ist, wahrscheinlich mit dem Namen „id“.Dadurch würde ein erheblicher Teil der Textduplizierung in dieser Tabelle vermieden (über 18.000 Zeilen würde ein ganzzahliger Fremdschlüssel gegenüber einer Varchar-Spalte einiges an Platz sparen).

Aber Sie stehen immer noch vor einer Methode, die Company-Tabelle zu laden und sie dann richtig mit den Zeilen in „Location“ zu verknüpfen.Es gibt keine allgemeine Lösung, aber Sie könnten etwas in diese Richtung tun:

  1. Erstellen Sie die Firmentabelle mit einer ID-Spalte, die automatisch inkrementiert wird (abhängig von Ihrem RDBMS).
  2. Suchen Sie alle eindeutigen Firmennamen und fügen Sie sie in „Unternehmen“ ein.
  3. Fügen Sie eine Spalte „company_id“ zu „Location“ hinzu, die (vorerst) NULL-Werte akzeptiert und ein Fremdschlüssel der Spalte „Company.id“ ist.
  4. Bestimmen Sie für jede Zeile in „Standort“ das entsprechende Unternehmen und AKTUALISIEREN Sie die Spalte „company_id“ dieser Zeile mit der ID dieses Unternehmens.Dies ist wahrscheinlich der schwierigste Schritt.Wenn Ihre Daten denen im Beispiel entsprechen, müssen Sie wahrscheinlich viele Durchläufe mit verschiedenen String-Matching-Ansätzen durchführen.
  5. Sobald alle Zeilen in „Location“ einen Wert „company_id“ haben, können Sie die Tabelle „Company“ ÄNDERN, um eine NOT NULL-Einschränkung zur Spalte „company_id“ hinzuzufügen (vorausgesetzt, dass jeder Standort muss eine Firma haben, was vernünftig erscheint).

Wenn Sie eine Kopie Ihrer Standorttabelle erstellen können, können Sie nach und nach eine Reihe von SQL-Anweisungen erstellen, um den Fremdschlüssel „company_id“ zu füllen.Wenn Sie einen Fehler machen, können Sie einfach von vorne beginnen und das Skript bis zum Fehler erneut ausführen.

Ja, dieser Schritt 4 aus meinem vorherigen Beitrag ist ein Trottel.

Auf jeden Fall müssen Sie einen Teil davon wahrscheinlich manuell erledigen, den Großteil können Sie jedoch möglicherweise automatisieren.Für die von Ihnen angegebenen Beispielstandorte würde eine Abfrage wie die folgende den entsprechenden Wert für „company_id“ festlegen:

UPDATE  Location
SET     Company_ID = 1
WHERE   (LOWER(Location_Name) LIKE '%to_n shop%'
OR      LOWER(Location_Name) LIKE '%tts%')
AND     Company_ID IS NULL;

Ich glaube, das würde zu Ihren Beispielen passen (ich habe das hinzugefügt IS NULL Teil, um zuvor festgelegte Company_ID-Werte nicht zu überschreiben), aber natürlich müssen Sie bei 18.000 Zeilen ziemlich erfinderisch sein, um mit den verschiedenen Kombinationen umzugehen.

Etwas anderes, das hilfreich sein könnte, wäre die Verwendung der Namen in „Unternehmen“, um Abfragen wie die obige zu generieren.Sie könnten etwa Folgendes tun (in MySQL):

SELECT  CONCAT('UPDATE Location SET Company_ID = ',
        Company_ID, ' WHERE LOWER(Location_Name) LIKE ',
        LOWER(REPLACE(Company_Name), ' ', '%'), ' AND Company_ID IS NULL;')
FROM    Company;

Führen Sie dann einfach die Anweisungen aus, die es erzeugt.Das könnte einen Großteil der Grunge-Arbeit für Sie erledigen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top