2012-08-11 18 views
6

実際に文字列を個々の文字に分割するPythonセット関数はわかりませんでした。私はJaccardのpython関数を書いてpythonの交差法を使いました。私は2つのセットをこのメソッドに渡し、2つのセットをjaccard関数に渡す前に、setringでset関数を使用します。Python:Jaccard文字の交差点を使用しているが文字の交差点を使わない距離

例:文字列があるとします。NEW Fujifilm 16MP 5x Optical Zoom Point and Shoot CAMERA 2 7 screen.jpg文字列に文字列を区切るset(NEW Fujifilm 16MP 5x Optical Zoom Point and Shoot CAMERA 2 7 screen.jpg)を呼び出します。だから私はjaccard関数の交差点に実際にそれを送信するときには、単語の交差点の代わりに文字の交差点を見てください。どのようにして単語間の交差を行うことができますか。

#implementing jaccard 
def jaccard(a, b): 
    c = a.intersection(b) 
    return float(len(c))/(len(a) + len(b) - len(c)) 

私は、文字列NEW Fujifilm 16MP 5x Optical Zoom Point and Shoot CAMERA 2 7 screen.jpgset関数を呼び出していない場合、私は次のエラーを取得:私は言葉の交差点に単語を行い、ジャカードを取得したい文字の交差点に

c = a.intersection(b) 
AttributeError: 'str' object has no attribute 'intersection' 

代わりの文字を類似性。

答えて

9

は、最初の言葉にあなたの文字列を分割してみてください。

word_set = set(your_string.split()) 

例:

>>> word_set = set("NEW Fujifilm 16MP 5x".split()) 
>>> character_set = set("NEW Fujifilm 16MP 5x") 
>>> word_set 
set(['NEW', '16MP', '5x', 'Fujifilm']) 
>>> character_set 
set([' ', 'f', 'E', 'F', 'i', 'M', 'j', 'm', 'l', 'N', '1', 'P', 'u', 'x', 'W', '6', '5']) 
+0

実際には、これは完全な一致を探している交差点の間に追加機能を使用したときに私が探していたものです。 –

2

このプロパティは、セットに固有のものではありません。

>>> list('NEW Fujifilm') 
['N', 'E', 'W', ' ', 'F', 'u', 'j', 'i', 'f', 'i', 'l', 'm'] 

ここで何が起こっているかの文字列が反復可能シーケンスとして扱われていると文字ずつ処理されているということです。

同じことあなたはセットで見ている:

>>> set('string') 
set(['g', 'i', 'n', 's', 'r', 't']) 

はinterableを使用していない)(.addいるため、既存のセットに().add使用し、修正するには:

>>> se=set() 
>>> se.add('NEW Fujifilm 16MP 5x Optical Zoom Point and Shoot CAMERA 2 7 screen.jpg') 
>>> se 
set(['NEW Fujifilm 16MP 5x Optical Zoom Point and Shoot CAMERA 2 7 screen.jpg']) 

>>> set('something'.split()) 
set(['something']) 
>>> set(('something',)) 
set(['something']) 
>>> set(['something']) 
set(['something']) 

より要素を追加:文字列を反復可能として扱われないように、または、スプリット()、タプル、リスト、またはいくつかの代替的な反復可能を使用ワード単位で、あなたの文字列に基づいて、S:

>>> se=set(('Something',)) | set('NEW Fujifilm 16MP 5x Optical Zoom Point and Shoot CAMERA 2 7 screen.jpg'.split()) 

それとも、あなたがセットに追加するとあなたには、いくつかのロジックの理解が必要な場合:

>>> se={w for w in 'NEW Fujifilm 16MP 5x Optical Zoom Point and Shoot CAMERA 2 7 screen.jpg'.split() 
     if len(w)>3} 
>>> se 
set(['Shoot', 'CAMERA', 'Point', 'screen.jpg', 'Zoom', 'Fujifilm', '16MP', 'Optical']) 

そして、それがどのように動作今期待:

>>> 'Zoom' in se 
True 
>>> s1=set('NEW Fujifilm 16MP 5x Optical Zoom Point and Shoot CAMERA 2 7 screen.jpg'.split()) 
>>> s2=set('Fujifilm Optical Zoom CAMERA NONE'.split()) 
>>> s1.intersection(s2) 
set(['Optical', 'CAMERA', 'Zoom', 'Fujifilm']) 
+1

"ワード交差点ワード" から私はOPが 'set(a.split())。intersection(b.split())'(モジュロケースと句読点の詳細)の後にあると思います。) – DSM

+0

@drewk例と大きな説明に感謝します。ブリリアント!!! –

6

My機能ジャカード距離を計算する:

def DistJaccard(str1, str2): 
    str1 = set(str1.split()) 
    str2 = set(str2.split()) 
    return float(len(str1 & str2))/len(str1 | str2) 

>>> DistJaccard("hola amigo", "chao amigo") 
0.333333333333 
2

これは、設定された機能に基づいて、私が書いたものです -

def jaccard(a,b): 
    a=a.split() 
    b=a.split() 
    union = list(set(a+b)) 
    intersection = list(set(a) - (set(a)-set(b))) 
    print "Union - %s" % union 
    print "Intersection - %s" % intersection 
    jaccard_coeff = float(len(intersection))/len(union) 
    print "Jaccard Coefficient is = %f " % jaccard_coeff