Làm cách nào để bạn sử dụng giao lộ và liên kết trong bộ python?

Tập hợp là tập hợp các đối tượng không có thứ tự. Bởi vì nó không phải là một đối tượng chuỗi như danh sách và bộ dữ liệu, phần tử của nó không thể được lập chỉ mục

>>> s = set([1,2,3])
>>> s[1]
Traceback (most recent call last):
  File "", line 1, in 
TypeError: 'set' object does not support indexing

Bộ không thể có thành viên trùng lặp

>>> set(["I", "was", "a", "child", "and", "she", "was", "a", "child"])
set(['a', 'and', 'I', 'she', 'child', 'was'])

Chúng ta có thể tạo một tập hợp theo hai cách. đặt([]) hoặc {[]}

>>> s1 = set([1, 2.0, 'three', (4,5)])
>>> s2 = {1, 2.0, 'three', (4,5)}

>>> s1
set([(4, 5), 1, 2.0, 'three'])
>>> s2
set([(4, 5), 1, 2.0, 'three'])

Tuy nhiên, chúng tôi không thể có từ điển, danh sách và các bộ khác làm thành viên của một bộ

>>> set([ {'one':1} ])
Traceback (most recent call last):
  File "", line 1, in 
TypeError: unhashable type: 'dict'
>>> set([ [1,2,3] ])
Traceback (most recent call last):
  File "", line 1, in 
TypeError: unhashable type: 'list'
>>> set([ {1, 2, 3} ])
Traceback (most recent call last):
  File "", line 1, in 
TypeError: unhashable type: 'set'

Một ngoại lệ là bộ đóng băng và nó có thể là thành viên của một bộ vì nó không thay đổi, điều đó có nghĩa là nó có giá trị băm không bao giờ thay đổi trong suốt vòng đời của nó (vì vậy, nó có thể băm được)

>>> f = frozenset([1,2,3])
>>> s = {f}

Lưu ý rằng từ điển, danh sách và bộ không thể băm được. Do đó, không ai trong số họ không thể là thành viên của một tập hợp

>>> hash(1)
1
>>> hash('was')
-4873397472080222404
>>> hash((1,2))
3713081631934410656
>>> hash([1,2])
Traceback (most recent call last):
  File "", line 1, in 
TypeError: unhashable type: 'list'
>>> hash({'one':1})
Traceback (most recent call last):
  File "", line 1, in 
TypeError: unhashable type: 'dict'
>>> hash({1,2})
Traceback (most recent call last):
  File "", line 1, in 
TypeError: unhashable type: 'set'

Như chúng ta có thể thấy từ ví dụ trên, tất cả các loại khác đều có thể băm ngoại trừ từ điển, danh sách và bộ

Bạn có ý nghĩa gì khi có thể băm trong python?

có thể băm được - từ Thuật ngữ Python

Một đối tượng có thể băm nếu nó có giá trị băm không bao giờ thay đổi trong suốt vòng đời của nó (nó cần một phương thức __hash__()) và có thể được so sánh với các đối tượng khác (nó cần một phương thức __eq__() hoặc __cmp__()). Các đối tượng có thể băm so sánh bằng nhau phải có cùng giá trị băm

Khả năng băm làm cho một đối tượng có thể sử dụng được như một khóa từ điển và một thành viên được thiết lập, bởi vì các cấu trúc dữ liệu này sử dụng giá trị băm bên trong

Tất cả các đối tượng dựng sẵn bất biến của Python đều có thể băm được, trong khi không có bộ chứa có thể thay đổi nào (chẳng hạn như danh sách hoặc từ điển) là. Theo mặc định, các đối tượng là thể hiện của các lớp do người dùng định nghĩa có thể băm được;

Các phép toán cơ bản của tập hợp

Chúng ta có thể khởi tạo một tập hợp bằng cách sử dụng danh sách

>>> L = [1,2,3]
>>> s = set(L)
>>> s
set([1, 2, 3])

Chúng tôi tạo một tập hợp trống

>>> s1 = set()
>>> s1
set([])

Chúng tôi thêm một thành viên

________số 8

Chúng tôi có thể thêm một số thành viên cùng một lúc bằng cách sử dụng update()

>>> s1.update( ["3rd", "4th"] )
>>> s1
set(['4th', '2nd', '3rd', 'first'])

Ví dụ sau đây cho thấy cách lấy hợp và giao của các tập hợp. Hai hàm get*() lấy một tập hợp có các phần tử danh sách và lần lượt tính toán hợp và giao

>>> set(["I", "was", "a", "child", "and", "she", "was", "a", "child"])
set(['a', 'and', 'I', 'she', 'child', 'was'])
0

đầu ra

>>> set(["I", "was", "a", "child", "and", "she", "was", "a", "child"])
set(['a', 'and', 'I', 'she', 'child', 'was'])
1

Hệ số Jaccard - sự giống nhau giữa các Bộ

Hệ số Jaccard đo lường độ tương tự giữa các tập hợp mẫu hữu hạn và được định nghĩa là kích thước của giao điểm chia cho kích thước của liên kết của các tập hợp mẫu

$$J(A,B) = \frac{\left. A \cap B\right. }{\bên trái. A \cup B\right. }$$ $$0 \le J(A,B) \le 1 $$

Đoạn mã dưới đây tính toán hệ số Jaccard trong hàm jaccard(). Phải mất hai danh sách được lập chỉ mục bởi danh sách các bộ dữ liệu. Các chỉ số tuple là kết quả từ itertools. chức năng kết hợp ()

>>> set(["I", "was", "a", "child", "and", "she", "was", "a", "child"])
set(['a', 'and', 'I', 'she', 'child', 'was'])
2

đầu ra

>>> set(["I", "was", "a", "child", "and", "she", "was", "a", "child"])
set(['a', 'and', 'I', 'she', 'child', 'was'])
3

w-shingling - để kiểm tra đạo văn

"Giả sử tài liệu D của chúng ta là chuỗi "abcdabd" và chúng ta chọn k= 2. Khi đó tập 2 zona của D là {ab,bc,cd,da,bd}. Lưu ý rằng chuỗi con "ab" xuất hiện hai lần trong D, nhưng chỉ xuất hiện một lần dưới dạng zona. "
- A. Rajaraman và J. Ullman (2010). "Khai thác tập dữ liệu khổng lồ".

Đoạn mã sau sử dụng 3 tài liệu, tài liệu đầu tiên là bản gốc nhưng tài liệu thứ hai là đạo văn từ tài liệu đầu tiên. Cái thứ ba là một tài liệu không liên quan. Khi chúng ta nhìn vào kết quả (hệ số Jaccard), rõ ràng doc[0] và doc[1] là tương tự nhau

>>> set(["I", "was", "a", "child", "and", "she", "was", "a", "child"])
set(['a', 'and', 'I', 'she', 'child', 'was'])
4

Đây là mã

>>> set(["I", "was", "a", "child", "and", "she", "was", "a", "child"])
set(['a', 'and', 'I', 'she', 'child', 'was'])
5

đầu ra

>>> set(["I", "was", "a", "child", "and", "she", "was", "a", "child"])
set(['a', 'and', 'I', 'she', 'child', 'was'])
6

Chọn k phù hợp không dễ. Nếu chúng ta sử dụng k=5 thay vì k=9, chúng ta sẽ nhận được kết quả khác

>>> set(["I", "was", "a", "child", "and", "she", "was", "a", "child"])
set(['a', 'and', 'I', 'she', 'child', 'was'])
7

Nếu chúng tôi sử dụng mã thông báo dài hơn (k=20)

>>> set(["I", "was", "a", "child", "and", "she", "was", "a", "child"])
set(['a', 'and', 'I', 'she', 'child', 'was'])
8

Trong tất cả các trường hợp trên, chúng ta có thể thấy tài liệu cuối cùng không giống với hai tài liệu đầu tiên trong khi tài liệu thứ nhất và thứ hai dường như có một số điểm tương đồng

Ôn tập. w-shingling - để kiểm tra đạo văn

Phần này không khác nhiều so với phần trước. Sự khác biệt chính là cách xây dựng mã thông báo. chúng tôi sử dụng các từ thay vì các ký tự. Ví dụ: k-shingle có nghĩa là k từ chứ không phải k ký tự

Giao lộ và liên kết trong Python là gì?

Giao lộ. Các phần tử của hai tập hợp có điểm chung. Liên minh. Tất cả các phần tử từ cả hai bộ . Sự khác biệt. Các phần tử có mặt trên một tập hợp, nhưng không có trên tập hợp kia. Chênh lệch đối xứng. Các phần tử của cả hai tập hợp không có trên tập hợp kia.

Điều gì hỗ trợ các toán tử hợp và giao trong Python?

Trong Python, set là tập hợp các phần tử không trùng lặp (phần tử duy nhất). Nó có thể thực hiện các phép toán tập hợp như hợp, giao, hiệu, hiệu đối xứng, v.v.