Necesita encontrar cadenas que contengan la misma palabra dos veces


10

Tengo datos de atributos con nombres de propietarios. Necesito seleccionar datos que contengan el apellido dos veces .

Por ejemplo, es posible que tenga un nombre de propietario que diga " BENNETT MCCARL & ARNETTE BENNETT ".

Me gustaría seleccionar cualquier fila en la tabla de atributos que tenga un apellido recurrente, como el ejemplo anterior. ¿Alguien sabe cómo puedo hacer para seleccionar esos datos?


¿Qué SIG estás usando? ¿Python es una opción?
Aaron

3
Esto destila una pregunta de Python para la que creo que encontrará el código de Python investigando / preguntando en Stack Overflow .
PolyGeo

1
¿Es esta una lista de apellidos o dos personas, una llamada Bennett McCarl y otra Arnette Bennett? Parece que una persona tiene un nombre de Bennett y otra tiene un apellido de Bennett.
Aaron

1
Para hacer esto, creo que necesita contar las palabras únicas en su cadena, y si es menor que la cantidad de palabras en su cadena, entonces hay al menos una palabra duplicada. Distinguir palabras que son o pueden ser apellidos de otras palabras será un ejercicio separado. Creo que debería editar su pregunta aquí para aclarar sus requisitos precisos y combinarlo con la investigación de Python en Stack Overflow .
PolyGeo

1
Revisé su pregunta en stackoverflow.com/questions/35165648/... porque estaba redactada en "ArcGIS-speak" en lugar de "Python-speak". Con suerte, no obtendrá demasiados votos negativos mientras espero que se apruebe mi edición.
PolyGeo

Respuestas:


2

Expresión de calculadora de campo basada en esta respuesta

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

Devolverá el recuento máximo de las mismas palabras en la cadena


8

Puede usar el módulo de colecciones de Python y un cursor de actualización para lograr esto. Este método agrega un nuevo campo y lo llena con un 1si hay duplicados, de lo contrario, 0si no hay duplicados.

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)

ingrese la descripción de la imagen aquí


1
Buen uso de este módulo de colecciones, nunca supe que existía. Estaba pensando en las mismas líneas pero usando expresiones regulares para extraer palabras repetidas para crear un campo de bandera. Creo que su enfoque utilizando la función de contador es mucho más fácil de entender. ¡Veré ese módulo más tarde!
Hornbydd

6

¿Qué pasa con el uso rey la setconfiguración de una bandera (aquí 0 y 1) en python? Extraerá retodos los nombres (apellido y primer nombre) desde BENNETT MCCARL & ARNETTE BENNETTafuera &. Para la coincidencia de patrones rees de máxima prioridad: puede usar recómo desee.

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

Y llama sorter( !N! )


manifestación


** Vea cómo regexagarra palabras enLIVE DEMO

Tenga en cuenta que todas estas respuestas resuelven el problema suponiendo que sus datos están desinfectados, es decir, que tienen un espacio adecuado entre las palabras, pero qué pasa si sus datos son algo así, BENNETTMCCARL&ARNETTEBENNETTentonces todos estos fallarían. En ese caso, es posible que necesite usar el algoritmo Suffix Tree y, afortunadamente, python tiene alguna biblioteca como aquí .


regex al rescate, bien!
Hornbydd

2

Suponiendo que sus datos de origen son una FeatureClass / Table en una GeoDatabase de archivos, la siguiente consulta seleccionará las filas que necesita:

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

namees el campo, simplemente lo llamé name. La primera parte prueba el lado izquierdo, la segunda parte prueba el derecho. Esta consulta obviamente está codificada para buscar BENNETT, si necesita seleccionar por otros apellidos, con suerte, puede resolver qué necesita cambiar.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.