Aynı kelimeyi iki kez içeren dizeleri bulmamız gerekiyor


10

Sahip adlarıyla öznitelik verilerim var. Ben gerek seçmek soyadı içeren veriler iki kez .

Örneğin, " BENNETT MCCARL & ARNETTE BENNETT " yazan bir sahip adım olabilir .

Yukarıdaki örnek gibi tekrarlayan bir soyadı olan öznitelik tablosundaki herhangi bir satırı seçmek istiyorum. Bu verileri nasıl seçebileceğimi bilen var mı?


Hangi CBS'yi kullanıyorsunuz? Python bir seçenek midir?
Aaron

3
Bu, araştırma / yığın taşması üzerinde sorarak için Python kodunu bulacaksınız düşünüyorum bir Python soru için distile .
PolyGeo

1
Bu soyadı veya biri Bennett McCarl ve diğeri Arnette Bennett adında iki kişinin listesi mi? Bir kişinin bir Bennett isminin, diğerinin bir Bennett soyadının olduğu anlaşılıyor mu?
Aaron

1
Bunu yapmak için dizenizdeki benzersiz kelimeleri saymanız gerektiğini düşünüyorum ve dizenizdeki sözcük sayısından daha azsa, çoğaltılan en az bir kelime var. Soyadı olan ya da soyadı olabilecek kelimeleri başka kelimelerden ayırmak ayrı bir alıştırma olacaktır. Kesin gereksinimlerinizi daha net hale getirmek için sorunuzu burada düzenlemeniz ve bunu Stack Overflow'daki Python araştırmalarıyla birleştirmeniz gerektiğini düşünüyorum .
PolyGeo

1
Sorunuzu stackoverflow.com/questions/35165648/… adresinde gözden geçirdim çünkü "Python-speak" yerine "ArcGIS-speak" ile ifade edildi. Umarım, düzenlememin onaylanmasını beklerken çok fazla downvotes almaz.
PolyGeo

Yanıtlar:


2

Bu cevaba dayalı alan hesaplayıcısı ifadesi

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

Dizede aynı kelimelerin maksimum sayısını döndürür


8

Bunu yapmak için Python koleksiyon modülünü ve bir Güncelleme İmleci kullanabilirsiniz. Bu yöntem yeni bir alan ekler ve 1herhangi bir yinelenen varsa bir a ile doldurur , aksi takdirde yinelenen yoksa bir 0.

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)

resim açıklamasını buraya girin


1
Bu koleksiyon modülünün güzel kullanımı, var olduğunu asla bilmiyordu. Aynı satırları düşünüyordum ama bir bayrak alanı oluşturmak için tekrar eden kelimeleri çıkarmak için düzenli ifadeler kullanıyordum. Bence sayaç fonksiyonunu kullanarak yaklaşımınızı anlamak çok daha kolay. Daha sonra bu modülü kontrol edeceğim!
Hornbydd

6

Python'da bir bayrağın (burada 0 ve 1) kullanılması reve setayarlanması ne reolursa olsun, tüm adları (son ve ilk) BENNETT MCCARL & ARNETTE BENNETTolmadan ayıklayacaktır &. Örüntü eşleştirme reen yüksek önceliğe sahip olduğundan, istediğiniz şekilde kullanabilirsiniz re.

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

Ve Çağrı yap sorter( !N! )


gösteri


** regexKelimelerin nasıl kapıldığını görünLIVE DEMO

Tüm bu cevapların, verilerinizin sanitize edildiğini, yani kelimeler arasında uygun alana sahip olduğunu varsayarak sorunla ilgilendiğini, ancak verileriniz böyle bir BENNETTMCCARL&ARNETTEBENNETTşeyse, tüm bunların başarısız olacağını unutmayın. Bu durumda Sonek Ağacı algoritmasını kullanmanız gerekebilir ve neyse ki python'un burada olduğu gibi bir kütüphanesi vardır .


kurtarmaya regex, güzel!
Hornbydd

2

Kaynak verilerinizin bir GeoDatabase Dosyasındaki FeatureClass / Table olduğunu varsayarsak, aşağıdaki sorgu istediğiniz satırları seçer:

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

namealan, ben sadece diyorum name. İlk kısım sol tarafı test ederken, ikinci kısmı sağ tarafı test etmektedir. Bu sohbeti açık bir şekilde BENNETT'i aramak için kodlanmış, eğer diğer soyadları tarafından seçmeniz gerekiyorsa umarım neyin değişmesi gerektiğini öğrenebilirsiniz?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.