Question

J'ai reçu une table d'environ 18 000 lignes.Chaque enregistrement décrit l'emplacement d'un client.Le problème est que lorsque la personne a créé la table, elle n'a pas ajouté de champ pour « Nom de l'entreprise », uniquement « Nom de l'emplacement », et une entreprise peut avoir plusieurs emplacements.

Par exemple, voici quelques enregistrements qui décrivent le même client :

Tableau de localisation

 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        

Mon objectif est de faire en sorte que cela ressemble à :

Tableau de localisation

 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        

Tableau de l'entreprise

 Company_ID  Company_Name  
 1           The Town Shop 

Il n'y a pas de tableau « Entreprise », je devrai générer la liste des noms de société à partir du nom d'emplacement le plus descriptif ou le meilleur qui représente les multiples emplacements.

Actuellement, je pense que je dois générer une liste de noms de lieux similaires, puis parcourir cette liste à la main.

Toutes les suggestions sur la façon dont je peux aborder cela sont appréciées.

@Neall, merci pour votre déclaration, mais malheureusement, chaque nom de lieu est distinct, il n'y a pas de noms de lieu en double, seulement similaires.Ainsi, dans les résultats de votre instruction, "repcount" vaut 1 dans chaque ligne.

@yukondude, Votre étape 4 est au cœur de ma question.

Était-ce utile?

La solution

Veuillez mettre à jour la question. Avez-vous une liste de noms de sociétés à votre disposition ?Je demande parce que vous pourrez peut-être utiliser l'algo Levenshtein pour trouver une relation entre votre liste de noms d'entreprise et de noms d'emplacement.


Mise à jour

Il n'y a pas de liste de noms d'entreprise, je devrai générer le nom de l'entreprise à partir du nom d'emplacement le plus descriptif ou le meilleur qui représente les multiples emplacements.

D'accord...essaye ça:

  1. Créez une liste de noms d'entreprise candidats en recherchant des noms d'emplacement composés principalement ou entièrement de caractères alphabétiques.Vous pouvez utiliser expressions régulières pour ça.Stockez cette liste dans un tableau séparé.
  2. Triez cette liste par ordre alphabétique et déterminez (manuellement) quelles entrées doivent être des noms de société.
  3. Comparez chaque CompanyName à chaque LocationName et obtenez un score de correspondance (utilisez Levenshtein ou un autre algorithme de correspondance de chaîne).Stockez le résultat dans un tableau séparé.
  4. Définissez un score seuil tel que tout MatchScore < Threshold ne soit pas considéré comme une correspondance pour un CompanyName donné.
  5. Vet manuellement via les noms de localisation par CompanyName | LocationName | MatchScore, et déterminez ceux qui correspondent réellement.La commande par MatchScore devrait rendre le processus moins pénible.

Le but des actions ci-dessus est d'automatiser les pièces et de limiter la portée de votre problème.C'est loin d'être parfait, mais nous espérons que cela vous évitera d'avoir à parcourir manuellement les enregistrements 18K.

Autres conseils

J'ai déjà dû faire ça.La seule véritable façon d’y parvenir est de faire correspondre manuellement les différents emplacements.Utilisez l'interface de console de votre base de données et regroupez les instructions select.Tout d’abord, ajoutez votre champ « Nom de l’entreprise ».Alors:

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

Déterminez à quelle entreprise appartient l'emplacement en haut de la liste, puis mettez à jour le champ du nom de votre entreprise avec une MISE À JOUR...WHERE "Nom de l'emplacement" = instruction "L'emplacement".

P.S.- Vous devriez vraiment diviser les noms de votre entreprise et vos noms de lieux dans des tableaux séparés et y faire référence par leurs clés primaires.

Mise à jour:- Wow – pas de doublons ?Combien de disques avez-vous ?

J'allais recommander un algorithme de correspondance de jetons compliqué, mais il est vraiment difficile de réussir et si vos données n'ont pas beaucoup de corrélation (fautes de frappe, etc.), cela ne donnera pas de très bons résultats.

Je vous recommande de soumettre un emploi au Amazone Turc Mécanique et laissez un humain régler le problème.

Idéalement, vous voudriez probablement une table distincte nommée Company, puis une colonne company_id dans cette table « Location » qui est une clé étrangère de la clé primaire de la table Company, probablement appelée id.Cela éviterait une bonne partie de la duplication de texte dans ce tableau (sur 18 000 lignes, une clé étrangère entière permettrait d'économiser un peu d'espace sur une colonne varchar).

Mais vous êtes toujours confronté à une méthode permettant de charger cette table Company, puis de l'associer correctement aux lignes de Location.Il n'y a pas de solution générale, mais vous pouvez faire quelque chose dans ce sens :

  1. Créez la table Company, avec une colonne id qui s'incrémente automatiquement (dépend de votre SGBDR).
  2. Recherchez tous les noms d’entreprise uniques et insérez-les dans Entreprise.
  3. Ajoutez une colonne, company_id, à Location qui accepte les valeurs NULL (pour l'instant) et qui est une clé étrangère de la colonne Company.id.
  4. Pour chaque ligne dans Emplacement, déterminez la société correspondante et METTRE À JOUR la colonne company_id de cette ligne avec l'identifiant de cette société.C’est probablement l’étape la plus difficile.Si vos données ressemblent à ce que vous montrez dans l'exemple, vous devrez probablement effectuer de nombreuses tentatives avec différentes approches de correspondance de chaînes.
  5. Une fois que toutes les lignes de Location ont une valeur company_id, vous pouvez ALTER la table Company pour ajouter une contrainte NOT NULL à la colonne company_id (en supposant que chaque emplacement doit avoir une entreprise, ce qui semble raisonnable).

Si vous pouvez faire une copie de votre table Location, vous pouvez progressivement créer une série d'instructions SQL pour remplir la clé étrangère company_id.Si vous faites une erreur, vous pouvez simplement recommencer et réexécuter le script jusqu'au point d'échec.

Oui, cette étape 4 de mon message précédent est un véritable casse-tête.

Quoi qu'il en soit, vous devrez probablement effectuer une partie de cette opération à la main, mais vous pourrez peut-être en automatiser la majeure partie.Pour les exemples d'emplacements que vous avez donnés, une requête comme celle-ci définirait la valeur company_id appropriée :

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;

Je pense que cela correspondrait à vos exemples (j'ai ajouté le IS NULL partie pour ne pas écraser les valeurs Company_ID précédemment définies), mais bien sûr, dans 18 000 lignes, vous devrez être assez inventif pour gérer les différentes combinaisons.

Une autre solution qui pourrait aider serait d'utiliser les noms dans Company pour générer des requêtes comme celle ci-dessus.Vous pourriez faire quelque chose comme ceci (dans 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;

Ensuite, exécutez simplement les instructions qu'il produit.Cela pourrait faire une grande partie du travail de grunge pour vous.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top