需要查找两次包含相同单词的字符串


10

我具有所有者名称的属性数据。我需要选择两次包含姓氏的数据。

例如,我的所有者名称可能为“ BENNETT MCCARL&ARNETTE BENNETT ”。

我想选择属性表中具有重复出现的姓氏的任何行,例如上面的示例。有谁知道我该如何选择这些数据?


您正在使用什么GIS?可以选择使用Python吗?
亚伦

3
这会引起一个Python问题,我认为您可以通过研究/询问Stack Overflow来找到Python代码。
PolyGeo

1
这是一两个姓氏的列表吗,一个叫Bennett McCarl,另一个叫Arnette Bennett?似乎一个人有一个Bennett的名字,另一个人有一个Bennett的名字?
亚伦

1
为此,我认为您需要计算字符串中的唯一单词,如果少于单词中的单词数量,则至少要重复一个单词。区分姓氏或可能是姓氏的单词将是一个单独的练习。我认为您应该在此处编辑您的问题,以使您的确切要求更加明确,并将其与Stack Overflow上的Python研究相结合。
PolyGeo

1
我已经在stackoverflow.com/questions/35165648/上修改了您的问题,因为它是在“ ArcGIS语言”而不是“ Python语言”中表达的。希望在等待我的编辑被批准时不会有太多的否决票。
PolyGeo

Answers:


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
很好地使用了这个collections模块,从来没有知道它的存在。我在同一行上思考,但是使用正则表达式提取重复的单词来创建标志字段。我认为您使用计数器功能的方法更容易理解。稍后我将检查该模块!
Hornbydd

6

怎么样使用re,并set在python-和设置标志(在这里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! )


演示


**看看如何regexLIVE DEMO

请注意,所有这些答案都解决了以下问题:假定您的数据已经过清理,即单词之间有适当的间距,但是如果您的数据是类似的东西,BENNETTMCCARL&ARNETTEBENNETT那么所有这些都会失败。在这种情况下,您可能需要使用后缀树算法,幸运的是python 在这里有一些库。


正则表达式可以解救,太好了!
Hornbydd

2

假设您的源数据是文件GeoDatabase中的FeatureClass /表,则以下查询将选择您需要的行:

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

name是领域,我刚好叫它name。第一部分测试左侧,第二部分测试右侧。该查询显然是硬编码的,以搜索BENNETT,如果您需要按其他姓氏进行选择,希望您可以找出需要更改的内容?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.