Нужно найти строки, содержащие одно и то же слово дважды


10

У меня есть данные атрибута с именами владельцев. Мне нужно выбрать данные, которые содержат фамилию дважды .

Например, у меня может быть имя владельца, которое гласит « BENNETT MCCARL & ARNETTE BENNETT ».

Я хотел бы выбрать любые строки в таблице атрибутов, которые имеют повторяющуюся фамилию, как в примере выше. Кто-нибудь знает, как я могу выбрать эти данные?


Какую ГИС вы используете? Является ли Python вариант?
Аарон

3
Это приводит к вопросу о Python, который, я думаю, вы найдете для кода Python, изучив / задав вопрос о переполнении стека .
PolyGeo

1
Это список фамилий или двух людей, одного по имени Беннетт Маккарл и другого Арнетт Беннетт? Похоже, у одного человека есть имя Беннетт, а у другого фамилия Беннетт?
Аарон

1
Для этого, я думаю, вам нужно подсчитать уникальные слова в вашей строке, и если оно меньше, чем количество слов в вашей строке, то дублируется хотя бы одно слово. Отличительные слова, которые являются или могут быть фамилиями от других слов, будут отдельным упражнением. Я думаю, что вы должны отредактировать свой вопрос здесь, чтобы прояснить ваши точные требования, и объединить его с исследованиями Python в Stack Overflow .
PolyGeo

1
Я пересмотрел ваш вопрос на stackoverflow.com/questions/35165648/…, потому что он был сформулирован как «говорящий на ArcGIS», а не «говорящий на Python». Надеюсь, он не получит слишком много отрицательных отзывов в ожидании моего редактирования, которое будет одобрено.
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

Как насчет использования 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 , и, к счастью, у python есть библиотека, как здесь .


регулярное выражение на помощь, приятно!
Хорнбидд

2

Предполагая, что ваши исходные данные - это FeatureClass / Table в файловой базе геоданных, тогда следующий запрос выберет нужные вам строки:

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

nameэто поле, я просто назвал его name. Первая часть тестирует левую часть, вторая часть тестирует правую. Этот запрос, очевидно, жестко запрограммирован для поиска BENNETT. Если вам нужно выбрать другие фамилии, надеюсь, вы сможете решить, что нужно изменить?

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.