같은 단어가 두 번 포함 된 문자열을 찾아야합니다.


10

소유자 이름이있는 속성 데이터가 있습니다. 성 이 포함 된 데이터를 두 번 선택 해야합니다 .

예를 들어, " BENNETT MCCARL & ARNETTE BENNETT " 라고하는 소유자 이름이있을 수 있습니다 .

위의 예와 같이 성이 반복되는 속성 테이블에서 행을 선택하고 싶습니다. 누구든지 해당 데이터를 선택하는 방법을 알고 있습니까?


어떤 GIS를 사용하고 있습니까? 파이썬은 옵션입니까?
Aaron

3
이것은 파이썬 질문에 대한 것 입니다. 스택 오버플 로를 연구 / 요청하여 파이썬 코드를 찾을 것이라고 생각합니다 .
PolyGeo

1
이 이름은 Bennett McCarl과 다른 Arnette Bennett이라는 성 또는 두 사람의 목록입니까? 한 사람은 Bennett 이름을 가지고 있고 다른 사람은 Bennett 성을 가지고 있습니까?
Aaron

1
이렇게하려면 문자열의 고유 단어를 계산해야하며 문자열의 단어 수보다 적 으면 적어도 하나의 단어가 복제됩니다. 다른 단어와 성이 있거나 다른 단어를 구별하는 것은 별도의 연습이 될 것입니다. 정확한 요구 사항을보다 명확하게하기 위해 여기에서 질문을 편집 하고 Stack Overflow의 Python 연구와 결합 해야한다고 생각합니다 .
PolyGeo

1
stackoverflow.com/questions/35165648/… 에서 귀하의 질문을 수정 했습니다. "Python-speak"가 아닌 "ArcGIS-speak"로 표시되어 있기 때문입니다. 내 편집이 승인되기를 기다리는 동안 다운 보트가 너무 많지 않기를 바랍니다.
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
이 콜렉션 모듈을 잘 사용했지만 존재하지 않았다. 나는 같은 줄에서 생각했지만 정규 표현식을 사용하여 반복 단어를 추출하여 플래그 필드를 만듭니다. 카운터 기능을 사용하는 접근 방식이 훨씬 이해하기 쉽다고 생각합니다. 나중에 해당 모듈을 확인하겠습니다!
혼 비드

6

파이썬에서 플래그 (여기서 0과 1)를 사용 re하고 set설정하는 것은- 없이 re모든 이름 (마지막과 첫 번째)을 추출합니다 . 패턴 일치 가 우선 순위가 높은 경우 원하는 방식으로 사용할 수 있습니다 .BENNETT MCCARL & ARNETTE BENNETT&rere

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 알고리즘 을 사용해야 할 수도 있고 다행히 파이썬에는 여기에 몇 가지 라이브러리가 있습니다 .


구조에 정규식, 좋은!
Hornbydd

2

소스 데이터가 파일 GeoDatabase의 FeatureClass / Table이라고 가정하면 다음 쿼리는 필요한 행을 선택합니다.

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

name필드 name입니다. 방금 전화했습니다 . 첫 번째 부분은 왼쪽을 테스트하고 두 번째 부분은 오른쪽을 테스트합니다. 이 쿼리는 분명히 다른 성으로 선택 해야하는 경우 변경해야 할 사항을 해결할 수 있기를 원한다면 BENNETT를 검색하도록 하드 코딩되어 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.