10

Python の set 関数が実際に文字列を個々の文字に分離していることに気づきませんでした。Jaccard の Python 関数を作成し、Python Intersection メソッドを使用しました。このメソッドに 2 つのセットを渡し、2 つのセットを jaccard 関数に渡す前に、set リングで set 関数を使用します。

例:文字列を文字に分割するため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)そのため、ジャカード機能の交差点に送信すると、実際には単語間の交差点ではなく文字の交差点が見えます。単語間の交差を行うにはどうすればよいですか。

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

set文字列に対して関数を呼び出さないとNEW Fujifilm 16MP 5x Optical Zoom Point and Shoot CAMERA 2 7 screen.jpg、次のエラーが発生します。

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

文字から文字への交差の代わりに、単語から単語への交差を行い、ジャカードの類似性を取得したいと考えています。

4

4 に答える 4

10

最初に文字列を単語に分割してみてください。

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'])
于 2012-08-11T02:01:35.347 に答える
8

Jaccard距離を計算する私の関数:

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
于 2014-08-07T21:51:27.060 に答える
3

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

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

ここで行われているのは、文字列が反復可能なシーケンスとして扱われ、文字ごとに処理されているということです。

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

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

.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'])

または、split()、タプル、リスト、または代替の iterable を使用して、文字列が iterable として扱われないようにします。

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

文字列に基づいて単語ごとに要素を追加します。

>>> 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'])
于 2012-08-11T01:58:30.450 に答える