È necessario trovare due stringhe che contengono la stessa parola due volte


10

Ho i dati degli attributi con i nomi dei proprietari. Devo selezionare due volte i dati che contengono il cognome .

Ad esempio, potrei avere un nome del proprietario che recita " BENNETT MCCARL & ARNETTE BENNETT ".

Vorrei selezionare tutte le righe nella tabella degli attributi che hanno un cognome ricorrente come nell'esempio sopra. Qualcuno sa come posso fare per selezionare quei dati?


Quale GIS stai usando? Python è un'opzione?
Aaron

3
Questo porta a una domanda su Python per la quale penso che troverai il codice Python ricercando / chiedendo su Stack Overflow .
PolyGeo

1
È un elenco di cognomi o due persone, uno di nome Bennett McCarl e un altro Arnette Bennett? Sembra che una persona abbia un nome Bennett e un'altra abbia un cognome Bennett?
Aaron

1
Per fare questo penso che devi contare le parole uniche nella tua stringa, e se è inferiore al numero di parole nella tua stringa, allora c'è almeno una parola duplicata. Distinguere le parole che sono o possono essere cognomi da altre parole sarà un esercizio separato. Penso che dovresti modificare la tua domanda qui per rendere più chiari i tuoi requisiti precisi e combinarlo con la ricerca Python su Stack Overflow .
PolyGeo

1
Ho modificato la tua domanda su stackoverflow.com/questions/35165648/… perché è stata formulata in "ArcGIS-speak" piuttosto che "Python-speak". Spero che non ottenga troppi voti negativi in ​​attesa che la mia modifica venga approvata.
PolyGeo

Risposte:


2

Espressione del calcolatore di campo basata su questa risposta

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!)

Restituirà il conteggio massimo delle stesse parole nella stringa


8

A tale scopo è possibile utilizzare il modulo delle raccolte Python e un cursore di aggiornamento. Questo metodo aggiunge un nuovo campo e lo popola con un 1se ci sono duplicati, altrimenti un 0se non ci sono duplicati.

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)

inserisci qui la descrizione dell'immagine


1
Buon uso di questo modulo di raccolte, non ho mai saputo che esistesse. Stavo pensando sulle stesse linee ma usando espressioni regolari per estrarre parole ripetute per creare un campo bandiera. Penso che il tuo approccio usando la funzione contatore sia molto più facile da capire. Controllerò quel modulo più tardi!
Hornbydd,

6

Cosa succede ad usare reed sete impostazione di un flag (qui 0 e 1) in Pitone reestrarrà tutti i nomi (ultimo e il primo) da BENNETT MCCARL & ARNETTE BENNETTsenza &. Perché la corrispondenza dei motivi ha la remassima priorità: puoi usare recome vuoi.

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

E chiama sorter( !N! )


dimostrazione


** Guarda come regexafferra le parole aLIVE DEMO

Tieni presente che tutte queste risposte risolvono il problema supponendo che i tuoi dati siano disinfettati, ovvero che abbiano uno spazio adeguato tra le parole, ma cosa succede se i tuoi dati sono qualcosa di simileBENNETTMCCARL&ARNETTEBENNETT allora tutti questi fallirebbero. In tal caso potrebbe essere necessario utilizzare l' algoritmo Suffix Tree e fortunatamente Python ha alcune librerie come qui .


regex in soccorso, bello!
Hornbydd,

2

Supponendo che i dati di origine siano una FeatureClass / Table in un file GeoDatabase, la seguente query selezionerà le righe richieste:

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

nameè il campo, mi è capitato di chiamarlo name. La prima parte sta testando il lato sinistro, la seconda parte sta testando il lato destro. Questa query è ovviamente codificata per cercare BENNETT, se è necessario selezionare altri cognomi, spero che tu possa capire cosa deve cambiare?

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.