Perlu menemukan string yang berisi kata yang sama dua kali


10

Saya memiliki data atribut dengan nama pemilik. Saya perlu memilih data yang berisi nama belakang dua kali .

Misalnya, saya mungkin memiliki nama pemilik yang bertuliskan " BENNETT MCCARL & ARNETTE BENNETT ".

Saya ingin memilih baris dalam tabel atribut yang memiliki nama belakang yang berulang seperti contoh di atas. Adakah yang tahu bagaimana saya bisa memilih data itu?


SIG apa yang Anda gunakan? Apakah Python sebuah opsi?
Aaron

3
Ini menyaring pertanyaan Python yang saya pikir Anda akan menemukan kode Python untuk dengan meneliti / bertanya pada Stack Overflow .
PolyGeo

1
Apakah ini daftar nama belakang atau dua orang, satu bernama Bennett McCarl dan Arnette Bennett lainnya? Tampaknya satu orang memiliki nama depan Bennett dan lainnya memiliki nama belakang Bennett?
Aaron

1
Untuk melakukan ini saya pikir Anda perlu menghitung kata-kata unik dalam string Anda, dan jika kurang dari jumlah kata dalam string Anda maka setidaknya ada satu kata yang digandakan. Kata-kata yang membedakan yang atau mungkin nama keluarga dari kata lain akan menjadi latihan yang terpisah. Saya pikir Anda harus mengedit pertanyaan Anda di sini untuk membuat persyaratan tepat Anda lebih jelas, dan menggabungkannya dengan penelitian Python di Stack Overflow .
PolyGeo

1
Saya telah merevisi pertanyaan Anda di stackoverflow.com/questions/35165648/... karena itu diungkapkan dalam "ArcGIS-speak" daripada "Python-speak". Semoga tidak terlalu banyak downvotes sambil menunggu hasil edit saya untuk disetujui.
PolyGeo

Jawaban:


2

Ekspresi kalkulator bidang berdasarkan jawaban ini

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

Ini akan mengembalikan jumlah maksimum kata yang sama dalam string


8

Anda dapat menggunakan modul koleksi Python dan Kursor Pembaruan untuk mencapai hal ini. Metode ini menambahkan bidang baru dan mengisinya dengan 1jika ada duplikat, jika tidak, 0jika tidak ada duplikat.

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)

masukkan deskripsi gambar di sini


1
Penggunaan modul koleksi ini bagus, tidak pernah tahu itu ada. Saya berpikir pada baris yang sama tetapi menggunakan ekspresi reguler untuk mengekstrak kata berulang untuk membuat bidang bendera. Saya pikir pendekatan Anda menggunakan fungsi penghitung jauh lebih mudah dimengerti. Saya akan memeriksa modul itu nanti!
Hornbydd

6

Bagaimana dengan menggunakan redan setdan pengaturan bendera (di sini 0 dan 1) di python- reakan mengekstrak semua nama (terakhir dan pertama) dari BENNETT MCCARL & ARNETTE BENNETTtanpa &. Untuk pencocokan pola readalah prioritas tertinggi - Anda dapat menggunakan reapa yang Anda inginkan.

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

Dan telepon sorter( !N! )


demo


** Lihat bagaimana regexmeraih kata-kata diLIVE DEMO

Perhatikan bahwa semua jawaban ini menangani masalah dengan anggapan bahwa data Anda disanitasi yaitu memiliki ruang yang tepat di antara kata-kata tetapi bagaimana jika data Anda adalah sesuatu, BENNETTMCCARL&ARNETTEBENNETTmaka semua ini akan gagal. Dalam hal ini Anda mungkin perlu menggunakan algoritma Suffix Tree dan untungnya python memiliki beberapa perpustakaan seperti di sini .


regex untuk menyelamatkan, bagus!
Hornbydd

2

Dengan asumsi data sumber Anda adalah FeatureClass / Table dalam File GeoDatabase maka permintaan berikut akan memilih baris yang Anda butuhkan:

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

nameadalah lapangan, saya kebetulan menyebutnya name. Bagian pertama menguji sisi kiri, bagian kedua menguji sisi kanan. Query ini jelas sulit dikodekan untuk mencari BENNETT, jika Anda perlu memilih dengan nama keluarga lain semoga Anda dapat mengetahui apa yang perlu diubah?

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.