Sie müssen Zeichenfolgen finden, die zweimal dasselbe Wort enthalten

10

Ich habe Attributdaten mit Eigentümernamen. Ich muss zweimal Daten auswählen , die den Nachnamen enthalten .

Zum Beispiel kann ich einen Eigentümernamen haben, der " BENNETT MCCARL & ARNETTE BENNETT " lautet .

Ich möchte alle Zeilen in der Attributtabelle auswählen, die einen wiederkehrenden Nachnamen haben, wie im obigen Beispiel. Weiß jemand, wie ich diese Daten auswählen kann?

Kristen
quelle
Welches GIS verwenden Sie? Ist Python eine Option?
Aaron
3
Dies führt zu einer Python-Frage, für die Sie den Python-Code finden, indem Sie über Stack Overflow recherchieren / fragen .
PolyGeo
1
Ist dies eine Liste von Nachnamen oder zwei Personen, einer namens Bennett McCarl und einer anderen Arnette Bennett? Es scheint, dass eine Person einen Bennett-Vornamen und eine andere einen Bennett-Nachnamen hat?
Aaron
1
Um dies zu tun, müssen Sie die eindeutigen Wörter in Ihrer Zeichenfolge zählen. Wenn die Anzahl der Wörter in Ihrer Zeichenfolge geringer ist, wird mindestens ein Wort dupliziert. Das Unterscheiden von Wörtern, die Nachnamen sind oder sein können, von anderen Wörtern ist eine separate Übung. Ich denke, Sie sollten Ihre Frage hier bearbeiten , um Ihre genauen Anforderungen klarer zu machen, und dies mit der Python-Forschung bei Stack Overflow kombinieren .
PolyGeo
1
Ich habe Ihre Frage unter stackoverflow.com/questions/35165648/… überarbeitet, da sie eher in "ArcGIS-Sprache" als in "Python-Sprache" formuliert wurde. Hoffentlich wird es nicht zu viele Abstimmungen geben, bis meine Bearbeitung genehmigt wird.
PolyGeo

Antworten:

2

Feldrechnerausdruck basierend auf dieser Antwort

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

Es wird die maximale Anzahl derselben Wörter in der Zeichenfolge zurückgegeben

FelixIP
quelle
8

Sie können dazu das Python- Sammlungsmodul und einen Update-Cursor verwenden. Diese Methode fügt ein neues Feld hinzu und füllt es mit einem, 1wenn Duplikate vorhanden sind, andernfalls einem, 0wenn keine Duplikate vorhanden sind.

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)

Geben Sie hier die Bildbeschreibung ein

Aaron
quelle
1
Gute Verwendung dieses Sammlungsmoduls, wusste nie, dass es existiert. Ich habe in den gleichen Zeilen gedacht, aber reguläre Ausdrücke verwendet, um sich wiederholende Wörter zu extrahieren und ein Flag-Feld zu erstellen. Ich denke, Ihr Ansatz mit der Zählerfunktion ist viel einfacher zu verstehen. Ich werde dieses Modul später auschecken!
Hornbydd
6

Was über die Verwendung reund setund Setzen eines Flags (hier 0 und 1) in python realle Namen extrahieren (letzte und erste) von BENNETT MCCARL & ARNETTE BENNETTohne &. Der Mustervergleich rehat höchste Priorität - Sie können verwenden, rewie Sie möchten.

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

Und Ruf an sorter( !N! )


Demo


** Sehen Sie, wie regexWörter auf greiftLIVE DEMO

Beachten Sie, dass alle diese Antworten das Problem lösen, vorausgesetzt, Ihre Daten werden bereinigt, dh zwischen den Wörtern befindet sich ein angemessener Abstand. Was wäre, wenn Ihre Daten so etwas wie BENNETTMCCARL&ARNETTEBENNETTdiese sind, würden alle diese fehlschlagen. In diesem Fall müssen Sie möglicherweise den Suffix Tree- Algorithmus verwenden, und zum Glück verfügt Python über eine Bibliothek wie hier .

Islam
quelle
Regex zur Rettung, schön!
Hornbydd
2

Angenommen, Ihre Quelldaten sind eine FeatureClass / Tabelle in einer Datei-GeoDatabase, dann wählt die folgende Abfrage die gewünschten Zeilen aus:

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

nameist das Feld, ich habe es gerade genannt name. Der erste Teil testet die linke Seite, der zweite Teil testet die rechte. Diese Abfrage ist offensichtlich schwer codiert, um nach BENNETT zu suchen. Wenn Sie andere Nachnamen auswählen müssen, können Sie hoffentlich herausfinden, was geändert werden muss.

Hornbydd
quelle