同じ単語を2回含む文字列を検索する必要がある


10

所有者名の属性データがあります。姓を2回含むデータを選択する必要があります

たとえば、「BENNETT MCCARL&ARNETTE BENNETT」という所有者名があるとします。

上記の例のように、姓が繰り返し出現する属性テーブルの行を選択します。そのデータを選択する方法を誰かが知っていますか?


どのGISを使用していますか?Pythonはオプションですか?
アーロン

3
これは、Stack Overflowで調査/質問することでPythonコードを見つけることができると思うPythonの問題にまで及びます。
PolyGeo

1
これは姓のリストですか、それともベネットマッカールと別のアーネットベネットという名前の2人ですか。ある人はベネットの名を持ち、別の人はベネットの姓を持っているように見えますか?
アーロン

1
これを行うには、文字列内の一意の単語を数える必要があると思います。文字列内の単語数より少ない場合は、少なくとも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
このコレクションモジュールの素晴らしい使い方、それが存在することを知らなかった。同じ行を考えていましたが、正規表現を使用して繰り返し単語を抽出し、フラグフィールドを作成しました。カウンター機能の方がわかりやすいと思います。そのモジュールは後でチェックします!
Hornbydd 2016

6

python-でのフラグの使用reset設定(ここでは0と1)についてはどうですか?without 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このようなものである場合、これらすべてが失敗します。その場合、サフィックスツリーアルゴリズムを使用する必要があるかもしれません。幸いにも、Pythonはここにあるようなライブラリを持っています


救済への正規表現、いいね!
Hornbydd 2016

2

ソースデータがファイルジオデータベースのFeatureClass /テーブルであるとすると、次のクエリは必要な行を選択します。

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

nameフィールドnameです。たまたま呼び出しただけです。最初の部分は左側をテストし、2番目の部分は右側をテストしています。このクエリは明らかにBENNETTを検索するようにハードコードされています。他の姓で選択する必要がある場合は、変更が必要なものを見つけることができますか?

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.