จำเป็นต้องค้นหาสตริงที่มีคำเดียวกันสองครั้ง


10

ฉันมีข้อมูลคุณลักษณะที่มีชื่อเจ้าของ ฉันจำเป็นต้องเลือกข้อมูลที่มีนามสกุลเป็นครั้งที่สอง

ตัวอย่างเช่นฉันอาจมีชื่อเจ้าของที่อ่าน " BENNETT MCCARL & ARNETTE BENNETT "

ฉันต้องการเลือกแถวในตารางแอตทริบิวต์ที่มีนามสกุลซ้ำเช่นตัวอย่างด้านบน ไม่มีใครรู้ว่าฉันจะไปเกี่ยวกับการเลือกข้อมูลที่?


คุณใช้ GIS อะไรอยู่? Python เป็นตัวเลือกหรือไม่?
แอรอน

3
distils คำถามหลามนี้ที่ฉันคิดว่าคุณจะพบงูหลามรหัสโดยการวิจัย / ถามในกองมากเกิน
PolyGeo

1
นี่คือรายการของนามสกุลหรือสองคนหนึ่งชื่อ Bennett McCarl และ Arnette Bennett คนอื่น ๆ ? ดูเหมือนว่าคนคนหนึ่งมีชื่อเบ็นเน็ตต์และอีกคนมีนามสกุลเบ็นเน็ตต์?
แอรอน

1
ในการทำเช่นนี้ฉันคิดว่าคุณต้องนับคำที่ไม่ซ้ำกันในสตริงของคุณและถ้ามันน้อยกว่าจำนวนคำในสตริงของคุณมีอย่างน้อยหนึ่งคำที่ซ้ำกัน คำที่แตกต่างซึ่งเป็นหรืออาจเป็นนามสกุลจากคำอื่น ๆ จะเป็นการออกกำลังกายแยกต่างหาก ฉันคิดว่าคุณควรจะแก้ไขคำถามของคุณที่นี่ที่จะทำให้ความต้องการของคุณได้อย่างแม่นยำชัดเจนและรวมที่มีการวิจัยงูหลามที่กองมากเกิน
PolyGeo

1
ฉันได้แก้ไขคำถามของคุณที่stackoverflow.com/questions/35165648/…เนื่องจากมีการใช้ถ้อยคำใน "ArcGIS-speak" มากกว่า "Python-speak" หวังว่าจะไม่ได้รับ downvotes มากเกินไปขณะรอการแก้ไขของฉันเพื่อขออนุมัติ
PolyGeo

คำตอบ:


2

นิพจน์เครื่องคิดเลขฟิลด์ตามคำตอบนี้

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

มันจะส่งกลับจำนวนสูงสุดของคำเดียวกันในสตริง


8

คุณสามารถใช้โมดูลการรวบรวม Python และเคอร์เซอร์อัปเดตเพื่อทำสิ่งนี้ให้สำเร็จ วิธีการนี้จะเพิ่มเขตข้อมูลใหม่และเติมด้วย1ถ้ามีการทำซ้ำใด ๆ มิฉะนั้น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)

ป้อนคำอธิบายรูปภาพที่นี่


1
ใช้โมดูลนี้ได้เป็นอย่างดีไม่เคยรู้มาก่อน ฉันกำลังคิดในบรรทัดเดียวกัน แต่ใช้นิพจน์ทั่วไปเพื่อแยกคำที่ใช้ซ้ำเพื่อสร้างฟิลด์ตั้งค่าสถานะ ฉันคิดว่าวิธีการของคุณโดยใช้ฟังก์ชันตัวนับนั้นง่ายกว่าที่จะเข้าใจ ฉันจะตรวจสอบโมดูลนั้นในภายหลัง!
Hornbydd

6

สิ่งที่เกี่ยวกับการใช้reและsetและการตั้งธง (ที่นี่ 0 และ 1) ใน python- reจะดึงชื่อทั้งหมด (ที่ผ่านมาและเป็นครั้งแรก) จากโดยไม่ต้องBENNETT MCCARL & ARNETTE BENNETT &สำหรับการจับคู่รูปแบบreมีความสำคัญสูงสุด - คุณสามารถใช้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

และโทรมา sorter( !N! )


การสาธิต


** ดูว่าregexคว้าคำได้อย่างไรLIVE DEMO

โปรดทราบว่าคำตอบทั้งหมดเหล่านี้จะจัดการปัญหาที่สมมติว่าข้อมูลของคุณถูกทำให้สะอาดเช่นมีช่องว่างที่เหมาะสมระหว่างคำแต่ถ้าข้อมูลของคุณเป็นอะไรเช่นBENNETTMCCARL&ARNETTEBENNETTนั้นสิ่งเหล่านี้ทั้งหมดจะล้มเหลว ในกรณีนี้คุณอาจต้องใช้Suffix Tree algorithm และ python โชคดีที่มีไลบรารี่บางส่วนตามที่นี่


regex เพื่อช่วยเหลือดี!
Hornbydd

2

สมมติว่าข้อมูลต้นฉบับของคุณเป็น FeatureClass / Table ในไฟล์ GeoDatabase จากนั้นแบบสอบถามต่อไปนี้จะเลือกแถวที่คุณต้องการ:

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

namenameอยู่ในสนามผมเพิ่งเกิดขึ้นจะเรียกมันว่า ส่วนแรกคือการทดสอบทางด้านซ้ายส่วนที่สองคือการทดสอบด้านขวา เห็นได้ชัดว่าการสืบค้นนี้ยากมากสำหรับการค้นหา BENNETT หากคุณต้องการเลือกโดยใช้นามสกุลอื่นหวังว่าคุณจะสามารถหาสิ่งที่ต้องการเปลี่ยนแปลงได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.