Precisa encontrar cadeias que contenham a mesma palavra duas vezes


10

Eu tenho dados de atributo com nomes de proprietários. Preciso selecionar dados que contenham o sobrenome duas vezes .

Por exemplo, posso ter um nome de proprietário que leia " BENNETT MCCARL & ARNETTE BENNETT ".

Gostaria de selecionar quaisquer linhas na tabela de atributos que tenham um sobrenome recorrente, como no exemplo acima. Alguém sabe como eu posso selecionar esses dados?


Qual GIS você está usando? Python é uma opção?
Aaron

3
Isso se distingue em uma pergunta em Python que eu acho que você encontrará no código Python pesquisando / perguntando no Stack Overflow .
PolyGeo

1
Esta é uma lista de sobrenomes ou duas pessoas, uma chamada Bennett McCarl e outra Arnette Bennett? Parece que uma pessoa tem um primeiro nome de Bennett e outra tem um sobrenome de Bennett?
Aaron

1
Para fazer isso, acho que você precisa contar as palavras únicas na sua string e, se for menor que o número de palavras na string, haverá pelo menos uma palavra duplicada. Distinguir palavras que são ou podem ser sobrenomes de outras palavras será um exercício separado. Acho que você deve editar sua pergunta aqui para tornar seus requisitos precisos mais claros e combiná-la com a pesquisa em Python no Stack Overflow .
PolyGeo

1
Revisei sua pergunta em stackoverflow.com/questions/35165648/… porque foi redigida em "ArcGIS-speak" em vez de "Python-speak". Felizmente, não haverá muitos votos negativos enquanto aguarda a aprovação da minha edição.
PolyGeo

Respostas:


2

Expressão da calculadora de campo com base nesta resposta

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

Ele retornará a contagem máxima de mesmas palavras na string


8

Você pode usar o módulo de coleções Python e um Cursor de Atualização para fazer isso. Esse método adiciona um novo campo e o preenche com a 1se houver duplicatas, caso contrário, 0se não houver duplicatas.

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)

insira a descrição da imagem aqui


1
Bom uso deste módulo de coleções, nunca soube que ele existia. Eu estava pensando nas mesmas linhas, mas usando expressões regulares para extrair palavras repetidas para criar um campo de bandeira. Eu acho que sua abordagem usando a função de contador é muito mais fácil de entender. Vou verificar esse módulo mais tarde!
Hornbydd

6

Que tal usar ree setdefinir uma flag (aqui 0 e 1) em python re- extrairá todos os nomes (último e primeiro) de BENNETT MCCARL & ARNETTE BENNETTfora &. Para a correspondência de padrões reé da mais alta prioridade, você pode usar recomo quiser.

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 ligar sorter( !N! )


demonstração


** Veja como regexagarra as palavras emLIVE DEMO

Observe que todas essas respostas tratam do problema, supondo que seus dados sejam higienizados, ou seja, tenham espaço adequado entre as palavras, mas e se seus dados forem algo parecido BENNETTMCCARL&ARNETTEBENNETT, tudo isso falhará. Nesse caso, você pode precisar usar o algoritmo Suffix Tree e, felizmente, o python possui alguma biblioteca como aqui .


regex para o resgate, bom!
Hornbydd

2

Supondo que os dados de origem sejam uma FeatureClass / Table em um arquivo GeoDatabase, a consulta a seguir selecionará as linhas necessárias:

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

nameé o campo, eu acabei de chamá-lo name. A primeira parte está testando o lado esquerdo e a segunda parte está testando o direito. Esta consulta é obviamente codificada para procurar BENNETT, se você precisar selecionar por outros sobrenomes, esperamos poder descobrir o que precisa ser alterado.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.