ऐसे तार खोजने की जरूरत है जिनमें एक ही शब्द दो बार हो


10

मेरे पास स्वामी नामों के साथ विशेषता डेटा है। मुझे ऐसे डेटा का चयन करना होगा जिसमें अंतिम नाम दो बार हो

उदाहरण के लिए, मेरे पास एक मालिक का नाम हो सकता है जो " बेनेट एमटीएआरएल और ARNETTE बेनेट " पढ़ता है ।

मैं विशेषता तालिका में किसी भी पंक्तियों का चयन करना चाहूंगा जिनके पास एक अंतिम अंतिम नाम होगा जैसे ऊपर उदाहरण। क्या किसी को पता है कि मैं उस डेटा को चुनने के बारे में कैसे जा सकता हूं?


आप किस जीआईएस का उपयोग कर रहे हैं? क्या पायथन एक विकल्प है?
आरोन

3
यह पायथन के लिए एक प्रश्न है जो मुझे लगता है कि आप स्टैक ओवरफ्लो पर शोध / पूछकर पायथन कोड पाएंगे ।
PolyGeo

1
क्या यह अंतिम नामों या दो लोगों की सूची है, एक का नाम बेनेट मैककार्ल और दूसरा अर्नेट बेनेट है? ऐसा प्रतीत होता है कि एक व्यक्ति का बेनेट पहला नाम है और दूसरे का बेनेट अंतिम नाम है?
हारून

1
ऐसा करने के लिए मुझे लगता है कि आपको अपने स्ट्रिंग में अद्वितीय शब्दों को गिनने की आवश्यकता है, और यदि यह आपके स्ट्रिंग में शब्दों की संख्या से कम है, तो कम से कम एक शब्द डुप्लिकेट है। अन्य शब्दों से जो शब्द हैं या जो उपनाम हो सकते हैं, उन्हें अलग करना एक अलग अभ्यास होगा। मुझे लगता है कि आपको अपनी आवश्यकताओं को स्पष्ट करने के लिए अपने प्रश्न को यहां संपादित करना चाहिए , और स्टैक ओवरफ्लो में पायथन अनुसंधान के साथ गठबंधन करना चाहिए ।
PolyGeo

1
मैंने आपके प्रश्न को stackoverflow.com/questions/35165648/… पर संशोधित किया है, क्योंकि यह "पायथन-स्पीक" के बजाय "आर्किस-स्पीक" में प्रदर्शित किया गया था। उम्मीद है, मेरे संपादन के स्वीकृत होने की प्रतीक्षा करते हुए इसे बहुत अधिक डाउनवोट नहीं मिलेगा।
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

इसे पूरा करने के लिए आप पायथन संग्रह मॉड्यूल और एक अपडेट कर्सर का उपयोग कर सकते हैं । यह विधि एक नया क्षेत्र जोड़ती है और 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
इस संग्रह मॉड्यूल का अच्छा उपयोग, कभी नहीं पता था कि यह अस्तित्व में है। मैं उसी तर्ज पर सोच रहा था लेकिन नियमित रूप से अभिव्यक्ति का उपयोग करके एक ध्वज क्षेत्र बनाने के लिए दोहराए जाने वाले शब्दों को निकालने के लिए। मुझे लगता है कि काउंटर फ़ंक्शन का उपयोग करके आपका दृष्टिकोण समझना बहुत आसान है। मैं बाद में उस मॉड्यूल की जाँच करूंगा!
8

6

क्या उपयोग करने के बारे reऔर setpython- में और स्थापना के एक झंडे (यहाँ 0 और 1) 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तो ये सभी विफल हो जाएंगे। उस स्थिति में आपको प्रत्यय ट्री एल्गोरिथ्म का उपयोग करने की आवश्यकता हो सकती है और सौभाग्य से अजगर के पास कुछ पुस्तकालय हैं


बचाव के लिए रेक्स, अच्छा!
हॉर्नबीड

2

अपने स्रोत डेटा को मान लें कि किसी फ़ाइल GeoDatabase में एक FeatureClass / Table है तो निम्न क्वेरी आपके लिए आवश्यक पंक्तियों का चयन करेगी:

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

nameक्षेत्र है, मैं सिर्फ यह फोन करने के लिए हुआ name। पहला भाग बाएं हाथ का परीक्षण कर रहा है, दूसरा भाग दाईं ओर परीक्षण कर रहा है। यह प्रश्न स्पष्ट रूप से बेनेट के लिए खोज करने के लिए कठिन कोडित है, यदि आपको अन्य उपनामों का चयन करने की आवश्यकता है, तो उम्मीद है कि आप अपनी आवश्यकताओं को बदल सकते हैं?

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.