Trích xuất Python

Mô-đun

>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
3 có thể được sử dụng để trích xuất các tính năng ở định dạng được thuật toán máy học hỗ trợ từ các bộ dữ liệu bao gồm các định dạng như văn bản và hình ảnh

Ghi chú

Trích xuất tính năng rất khác với Lựa chọn tính năng . cái trước bao gồm chuyển đổi dữ liệu tùy ý, chẳng hạn như văn bản hoặc hình ảnh, thành các tính năng số có thể sử dụng cho máy học. Cái sau là một kỹ thuật học máy được áp dụng trên các tính năng này.

6. 2. 1. Đang tải các tính năng từ dicts¶

Lớp

>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
4 có thể được sử dụng để chuyển đổi các mảng đặc trưng được biểu diễn dưới dạng danh sách các đối tượng Python
>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
5 tiêu chuẩn thành biểu diễn NumPy/SciPy được sử dụng bởi các công cụ ước tính scikit-learning

Mặc dù xử lý không đặc biệt nhanh, nhưng

>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
5 của Python có ưu điểm là sử dụng thuận tiện, thưa thớt [không cần lưu trữ các tính năng vắng mặt] và lưu trữ tên tính năng ngoài các giá trị

>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
4 thực hiện cái được gọi là mã hóa one-of-K hoặc “one-hot” cho các tính năng phân loại [còn gọi là danh nghĩa, rời rạc]. Các tính năng phân loại là các cặp "thuộc tính-giá trị" trong đó giá trị được giới hạn trong danh sách các khả năng riêng biệt mà không cần sắp xếp [e. g. định danh chủ đề, loại đối tượng, thẻ, tên…]

Trong phần sau, “thành phố” là thuộc tính phân loại trong khi “nhiệt độ” là thuộc tính số truyền thống

>>> measurements = [
..     {'city': 'Dubai', 'temperature': 33.},
..     {'city': 'London', 'temperature': 12.},
..     {'city': 'San Francisco', 'temperature': 18.},
.. ]

>>> from sklearn.feature_extraction import DictVectorizer
>>> vec = DictVectorizer[]

>>> vec.fit_transform[measurements].toarray[]
array[[[ 1.,  0.,  0., 33.],
       [ 0.,  1.,  0., 12.],
       [ 0.,  0.,  1., 18.]]]

>>> vec.get_feature_names_out[]
array[['city=Dubai', 'city=London', 'city=San Francisco', 'temperature'], ...]

>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
4 chấp nhận nhiều giá trị chuỗi cho một tính năng, như, e. g. , nhiều danh mục cho một bộ phim

Giả sử cơ sở dữ liệu phân loại từng phim bằng một số danh mục [không bắt buộc] và năm phát hành

>>> movie_entry = [{'category': ['thriller', 'drama'], 'year': 2003},
..                {'category': ['animation', 'family'], 'year': 2011},
..                {'year': 1974}]
>>> vec.fit_transform[movie_entry].toarray[]
array[[[0.000e+00, 1.000e+00, 0.000e+00, 1.000e+00, 2.003e+03],
       [1.000e+00, 0.000e+00, 1.000e+00, 0.000e+00, 2.011e+03],
       [0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 1.974e+03]]]
>>> vec.get_feature_names_out[]
array[['category=animation', 'category=drama', 'category=family',
       'category=thriller', 'year'], ...]
>>> vec.transform[{'category': ['thriller'],
..                'unseen_feature': '3'}].toarray[]
array[[[0., 0., 0., 1., 0.]]]

>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
4 cũng là một phép biến đổi biểu diễn hữu ích để đào tạo các trình phân loại trình tự trong các mô hình Xử lý ngôn ngữ tự nhiên thường hoạt động bằng cách trích xuất các cửa sổ đặc trưng xung quanh một từ quan tâm cụ thể

Ví dụ: giả sử rằng chúng tôi có thuật toán đầu tiên trích xuất các thẻ Một phần của Lời nói [PoS] mà chúng tôi muốn sử dụng làm thẻ bổ sung để đào tạo bộ phân loại trình tự [e. g. một chunker]. Lệnh sau đây có thể là một cửa sổ gồm các đặc điểm được trích xuất xung quanh từ 'ngồi' trong câu 'Con mèo ngồi trên chiếu. ’

>>> pos_window = [
..     {
..         'word-2': 'the',
..         'pos-2': 'DT',
..         'word-1': 'cat',
..         'pos-1': 'NN',
..         'word+1': 'on',
..         'pos+1': 'PP',
..     },
..     # in a real application one would extract many such dictionaries
.. ]

Mô tả này có thể được véc-tơ hóa thành ma trận hai chiều thưa thớt phù hợp để đưa vào bộ phân loại [có thể sau khi được dẫn vào

>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
00 để chuẩn hóa]

>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]

Như bạn có thể tưởng tượng, nếu một người trích xuất một ngữ cảnh như vậy xung quanh từng từ riêng lẻ của một kho văn bản, ma trận kết quả sẽ rất rộng [nhiều tính năng một chiều] với hầu hết chúng được đặt giá trị bằng 0 trong hầu hết thời gian. Để làm cho cấu trúc dữ liệu kết quả có thể vừa với bộ nhớ, lớp

>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
4 sử dụng ma trận
>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
02 theo mặc định thay vì
>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
03

6. 2. 2. Tính năng băm¶

Lớp

>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
04 là một trình tạo véc tơ bộ nhớ thấp, tốc độ cao, sử dụng một kỹ thuật được gọi là băm tính năng hoặc "thủ thuật băm". Thay vì xây dựng bảng băm của các tính năng gặp phải trong quá trình đào tạo, như cách làm của bộ tạo véc tơ, các phiên bản của
>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
04 áp dụng hàm băm cho các tính năng để xác định trực tiếp chỉ số cột của chúng trong ma trận mẫu. Kết quả là tăng tốc độ và giảm mức sử dụng bộ nhớ, làm giảm khả năng kiểm tra;

Vì hàm băm có thể gây ra xung đột giữa các tính năng [không liên quan], nên hàm băm có dấu được sử dụng và dấu của giá trị băm xác định dấu của giá trị được lưu trữ trong ma trận đầu ra cho một tính năng. Bằng cách này, các xung đột có khả năng bị hủy bỏ thay vì tích lũy lỗi và giá trị trung bình dự kiến ​​của bất kỳ giá trị tính năng đầu ra nào đều bằng không. Cơ chế này được bật theo mặc định với

>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
07 và đặc biệt hữu ích cho các kích thước bảng băm nhỏ [
>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
08]. Đối với các kích thước bảng băm lớn, nó có thể bị vô hiệu hóa, để cho phép đầu ra được chuyển đến các bộ ước tính như bộ chọn tính năng
>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
09 hoặc
>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
10 mong đợi đầu vào không âm

>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
04 chấp nhận một trong hai ánh xạ [như
>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
5 của Python và các biến thể của nó trong mô-đun
>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
13], cặp
>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
14 hoặc chuỗi, tùy thuộc vào tham số hàm tạo
>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
15. Ánh xạ được coi là danh sách của các cặp
>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
14, trong khi các chuỗi đơn có giá trị ngầm định là 1, do đó,
>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
17 được hiểu là
>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
18. Nếu một tính năng đơn lẻ xuất hiện nhiều lần trong một mẫu, thì các giá trị liên quan sẽ được tính tổng [do đó,
>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
19 và
>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
10 trở thành
>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
11]. Đầu ra từ
>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
04 luôn là ma trận
>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
02 ở định dạng CSR

Tính năng băm có thể được sử dụng trong phân loại tài liệu, nhưng không giống như

>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
14,
>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
04 không thực hiện tách từ hoặc bất kỳ quá trình tiền xử lý nào khác ngoại trừ mã hóa Unicode-to-UTF-8; .
Vectorizing a large text corpus with the hashing trick, below, for a combined tokenizer/hasher.

Ví dụ, hãy xem xét tác vụ xử lý ngôn ngữ tự nhiên ở cấp độ từ cần các tính năng được trích xuất từ ​​​​các cặp

>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
16. Người ta có thể sử dụng hàm tạo Python để trích xuất các tính năng

>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
0

Sau đó,

>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
17 được cung cấp cho
>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
18 có thể được xây dựng bằng cách sử dụng

>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
1

và được đưa vào máy băm với

>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
1

để có được một ma trận

>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
02
>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
40

Lưu ý việc sử dụng mức độ hiểu của trình tạo, điều này đưa sự lười biếng vào quá trình trích xuất tính năng. mã thông báo chỉ được xử lý theo yêu cầu từ trình băm

6. 2. 2. 1. Chi tiết triển khai¶

>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
04 sử dụng biến thể 32-bit đã ký của MurmurHash3. Kết quả là [và do các giới hạn trong
>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
02], số lượng tính năng tối đa được hỗ trợ hiện tại là \[2^{31} - 1\] .

Công thức ban đầu của thủ thuật băm của Weinberger et al. đã sử dụng hai hàm băm riêng biệt \[h\]\[\xi\] to determine the column index and sign of a feature, respectively. The present implementation works under the assumption that the sign bit of MurmurHash3 is independent of its other bits.

Vì một modulo đơn giản được sử dụng để chuyển đổi hàm băm thành chỉ mục cột, nên sử dụng lũy ​​thừa hai làm tham số

>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
43;

Người giới thiệu

  • Kilian Weinberger, Anirban Dasgupta, John Langford, Alex Smola và Josh Attenberg [2009]. Băm tính năng để học đa nhiệm quy mô lớn. Proc. ICML

  • Tiếng rì rầmHash3

6. 2. 3. Trích xuất tính năng văn bản¶

6. 2. 3. 1. Đại diện cho Bag of Words¶

Phân tích văn bản là một lĩnh vực ứng dụng chính cho các thuật toán học máy. Tuy nhiên, dữ liệu thô, một chuỗi các ký hiệu không thể được cung cấp trực tiếp cho chính các thuật toán vì hầu hết chúng mong đợi các vectơ đặc trưng số có kích thước cố định thay vì các tài liệu văn bản thô có độ dài thay đổi

Để giải quyết vấn đề này, scikit-learning cung cấp các tiện ích cho những cách phổ biến nhất để trích xuất các đặc trưng số từ nội dung văn bản, cụ thể là

  • ví dụ: mã hóa chuỗi và cung cấp id số nguyên cho từng mã thông báo có thể bằng cách sử dụng khoảng trắng và dấu chấm câu làm dấu phân cách mã thông báo

  • đếm số lần xuất hiện của mã thông báo trong mỗi tài liệu

  • bình thường hóa và trọng số với các mã thông báo quan trọng giảm dần xảy ra trong phần lớn các mẫu/tài liệu

Trong sơ đồ này, các tính năng và mẫu được xác định như sau

  • mỗi tần suất xuất hiện mã thông báo riêng lẻ [được chuẩn hóa hay không] được coi là một tính năng

  • vectơ của tất cả các tần số mã thông báo cho một tài liệu nhất định được coi là mẫu đa biến

Do đó, một kho tài liệu có thể được biểu diễn bằng một ma trận với một hàng trên mỗi tài liệu và một cột trên mỗi mã thông báo [e. g. từ] xuất hiện trong ngữ liệu

Chúng tôi gọi vector hóa là quá trình chung để biến một tập hợp các tài liệu văn bản thành các vectơ đặc trưng số. Chiến lược cụ thể này [token hóa, đếm và chuẩn hóa] được gọi là biểu diễn Bag of Words hoặc “Bag of n-grams”. Tài liệu được mô tả theo số lần xuất hiện của từ trong khi hoàn toàn bỏ qua thông tin về vị trí tương đối của các từ trong tài liệu

6. 2. 3. 2. Độ thưa thớt¶

Vì hầu hết các tài liệu thường sẽ sử dụng một tập hợp con rất nhỏ các từ được sử dụng trong ngữ liệu, ma trận kết quả sẽ có nhiều giá trị tính năng bằng 0 [thường là hơn 99% trong số chúng]

Chẳng hạn, một tập hợp gồm 10.000 tài liệu văn bản ngắn [chẳng hạn như email] sẽ sử dụng từ vựng có kích thước theo thứ tự tổng cộng 100.000 từ duy nhất trong khi mỗi tài liệu sẽ sử dụng 100 đến 1000 từ riêng lẻ

Để có thể lưu trữ một ma trận như vậy trong bộ nhớ mà còn để tăng tốc ma trận/vectơ phép toán đại số, việc triển khai thường sẽ sử dụng biểu diễn thưa thớt, chẳng hạn như các triển khai có sẵn trong gói

>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
02

6. 2. 3. 3. Cách sử dụng Vectorizer phổ biến¶

>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
14 triển khai cả mã thông báo và số lần xuất hiện trong một lớp duy nhất

>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
4

Mô hình này có nhiều tham số, tuy nhiên các giá trị mặc định khá hợp lý [vui lòng xem tài liệu tham khảo để biết chi tiết].

>>> measurements = [
..     {'city': 'Dubai', 'temperature': 33.},
..     {'city': 'London', 'temperature': 12.},
..     {'city': 'San Francisco', 'temperature': 18.},
.. ]

>>> from sklearn.feature_extraction import DictVectorizer
>>> vec = DictVectorizer[]

>>> vec.fit_transform[measurements].toarray[]
array[[[ 1.,  0.,  0., 33.],
       [ 0.,  1.,  0., 12.],
       [ 0.,  0.,  1., 18.]]]

>>> vec.get_feature_names_out[]
array[['city=Dubai', 'city=London', 'city=San Francisco', 'temperature'], ...]
1

Hãy sử dụng nó để mã hóa và đếm số lần xuất hiện từ của một kho tài liệu văn bản tối giản

>>> measurements = [
..     {'city': 'Dubai', 'temperature': 33.},
..     {'city': 'London', 'temperature': 12.},
..     {'city': 'San Francisco', 'temperature': 18.},
.. ]

>>> from sklearn.feature_extraction import DictVectorizer
>>> vec = DictVectorizer[]

>>> vec.fit_transform[measurements].toarray[]
array[[[ 1.,  0.,  0., 33.],
       [ 0.,  1.,  0., 12.],
       [ 0.,  0.,  1., 18.]]]

>>> vec.get_feature_names_out[]
array[['city=Dubai', 'city=London', 'city=San Francisco', 'temperature'], ...]
2

Cấu hình mặc định mã hóa chuỗi bằng cách trích xuất các từ có ít nhất 2 chữ cái. Chức năng cụ thể thực hiện bước này có thể được yêu cầu rõ ràng

>>> movie_entry = [{'category': ['thriller', 'drama'], 'year': 2003},
..                {'category': ['animation', 'family'], 'year': 2011},
..                {'year': 1974}]
>>> vec.fit_transform[movie_entry].toarray[]
array[[[0.000e+00, 1.000e+00, 0.000e+00, 1.000e+00, 2.003e+03],
       [1.000e+00, 0.000e+00, 1.000e+00, 0.000e+00, 2.011e+03],
       [0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 1.974e+03]]]
>>> vec.get_feature_names_out[]
array[['category=animation', 'category=drama', 'category=family',
       'category=thriller', 'year'], ...]
>>> vec.transform[{'category': ['thriller'],
..                'unseen_feature': '3'}].toarray[]
array[[[0., 0., 0., 1., 0.]]]
0

Mỗi thuật ngữ được máy phân tích tìm thấy trong quá trình khớp được gán một chỉ số nguyên duy nhất tương ứng với một cột trong ma trận kết quả. Giải thích này của các cột có thể được lấy như sau

>>> movie_entry = [{'category': ['thriller', 'drama'], 'year': 2003},
..                {'category': ['animation', 'family'], 'year': 2011},
..                {'year': 1974}]
>>> vec.fit_transform[movie_entry].toarray[]
array[[[0.000e+00, 1.000e+00, 0.000e+00, 1.000e+00, 2.003e+03],
       [1.000e+00, 0.000e+00, 1.000e+00, 0.000e+00, 2.011e+03],
       [0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 1.974e+03]]]
>>> vec.get_feature_names_out[]
array[['category=animation', 'category=drama', 'category=family',
       'category=thriller', 'year'], ...]
>>> vec.transform[{'category': ['thriller'],
..                'unseen_feature': '3'}].toarray[]
array[[[0., 0., 0., 1., 0.]]]
1

Ánh xạ ngược lại từ tên tính năng sang chỉ mục cột được lưu trữ trong thuộc tính

>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
46 của trình tạo véc tơ

>>> movie_entry = [{'category': ['thriller', 'drama'], 'year': 2003},
..                {'category': ['animation', 'family'], 'year': 2011},
..                {'year': 1974}]
>>> vec.fit_transform[movie_entry].toarray[]
array[[[0.000e+00, 1.000e+00, 0.000e+00, 1.000e+00, 2.003e+03],
       [1.000e+00, 0.000e+00, 1.000e+00, 0.000e+00, 2.011e+03],
       [0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 1.974e+03]]]
>>> vec.get_feature_names_out[]
array[['category=animation', 'category=drama', 'category=family',
       'category=thriller', 'year'], ...]
>>> vec.transform[{'category': ['thriller'],
..                'unseen_feature': '3'}].toarray[]
array[[[0., 0., 0., 1., 0.]]]
2

Do đó, những từ không được nhìn thấy trong kho dữ liệu đào tạo sẽ bị bỏ qua hoàn toàn trong các lần gọi phương thức chuyển đổi trong tương lai

>>> movie_entry = [{'category': ['thriller', 'drama'], 'year': 2003},
..                {'category': ['animation', 'family'], 'year': 2011},
..                {'year': 1974}]
>>> vec.fit_transform[movie_entry].toarray[]
array[[[0.000e+00, 1.000e+00, 0.000e+00, 1.000e+00, 2.003e+03],
       [1.000e+00, 0.000e+00, 1.000e+00, 0.000e+00, 2.011e+03],
       [0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 1.974e+03]]]
>>> vec.get_feature_names_out[]
array[['category=animation', 'category=drama', 'category=family',
       'category=thriller', 'year'], ...]
>>> vec.transform[{'category': ['thriller'],
..                'unseen_feature': '3'}].toarray[]
array[[[0., 0., 0., 1., 0.]]]
3

Lưu ý rằng trong kho văn bản trước, tài liệu đầu tiên và tài liệu cuối cùng có các từ hoàn toàn giống nhau do đó được mã hóa theo các vectơ bằng nhau. Cụ thể, chúng tôi mất thông tin rằng tài liệu cuối cùng là một hình thức thẩm vấn. Để bảo tồn một số thông tin đặt hàng cục bộ, chúng tôi có thể trích xuất 2 gam từ ngoài 1 gam [từ riêng lẻ]

>>> movie_entry = [{'category': ['thriller', 'drama'], 'year': 2003},
..                {'category': ['animation', 'family'], 'year': 2011},
..                {'year': 1974}]
>>> vec.fit_transform[movie_entry].toarray[]
array[[[0.000e+00, 1.000e+00, 0.000e+00, 1.000e+00, 2.003e+03],
       [1.000e+00, 0.000e+00, 1.000e+00, 0.000e+00, 2.011e+03],
       [0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 1.974e+03]]]
>>> vec.get_feature_names_out[]
array[['category=animation', 'category=drama', 'category=family',
       'category=thriller', 'year'], ...]
>>> vec.transform[{'category': ['thriller'],
..                'unseen_feature': '3'}].toarray[]
array[[[0., 0., 0., 1., 0.]]]
4

Do đó, từ vựng được trích xuất bởi trình tạo véc tơ này lớn hơn nhiều và giờ đây có thể giải quyết các điểm mơ hồ được mã hóa trong các mẫu định vị cục bộ

>>> movie_entry = [{'category': ['thriller', 'drama'], 'year': 2003},
..                {'category': ['animation', 'family'], 'year': 2011},
..                {'year': 1974}]
>>> vec.fit_transform[movie_entry].toarray[]
array[[[0.000e+00, 1.000e+00, 0.000e+00, 1.000e+00, 2.003e+03],
       [1.000e+00, 0.000e+00, 1.000e+00, 0.000e+00, 2.011e+03],
       [0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 1.974e+03]]]
>>> vec.get_feature_names_out[]
array[['category=animation', 'category=drama', 'category=family',
       'category=thriller', 'year'], ...]
>>> vec.transform[{'category': ['thriller'],
..                'unseen_feature': '3'}].toarray[]
array[[[0., 0., 0., 1., 0.]]]
5

Đặc biệt hình thức nghi vấn “Is this” chỉ xuất hiện ở văn bản cuối cùng

>>> movie_entry = [{'category': ['thriller', 'drama'], 'year': 2003},
..                {'category': ['animation', 'family'], 'year': 2011},
..                {'year': 1974}]
>>> vec.fit_transform[movie_entry].toarray[]
array[[[0.000e+00, 1.000e+00, 0.000e+00, 1.000e+00, 2.003e+03],
       [1.000e+00, 0.000e+00, 1.000e+00, 0.000e+00, 2.011e+03],
       [0.000e+00, 0.000e+00, 0.000e+00, 0.000e+00, 1.974e+03]]]
>>> vec.get_feature_names_out[]
array[['category=animation', 'category=drama', 'category=family',
       'category=thriller', 'year'], ...]
>>> vec.transform[{'category': ['thriller'],
..                'unseen_feature': '3'}].toarray[]
array[[[0., 0., 0., 1., 0.]]]
6

6. 2. 3. 3. 1. Sử dụng từ dừng¶

Từ dừng là những từ như “and”, “the”, “him”, được cho là không mang tính thông tin trong việc biểu thị nội dung của văn bản và có thể bị loại bỏ để tránh bị hiểu là tín hiệu dự đoán. Tuy nhiên, đôi khi những từ giống nhau lại hữu ích cho việc dự đoán, chẳng hạn như trong việc phân loại phong cách viết hoặc tính cách.

Có một số vấn đề đã biết trong danh sách từ dừng 'tiếng Anh' do chúng tôi cung cấp. Nó không nhằm mục đích trở thành một giải pháp chung, 'một kích cỡ phù hợp với tất cả' vì một số nhiệm vụ có thể yêu cầu một giải pháp tùy chỉnh hơn. Xem [NQY18] để biết thêm chi tiết.

Hãy cẩn thận trong việc lựa chọn một danh sách từ dừng. Danh sách từ dừng phổ biến có thể bao gồm các từ có tính thông tin cao đối với một số tác vụ, chẳng hạn như máy tính

Bạn cũng nên đảm bảo rằng danh sách từ dừng đã được áp dụng quá trình tiền xử lý và mã thông báo giống như danh sách được sử dụng trong vectorizer. Từ we've được chia thành we và ve bởi mã thông báo mặc định của CountVectorizer, vì vậy nếu we've ở trong

>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
47, còn ve thì không, ve sẽ được giữ lại từ we've trong văn bản đã chuyển đổi. Vectorizers của chúng tôi sẽ cố gắng xác định và cảnh báo về một số loại mâu thuẫn

Người giới thiệu

[ NQY18 ]

J. Nothman, H. Tần và R. Cổ Tích [2018]. “Dừng danh sách từ trong các gói phần mềm mã nguồn mở miễn phí”. trong Proc. Hội thảo về Phần mềm mã nguồn mở NLP

6. 2. 3. 4. Trọng số thuật ngữ Tf–idf¶

Trong một văn bản lớn, một số từ sẽ rất hiện diện [e. g. “the”, “a”, “is” trong tiếng Anh] do đó mang rất ít thông tin có ý nghĩa về nội dung thực tế của tài liệu. Nếu chúng ta cung cấp trực tiếp dữ liệu đếm trực tiếp cho một bộ phân loại thì các thuật ngữ rất thường xuyên đó sẽ che khuất tần suất của các thuật ngữ hiếm hơn nhưng thú vị hơn

Để cân nhắc lại các tính năng đếm thành các giá trị dấu phẩy động phù hợp để sử dụng bởi bộ phân loại, người ta thường sử dụng biến đổi tf–idf

Tf có nghĩa là tần suất thuật ngữ trong khi tf–idf có nghĩa là tần suất thuật ngữ nhân với tần suất tài liệu nghịch đảo. \[\text{tf-idf[t,d]}=\text{tf[t,d]} \times \text{idf[t]}\].

Sử dụng cài đặt mặc định của

>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
00,
>>> vec = DictVectorizer[]
>>> pos_vectorized = vec.fit_transform[pos_window]
>>> pos_vectorized

>>> pos_vectorized.toarray[]
array[[[1., 1., 1., 1., 1., 1.]]]
>>> vec.get_feature_names_out[]
array[['pos+1=PP', 'pos-1=NN', 'pos-2=DT', 'word+1=on', 'word-1=cat',
       'word-2=the'], ...]
49 tần suất thuật ngữ, số lần thuật ngữ xuất hiện trong một tài liệu nhất định, được nhân với thành phần idf, được tính như sau

\[\text{idf}[t] = \log{\frac{1 + n}{1+\text{df}[t]}} + 1\]

Chủ Đề