Musisz znaleźć ciągi zawierające dwa razy to samo słowo


10

Mam dane atrybutów z nazwami właścicieli. Muszę dwa razy wybrać dane zawierające nazwisko .

Na przykład mogę mieć nazwę właściciela o treści „ BENNETT MCCARL & ARNETTE BENNETT ”.

Chciałbym wybrać dowolne wiersze w tabeli atrybutów, które mają powtarzające się nazwisko, takie jak powyższy przykład. Czy ktoś wie, jak mogę wybrać te dane?


Z jakiego systemu GIS korzystasz? Czy Python jest opcją?
Aaron

3
Sprowadza się to do pytania w języku Python, które, jak sądzę, znajdziesz kod Python, badając / zadając pytania na temat przepełnienia stosu .
PolyGeo

1
Czy to lista nazwisk czy dwojga ludzi, jednego o nazwisku Bennett McCarl i drugiego Arnette Bennett? Wygląda na to, że jedna osoba ma imię Bennett, a druga ma nazwisko Bennett?
Aaron

1
Aby to zrobić, myślę, że musisz policzyć unikalne słowa w ciągu, a jeśli jest ono mniejsze niż liczba słów w ciągu, to co najmniej jedno słowo jest powielone. Odróżnianie słów, które są lub mogą być nazwiskami od innych słów, będzie odrębnym ćwiczeniem. Myślę, że powinieneś edytować swoje pytanie tutaj, aby wyjaśnić swoje precyzyjne wymagania i połączyć je z badaniami Pythona w Stack Overflow .
PolyGeo

1
Poprawiłem twoje pytanie na stackoverflow.com/questions/35165648/..., ponieważ zostało sformułowane w „ArcGIS-speak” zamiast w „Python-speak”. Mam nadzieję, że nie otrzyma zbyt wielu głosów negatywnych podczas oczekiwania na zatwierdzenie mojej edycji.
PolyGeo

Odpowiedzi:


2

Wyrażenie kalkulatora pola oparte na tej odpowiedzi

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

Zwróci maksymalną liczbę takich samych słów w ciągu


8

Aby to zrobić, możesz użyć modułu kolekcji Python i kursora aktualizacji. Ta metoda dodaje nowe pole i wypełnia je 1jeśli są jakieś duplikaty, w przeciwnym razie a, 0jeśli nie ma duplikatów.

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)

wprowadź opis zdjęcia tutaj


1
Ładne wykorzystanie tego modułu kolekcji, nigdy nie wiedziałem, że istnieje. Myślałem o tych samych liniach, ale używałem wyrażeń regularnych do wydobywania powtarzających się słów w celu utworzenia pola flagi. Myślę, że twoje podejście do korzystania z funkcji licznika jest znacznie łatwiejsze do zrozumienia. Sprawdzę ten moduł później!
Hornbydd

6

Co z użyciem rei setustawieniem flagi (tutaj 0 i 1) w pythonie - rewyodrębni wszystkie nazwy (ostatnie i pierwsze) z BENNETT MCCARL & ARNETTE BENNETTzewnątrz &. Dopasowanie wzorca rema najwyższy priorytet - możesz używać, rejak chcesz.

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

I zadzwoń sorter( !N! )


próbny


** Zobacz, jak regexchwyta słowa naLIVE DEMO

Zauważ, że wszystkie te odpowiedzi dotyczą problemu, zakładając, że twoje dane są zdezynfekowane, tj. Mają odpowiednią przestrzeń między słowami, ale co jeśli twoje dane są podobne, BENNETTMCCARL&ARNETTEBENNETTto wszystko by się nie udało. W takim przypadku może być konieczne użycie algorytmu drzewa sufiksów i na szczęście Python ma trochę biblioteki, jak tutaj .


regex na ratunek, miło!
Hornbydd,

2

Zakładając, że dane źródłowe to FeatureClass / Table w pliku GeoDatabase, poniższe zapytanie wybierze wymagane wiersze:

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

nameto pole, które właśnie to nazwałam name. Pierwsza część testuje lewą stronę, druga część testuje prawą. To zapytanie jest oczywiście zakodowane na sztywno w poszukiwaniu BENNETT. Jeśli musisz wybrać inne nazwiska, mam nadzieję, że uda Ci się ustalić, co należy zmienić?

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.