Besoin de trouver deux chaînes contenant le même mot deux fois

10

J'ai des données d'attribut avec des noms de propriétaires. Je dois sélectionner les données qui contient le nom de famille deux fois .

Par exemple, je peux avoir un nom de propriétaire qui se lit " BENNETT MCCARL & ARNETTE BENNETT ".

Je voudrais sélectionner toutes les lignes de la table attributaire qui ont un nom de famille récurrent tel que l'exemple ci-dessus. Est-ce que quelqu'un sait comment je peux procéder pour sélectionner ces données?

Kristen
la source
Quel SIG utilisez-vous? Python est-il une option?
Aaron
3
Cela distille une question Python pour laquelle je pense que vous trouverez le code Python en recherchant / posant sur Stack Overflow .
PolyGeo
1
S'agit-il d'une liste de noms de famille ou de deux personnes, l'une nommée Bennett McCarl et l'autre Arnette Bennett? Il semble qu'une personne a un prénom Bennett et une autre un nom Bennett?
Aaron
1
Pour ce faire, je pense que vous devez compter les mots uniques de votre chaîne, et s'il est inférieur au nombre de mots de votre chaîne, il y a au moins un mot en double. Distinguer les mots qui sont ou peuvent être des noms de famille d'autres mots sera un exercice distinct. Je pense que vous devriez éditer votre question ici pour rendre vos exigences précises plus claires et les combiner avec la recherche Python sur Stack Overflow .
PolyGeo
1
J'ai révisé votre question sur stackoverflow.com/questions/35165648/… car elle était libellée en "parler ArcGIS" plutôt qu'en "parler Python". Espérons que cela n'obtiendra pas trop de downvotes en attendant que mon montage soit approuvé.
PolyGeo

Réponses:

2

Expression de la calculatrice de champ basée sur cette réponse

def cw(sentence):
 words = sentence.split()
 counts = {}
 nMax=0
 for word in words:
    if word not in counts:counts[word] = 0
    counts[word] += 1
    nMax=max(nMax, counts[word])
 return nMax

'================================================= =

cw( !MUID!)

Il renverra le nombre maximum de mêmes mots dans la chaîne

FelixIP
la source
8

Vous pouvez utiliser le module de collections Python et un curseur de mise à jour pour accomplir cela. Cette méthode ajoute un nouveau champ et le remplit avec a 1s'il y a des doublons, sinon a 0s'il n'y a pas de doublons.

import arcpy, collections

shp = r'C:\temp\names.shp'

# Add a field called "check" to store binary data.

arcpy.AddField_management(shp, field_name = "check", field_type = "SHORT")

# Use an Update Cursor to query the table and write to new rows
# 1 = has duplicates
# 0 = no duplicates
with arcpy.da.UpdateCursor(shp, ["last_names", "check"]) as cursor:
    for row in cursor:
        names = row[0].replace("&", "").split() # Clean the string
        counts = collections.Counter(names) #create dictionary to count occurrences of words
        if any(x > 1 for x in list([count for name, count in counts.items()])):
            row[1] = 1
        else:
            row[1] = 0
        cursor.updateRow(row)

entrez la description de l'image ici

Aaron
la source
1
Belle utilisation de ce module de collections, je n'ai jamais su qu'il existait. Je pensais dans le même sens, mais en utilisant des expressions régulières pour extraire des mots répétitifs pour créer un champ indicateur. Je pense que votre approche utilisant la fonction compteur est beaucoup plus facile à comprendre. Je vérifierai ce module plus tard!
Hornbydd
6

Qu'en est-il de l'utilisation reet de la setdéfinition d'un indicateur (ici 0 et 1) en python- reextraira tous les noms (nom et prénom) de l' BENNETT MCCARL & ARNETTE BENNETTextérieur &. Pour la correspondance de motifs reest de la plus haute priorité, vous pouvez utiliser recomme vous le souhaitez.

import re
def sorter(val):
    words = re.findall(r'\w+',val)
    uniques = set(words)
    if len(words)>len(uniques):
        return 1
    else:
        return 0

Et appeler sorter( !N! )


démo


** Voir comment regexsaisit les mots surLIVE DEMO

Notez que toutes ces réponses traitent le problème en supposant que vos données sont nettoyées, c'est-à-dire qu'elles ont un espace approprié entre les mots, mais que se passe-t-il si vos données ressemblent à quelque chose, BENNETTMCCARL&ARNETTEBENNETTalors tout cela échouera. Dans ce cas, vous devrez peut-être utiliser l' algorithme Suffix Tree et heureusement python a une bibliothèque comme ici .

SIslam
la source
regex à la rescousse, sympa!
Hornbydd
2

En supposant que vos données source sont une FeatureClass / Table dans une géodatabase fichier, la requête suivante sélectionnera les lignes dont vous avez besoin:

SUBSTRING(name FROM 1 FOR 7) = 'BENNETT' AND SUBSTRING(name FROM (CHAR_LENGTH(name) - 6) FOR 7) = 'BENNETT

nameest le domaine, je viens de l'appeler name. La première partie teste le côté gauche, la deuxième partie teste le droit. Cette requête est évidemment codée en dur pour rechercher BENNETT, si vous avez besoin de sélectionner par d'autres noms de famille, nous espérons que vous pouvez déterminer ce qui doit changer?

Hornbydd
la source