Spacy Python là gì

Mục lục bài viết:

  • Sử dụng xử lý ngôn ngữ tự nhiên để xử lý trước và làm sạch dữ liệu văn bản
    • Mã hóa
    • Loại bỏ các từ dừng
    • Chuẩn hóa từ
    • Vectorizing Văn bản
  • Sử dụng bộ phân loại học máy để dự đoán cảm xúc
    • Công cụ học máy
    • Cách phân loại hoạt động
    • Cách sử dụng spaCy để phân loại văn bản
  • Xây dựng công cụ phân tích cảm xúc NLP của riêng bạn
    • Tải và xử lý trước dữ liệu
    • Đào tạo trình phân loại của bạn
    • Phân loại đánh giá
    • Kết nối đường ống
  • Phần kết luận
  • Các bước tiếp theo với phân tích cảm xúc và Python

Phân tích cảm xúclà một công cụ mạnh mẽ cho phép máy tính hiểu được giọng điệu chủ quan tiềm ẩn của một bài viết.Đây là điều mà con người gặp khó khăn, và như bạn có thể tưởng tượng, không phải lúc nào máy tính cũng dễ dàng như vậy.Nhưng với các công cụ phù hợp và Python, bạn có thể sử dụng phân tích cảm xúc để hiểu rõ hơn vềcảm xúccủa một bài viết.

Tại sao bạn muốn làm điều đó?Có rất nhiều cách sử dụng để phân tích tình cảm, chẳng hạn như hiểu cách các nhà giao dịch chứng khoán cảm thấy thế nào về một công ty cụ thể bằng cách sử dụng dữ liệu truyền thông xã hội hoặc tổng hợp các bài đánh giá mà bạn sẽ thực hiện ở phần cuối của hướng dẫn này.

Trong hướng dẫn này, bạn sẽ học:

  • Cách sử dụngcáckỹ thuậtxử lý ngôn ngữ tự nhiên [NLP]
  • Cách sử dụng máy học đểxác định cảm xúccủa văn bản
  • Cách sử dụng spaCy đểxây dựng đường dẫn NLPđưa vào bộ phân loại phân tích tình cảm

Hướng dẫn này lý tưởng cho những người mới bắt đầu học máy muốn có hướng dẫn tập trung vào dự án để xây dựng đường ống phân tích cảm xúc với spaCy.

Bạn nên làm quen với cáckỹ thuật máy họccơ bảnnhư phân loại nhị phân cũng như các khái niệm đằng sau chúng, chẳng hạn như vòng huấn luyện, lô dữ liệu, trọng số và độ lệch.Nếu bạn chưa quen với học máy, thì bạn có thể bắt đầu hành trình của mình bằng cách tìm hiểu vềhồi quy logistic.

Khi bạn đã sẵn sàng, bạn có thể làm theo các ví dụ trong hướng dẫn này bằng cách tải xuống mã nguồn từ liên kết bên dưới:

Sử dụng xử lý ngôn ngữ tự nhiên để xử lý trước và làm sạch dữ liệu văn bản

Mọi quy trình phân tích tình cảm đều bắt đầu với việc tải dữ liệu.Nhưng bạn sẽ làm gì sau khi dữ liệu được tải xong?Bạn cần xử lý nó thông qua một hệthống xử lý ngôn ngữ tự nhiêntrước khi bạn có thể làm bất cứ điều gì thú vị với nó.

Các bước cần thiết bao gồm [nhưng không giới hạn] như sau:

  1. Mã hóa câuđể chia nhỏ văn bản thành câu, từ hoặc các đơn vị khác
  2. Loại bỏ các từ dừngnhư nếu, nhưng hoặc, v.v.
  3. Chuẩn hóa các từbằng cách cô đọng tất cả các dạng của một từ thành một dạng duy nhất
  4. Vectơ hóa văn bảnbằng cách chuyển văn bản thành một biểu diễn số để trình phân loại của bạn sử dụng

Tất cả các bước này nhằm giảmnhiễuvốn có trong bất kỳ văn bản nào mà con người có thể đọc được và cải thiện độ chính xác của kết quả trình phân loại của bạn.Có rất nhiều công cụ tuyệt vời để trợ giúp việc này, chẳng hạn nhưBộ công cụ ngôn ngữ tự nhiên,TextBlobvàspaCy.Đối với hướng dẫn này, bạn sẽ sử dụng spaCy.

Lưu ý:spaCy là một công cụ rất mạnh với nhiều tính năng.Để tìm hiểu sâu hơn về nhiều tính năng này, hãy xemXử lý ngôn ngữ tự nhiên với spaCy.

Trước khi tiếp tục, hãy đảm bảo rằng bạn đã cài đặt spaCy và mô hình tiếng Anh của nó:

$ pip install spacy==2.3.5 $ python -m spacy download en_core_web_sm

Lệnh đầu tiên cài đặt spaCy và lệnh thứ hai sử dụng spaCy để tải xuống mô hình ngôn ngữ tiếng Anh của nó.spaCy hỗ trợ một số ngôn ngữ khác nhau, được liệt kê trêntrang web spaCy.

Cảnh báo:Hướng dẫn này chỉ hoạt động với spaCy 2.X và không tương thích với spaCy 3.0.Để có trải nghiệm tốt nhất, vui lòng cài đặt phiên bản được nêu ở trên.

Tiếp theo, bạn sẽ học cách sử dụng spaCy để trợ giúp các bước tiền xử lý mà bạn đã học trước đó, bắt đầu với mã hóa.

Mã hóa

Tokenizationlà quá trình chia nhỏ các đoạn văn bản thành các phần nhỏ hơn.spaCy đi kèm với một đường dẫn xử lý mặc định bắt đầu bằng mã hóa, giúp quá trình này diễn ra nhanh chóng.Trong spaCy, bạn có thể thực hiện mã hóa câu hoặc mã hóa từ:

  • Mã hóa từchia nhỏ văn bản thành các từ riêng lẻ.
  • Mã hóa câuchia nhỏ văn bản thành các câu riêng lẻ.

Trong hướng dẫn này, bạn sẽ sử dụng mã hóa từ để tách văn bản thành các từ riêng lẻ.Đầu tiên, bạn sẽ tải văn bản vào spaCy, thực hiện công việc mã hóa cho bạn:

>>> >>> import spacy >>> text = """ Dave watched as the forest burned up on the hill, only a few miles from his house. The car had been hastily packed and Marta was inside trying to round up the last of the pets. "Where could she be?" he wondered as he continued to wait for Marta to appear with the pets. """ >>> nlp = spacy.load["en_core_web_sm"] >>> doc = nlp[text] >>> token_list = [token for token in doc] >>> token_list [ , Dave, watched, as, the, forest, burned, up, on, the, hill, ,, , only, a, few, miles, from, his, house, ., The, car, had, , been, hastily, packed, and, Marta, was, inside, trying, to, round, , up, the, last, of, the, pets, ., ", Where, could, she, be, ?, ", he, wondered, , as, he, continued, to, wait, for, Marta, to, appear, with, the, pets, ., ]

Trong đoạn mã này, bạn thiết lập một số văn bản mẫu để mã hóa, tải mô hình tiếng Anh của spaCy và sau đó mã hóa văn bản bằng cách chuyển nó vào hàmnlptạo.Mô hình này bao gồm một đường dẫn xử lý mặc định mà bạn có thể tùy chỉnh, như bạn sẽ thấy sau trong phần dự án.

Sau đó, bạn tạo một danh sách các mã thông báo và in nó.Như bạn có thể đã nhận thấy, mã hóa từ là một thuật ngữ hơi gây hiểu nhầm, vì các mã thông báo được bắt bao gồm dấu chấm câu và các chuỗi không phải từ khóa khác.

Token là một loại vùng chứa quan trọng trong spaCy và có một bộ tính năng rất phong phú.Trong phần tiếp theo, bạn sẽ học cách sử dụng một trong những tính năng đó để lọc ra các từ dừng.

Loại bỏ các từ dừng

Stop wordslà những từ có thể quan trọng trong giao tiếp của con người nhưng lại ít có giá trị đối với máy móc.spaCy đi kèm với một danh sách các từ dừng mặc định mà bạn có thể tùy chỉnh.Hiện tại, bạn sẽ thấy cách bạn có thể sử dụng các thuộc tính mã thông báo để loại bỏ các từ dừng:

>>> >>> filtered_tokens = [token for token in doc if not token.is_stop] >>> filtered_tokens [ , Dave, watched, forest, burned, hill, ,, , miles, house, ., car, , hastily, packed, Marta, inside, trying, round, , pets, ., ", ?, ", wondered, , continued, wait, Marta, appear, pets, ., ]

Trong một dòng mã Python, bạn lọc ra các từ dừng khỏi văn bản được mã hóa bằng cách sử dụng.is_stopthuộc tính mã thông báo.

Bạn nhận thấy sự khác biệt nào giữa đầu ra này và đầu ra bạn nhận được sau khi mã hóa văn bản?Với việc loại bỏ các từ dừng, danh sách mã thông báo ngắn hơn nhiều và có ít ngữ cảnh hơn để giúp bạn hiểu các mã thông báo.

Chuẩn hóa từ

Chuẩn hóaphức tạp hơn một chút so với mã hóa.Nó đòi hỏi cô đọng tất cả các dạng của một từ thành một biểu diễn duy nhất của từ đó.Ví dụ: đã xem, đang xem và đã xem đều có thể được chuẩn hóa thành đồng hồ.Có hai phương pháp chuẩn hóa chính:

  1. Gốc
  2. Bổ sung

Vớicách ghépgốc, một từ bị cắt bỏ ởgốccủa nó, đơn vị nhỏ nhất của từ đó mà từ đó bạn có thể tạo ra các từ con cháu.Bạn vừa xem một ví dụ về điều này ở trên với đồng hồ.Việc cắt ngắn chỉ đơn giản là cắt ngắn chuỗi bằng cách sử dụng các phần cuối thông thường, vì vậy, nó sẽ bỏ sót mối quan hệ giữa feel và feel, chẳng hạn.

Lemmatizationtìm cách giải quyết vấn đề này.Quá trình này sử dụng cấu trúc dữ liệu liên hệ tất cả các dạng của một từ trở lại dạng đơn giản nhất của nó, hoặcbổ đề.Bởi vì lemmatization thường mạnh mẽ hơn việc tạo gốc, đó là chiến lược chuẩn hóa duy nhất được cung cấp bởi spaCy.

May mắn thay, bạn không cần bất kỳ mã bổ sung nào để thực hiện việc này.Nó diễn ra tự động cùng với một số hoạt động khác, chẳng hạn nhưmột phần của gắn thẻ giọng nóivànhận dạng thực thể được đặt tên khi bạn gọinlp[].Bạn có thể kiểm tra bổ đề cho từng mã thông báo bằng cách tận dụng.lemma_thuộc tính:

>>> >>> lemmas = [ ... f"Token: {token}, lemma: {token.lemma_}" ... for token in filtered_tokens ... ] >>> lemmas ['Token: \n, lemma: \n', 'Token: Dave, lemma: Dave', 'Token: watched, lemma: watch', 'Token: forest, lemma: forest', # ... ]

Tất cả những gì bạn làm ở đây là tạo một danh sách mã thông báo và bổ đề có thể đọc được bằng cách lặp qua danh sách mã thông báo đã lọc, tận dụng.lemma_thuộc tính để kiểm tra các bổ đề.Ví dụ này chỉ hiển thị một số mã thông báo và bổ đề đầu tiên.Đầu ra của bạn sẽ dài hơn nhiều.

Lưu ý:Chú ý dấu gạch dưới trên.lemma_thuộc tính.Đó không phải là lỗi đánh máy.Đó là một quy ước trong spaCy cóđược phiên bản thuộc tính có thể đọc được của con người.

Bước tiếp theo là biểu diễn từng mã thông báo theo cách mà máy có thể hiểu được.Đây được gọi làvectơ hóa.

Vectorizing Văn bản

Vectơ hóalà một quá trình biến đổi một mã thông báo thành mộtvectơhoặc một mảng số, trong ngữ cảnh của NLP, là duy nhất và đại diện cho các tính năng khác nhau của mã thông báo.Các vectơ được sử dụng để tìm các điểm tương đồng từ, phân loại văn bản và thực hiện các hoạt động NLP khác.

Biểu diễn cụ thể này là mộtmảng dày đặc, mộtmảngtrong đó có các giá trị được xác định cho mọi không gian trong mảng.Điều này trái ngược với các phương pháp trước đó sử dụngcác mảng thưa thớt, trong đó hầu hết các không gian đều trống.

Giống như các bước khác, vectơ hóa được thực hiện tự động vớinlp[]cuộc gọi.Vì bạn đã có danh sách các đối tượng mã thông báo, bạn có thể nhận được biểu diễn vectơ của một trong các mã thông báo như sau:

>>> >>> filtered_tokens[1].vector array[[ 1.8371646 , 1.4529226 , -1.6147211 , 0.678362 , -0.6594443 , 1.6417935 , 0.5796405 , 2.3021278 , -0.13260496, 0.5750932 , 1.5654886 , -0.6938864 , -0.59607106, -1.5377437 , 1.9425622 , -2.4552505 , 1.2321601 , 1.0434952 , -1.5102385 , -0.5787632 , 0.12055647, 3.6501784 , 2.6160972 , -0.5710199 , -1.5221789 , 0.00629176, 0.22760668, -1.922073 , -1.6252862 , -4.226225 , -3.495663 , -3.312053 , 0.81387717, -0.00677544, -0.11603224, 1.4620426 , 3.0751472 , 0.35958546, -0.22527039, -2.743926 , 1.269633 , 4.606786 , 0.34034157, -2.1272311 , 1.2619178 , -4.209798 , 5.452852 , 1.6940253 , -2.5972986 , 0.95049495, -1.910578 , -2.374927 , -1.4227567 , -2.2528825 , -1.799806 , 1.607501 , 2.9914255 , 2.8065152 , -1.2510269 , -0.54964066, -0.49980402, -1.3882618 , -0.470479 , -2.9670253 , 1.7884955 , 4.5282774 , -1.2602427 , -0.14885521, 1.0419178 , -0.08892632, -1.138275 , 2.242618 , 1.5077229 , -1.5030195 , 2.528098 , -1.6761329 , 0.16694719, 2.123961 , 0.02546412, 0.38754445, 0.8911977 , -0.07678384, -2.0690763 , -1.1211847 , 1.4821006 , 1.1989193 , 2.1933236 , 0.5296372 , 3.0646474 , -1.7223308 , -1.3634219 , -0.47471118, -1.7648507 , 3.565178 , -2.394205 , -1.3800384 ], dtype=float32]

Ở đây bạn sử dụng.vectorthuộc tính trên mã thông báo thứ hai trongfiltered_tokensdanh sách, mà trong tập hợp các ví dụ này là từDave.

Lưu ý:Nếu bạn nhận được các kết quả khác nhau cho.vectorthuộc tính, đừng lo lắng.Điều này có thể là do bạn đang sử dụng một phiên bản khác củaen_core_web_smmô hình hoặc có thể là của chính spaCy.

Bây giờ bạn đã học về một số bước xử lý trước văn bản điển hình trong spaCy, bạn sẽ học cách phân loại văn bản.

Sử dụng bộ phân loại học máy để dự đoán cảm xúc

Văn bản của bạn hiện đã được máy tính xử lý thành một dạng có thể hiểu được, vì vậy bạn có thể bắt đầu phân loại văn bản theo cảm tính của nó.Bạn sẽ bao gồm ba chủ đề sẽ cung cấp cho bạn hiểu biết chung vềphân loạidữ liệu văn bảncủamáy học:

  1. Những công cụ học máy nào có sẵn và cách chúng được sử dụng
  2. Cách phân loại hoạt động
  3. Cách sử dụng spaCy để phân loại văn bản

Đầu tiên, bạn sẽ tìm hiểu về một số công cụ có sẵn để thực hiện phân loại học máy.

Công cụ học máy

Có một số công cụ có sẵn trong Python để giải quyết các vấn đề phân loại.Dưới đây là một số trong số những cái phổ biến hơn:

  • TensorFlow
  • PyTorch
  • scikit-học

Danh sách này không bao gồm tất cả, nhưng đây là những khuôn khổ học máy được sử dụng rộng rãi hơn có sẵn trong Python.Chúng là những khuôn khổ lớn, mạnh mẽ, cần rất nhiều thời gian để thực sự thành thạo và hiểu rõ.

TensorFlowđược phát triển bởi Google và là một trong những khuôn khổ học máy phổ biến nhất.Bạn sử dụng nó chủ yếu để triển khai các thuật toán học máy của riêng mình thay vì sử dụng các thuật toán hiện có.Nó ở mức khá thấp, mang lại cho người dùng rất nhiều sức mạnh, nhưng nó đi kèm với một đường cong học tập dốc.

PyTorchlà câu trả lời của Facebook cho TensorFlow và đạt được nhiều mục tiêu giống nhau.Tuy nhiên, nó được xây dựng để quen thuộc hơn với các lập trình viên Python và đã trở thành một khuôn khổ rất phổ biến theo đúng nghĩa của nó.Bởi vì chúng có các trường hợp sử dụng tương tự,so sánh TensorFlow và PyTorchlà một bài tập hữu ích nếu bạn đang cân nhắc học một khuôn khổ.

scikit-learninglà viết tắt của TensorFlow và PyTorch.Nó cấp cao hơn và cho phép bạn sử dụng các thuật toán máy học có sẵn thay vì tự xây dựng.Những gì nó thiếu trong khả năng tùy chỉnh, nó còn bù đắp cho việc dễ sử dụng, cho phép bạn đào tạo nhanh chóng các bộ phân loại chỉ trong một vài dòng mã.

May mắn thay, spaCy cung cấp một trình phân loại văn bản tích hợp khá đơn giản mà bạn sẽ tìm hiểu về nó sau này.Tuy nhiên, trước tiên, điều quan trọng là phải hiểu quy trình làm việc chung cho bất kỳ loại vấn đề phân loại nào.

Cách phân loại hoạt động

Đừng lo lắng đối với phần này, bạn sẽ không đi sâu vào đại số tuyến tính, không gian vectơ hoặc các khái niệm bí truyền khác hỗ trợ cho việc học máy nói chung.Thay vào đó, bạn sẽ được giới thiệu thực tế về quy trình làm việc và các ràng buộc thường gặp đối với các vấn đề phân loại.

Sau khi bạn có dữ liệu được vector hóa, quy trình cơ bản để phân loại sẽ như sau:

  1. Chia dữ liệu của bạn thành các nhóm đào tạo và đánh giá.
  2. Chọn một kiến ​​trúc mô hình.
  3. Sử dụng dữ liệu đào tạo để đào tạo mô hình của bạn.
  4. Sử dụng dữ liệu thử nghiệm để đánh giá hiệu suất của mô hình của bạn.
  5. Sử dụng mô hình được đào tạo của bạn trên dữ liệu mới để tạo dự đoán, trong trường hợp này sẽ là một số từ -1,0 đến 1,0.

Danh sách này không đầy đủ và có một số bước và biến thể bổ sung có thể được thực hiện để cố gắng cải thiện độ chính xác.Ví dụ: những người thực hành học máy thường chia bộ dữ liệu của họ thành ba bộ:

  1. Đào tạo
  2. Thẩm định
  3. Kiểm tra

Bộđào tạo, như tên của nó, được sử dụng để đào tạo mô hình của bạn.Bộxác thựcđược sử dụng để giúp điều chỉnh cácsiêu thamsố của mô hình của bạn, điều này có thể dẫn đến hiệu suất tốt hơn.

Lưu ý:Hyperparameters kiểm soát quá trình đào tạo và cấu trúc của mô hình của bạn và có thể bao gồm những thứ như tốc độ học tập và kích thước lô.Tuy nhiên, siêu thông số nào có sẵn phụ thuộc rất nhiều vào kiểu máy bạn chọn sử dụng.

Bộkiểm tralà một bộ dữ liệu kết hợp nhiều loại dữ liệu để đánh giá chính xác hiệu suất của mô hình.Các bộ kiểm tra thường được sử dụng để so sánh nhiều mô hình, bao gồm các mô hình giống nhau ở các giai đoạn đào tạo khác nhau.

Bây giờ bạn đã học được quy trình phân loại chung, đã đến lúc thực hiện nó với spaCy.

Cách sử dụng spaCy để phân loại văn bản

Bạn đã biết cách spaCy thực hiện phần lớn công việc tiền xử lý văn bản cho bạn với hàmnlp[]tạo.Điều này thực sự hữu ích vì việc đào tạo một mô hình phân loại yêu cầu nhiều ví dụ để hữu ích.

Ngoài ra, spaCy cung cấp một chức năng đường ống cung cấp phần lớn điều kỳ diệu xảy ra dưới mui xe khi bạn gọinlp[].Đường ống mặc định được xác định trongtệpJSON đượcliên kết với bất kỳ mô hình nào có sẵn mà bạn đang sử dụng [en_core_web_smcho hướng dẫn này], nhưng bạn cũng có thể tạo mộtđường ốngtừ đầu nếu muốn.

Lưu ý:Để tìm hiểu thêm về cách tạo đường ống xử lý ngôn ngữ của riêng bạn, hãy xemtài liệu đường dẫn spaCy.

Điều này có liên quan gì đến phân loại?Một trong những thành phần đường ống tích hợp mà spaCy cung cấp được gọi làtextcat[viết tắt củaTextCategorizer], cho phép bạn gán danh mục [hoặcnhãn] cho dữ liệu văn bản của mình và sử dụng nó làm dữ liệu đào tạo cho mạng nơ-ron.

Quá trình này sẽ tạo ra một mô hình được đào tạo mà sau đó bạn có thể sử dụng để dự đoán cảm xúc của một đoạn văn bản nhất định.Để tận dụng công cụ này, bạn cần thực hiện các bước sau:

  1. Thêmtextcatthành phần vào đường ống hiện có.
  2. Thêm nhãn hợp lệ vàotextcatthành phần.
  3. Tải, trộn và chia nhỏ dữ liệu của bạn.
  4. Huấn luyện mô hình, đánh giá trên từng vòng huấn luyện.
  5. Sử dụng mô hình được đào tạo để dự đoán cảm xúc của dữ liệu không được đào tạo.
  6. Theo tùy chọn, lưu mô hình đã đào tạo.

Lưu ý:Bạn có thể thấy cách triển khai các bước này trong cácví dụ tài liệu spaCy.Đây là cách chính để phân loại văn bản trong spaCy, vì vậy bạn sẽ nhận thấy rằng mã dự án rút ra rất nhiều từ ví dụ này.

Trong phần tiếp theo, bạn sẽ học cách kết hợp tất cả những phần này lại với nhau bằng cách xây dựng dự án của riêng bạn: một công cụ phân tích tình cảm đánh giá phim.

Xây dựng công cụ phân tích cảm xúc NLP của riêng bạn

Từ các phần trước, bạn có thể đã nhận thấy bốn giai đoạn chính của việc xây dựng một đường dẫn phân tích tình cảm:

  1. Đang tải dữ liệu
  2. Sơ chế
  3. Đào tạo trình phân loại
  4. Phân loại dữ liệu

Để xây dựng một công cụ phân tích tình cảm trong cuộc sống thực, bạn sẽ làm việc qua từng bước tạo nên các giai đoạn này.Bạn sẽ sử dụngTập dữ liệu đánh giá phim lớndoAndrew Maasbiên soạnđể đào tạo và kiểm tra trình phân tích tình cảm của mình.Khi bạn đã sẵn sàng, hãy chuyển sang phần tiếp theo để tải dữ liệu của bạn.

Tải và xử lý trước dữ liệu

Nếu bạn chưa có, hãy tải xuống và giải nén Tập dữ liệu đánh giá phim lớn.Hãy dành vài phút để xem xét cấu trúc của nó và lấy mẫu một số dữ liệu.Điều này sẽ thông báo cách bạn tải dữ liệu.Đối với phần này, bạn sẽ sử dụngví dụcủa spaCytextcatlàm hướng dẫn sơ bộ.

Bạn có thể [và nên] phân tách giai đoạn tải thành các bước cụ thể để giúp lập kế hoạch mã hóa của bạn.Đây là một ví dụ:

  1. Tải văn bản và nhãn từ cấu trúc tệp và thư mục.
  2. Xáo trộn dữ liệu.
  3. Chia dữ liệu thành các tập huấn luyện và kiểm tra.
  4. Trả về hai bộ dữ liệu.

Quá trình này tương đối khép kín, vì vậy ít nhất nó phải có chức năng riêng.Khi nghĩ về các hành động mà hàm này sẽ thực hiện, bạn có thể đã nghĩ đến một số tham số khả thi.

Vì bạn đang chia nhỏ dữ liệu, nên khả năng kiểm soát kích thước của các phần tách đó có thể hữu ích, vì vậy,splitmột tham số tốt để đưa vào.Bạn cũng có thể muốn giới hạn tổng số lượng tài liệu bạn xử lý bằng mộtlimittham số.Bạn có thể mở trình soạn thảo yêu thích của mình và thêm chữ ký chức năng này:

def load_training_data[ data_directory: str = "aclImdb/train", split: float = 0.8, limit: int = 0 ] -> tuple:

Với chữ ký này, bạn tận dụng cácchú thích kiểucủa Python 3để làm cho nó hoàn toàn rõ ràng về kiểu hàm của bạn mong đợi và những gì nó sẽ trả về.

Các tham số ở đây cho phép bạn xác định thư mục mà dữ liệu của bạn được lưu trữ cũng như tỷ lệ giữa dữ liệu đào tạo với dữ liệu kiểm tra.Một tỷ lệ tốt để bắt đầu là 80 phần trăm dữ liệu cho dữ liệu đào tạo và 20 phần trăm cho dữ liệu thử nghiệm.Tất cả mã này và mã sau, trừ khi được chỉ định khác, sẽ nằm trong cùng một tệp.

Tiếp theo, bạn sẽ muốn lặp lại tất cả các tệp trong tập dữ liệu này và tải chúng vào danh sách:

import os def load_training_data[ data_directory: str = "aclImdb/train", split: float = 0.8, limit: int = 0 ] -> tuple: # Load from files reviews = [] for label in ["pos", "neg"]: labeled_directory = f"{data_directory}/{label}" for review in os.listdir[labeled_directory]: if review.endswith[".txt"]: with open[f"{labeled_directory}/{review}"] as f: text = f.read[] text = text.replace["
"
, "\n\n"]
if text.strip[]: spacy_label = { "cats": { "pos": "pos" == label, "neg": "neg" == label } } reviews.append[[text, spacy_label]]

Mặc dù điều này có vẻ phức tạp, nhưng những gì bạn đang làm là xây dựng cấu trúc thư mục của dữ liệu, tìm kiếm và mở các tệp văn bản, sau đó thêm một loạt nội dung và một từ điển nhãn vàoreviewsdanh sách.

Cấu trúc từ điển nhãn là một định dạng được yêu cầu bởi mô hình spaCy trong vòng lặp đào tạo mà bạn sẽ thấy ngay sau đây.

Lưu ý:Trong suốt hướng dẫn này và trong suốt hành trình Python của bạn, bạn sẽđọc và ghi tệp.Đây là một kỹ năng cơ bản cần thành thạo, vì vậy hãy đảm bảo xem lại kỹ năng đó trong khi bạn làm việc thông qua hướng dẫn này.

Vì bạn có mỗi bài đánh giá đang mở tại thời điểm này, nên thay thế các
thẻ HTML trong văn bản bằng các dòng mới và sử dụng.strip[]để xóa tất cả các khoảng trắng ở đầu và cuối.

Đối với dự án này, bạn sẽ không xóa stop words khỏi dữ liệu đào tạo của mình ngay lập tức vì nó có thể thay đổi ý nghĩa của một câu hoặc cụm từ, điều này có thể làm giảm khả năng dự đoán của trình phân loại của bạn.Điều này phụ thuộc phần nào vào danh sách từ dừng mà bạn sử dụng.

Sau khi tải các tệp, bạn muốn xáo trộn chúng.Điều này hoạt động để loại bỏ mọi sai lệch có thể có từ thứ tự tải dữ liệu đào tạo.Vìrandommô-đun giúp việc này dễ dàng thực hiện trong một dòng, bạn cũng sẽ thấy cách phân chia dữ liệu đã xáo trộn của mình:

import os import random def load_training_data[ data_directory: str = "aclImdb/train", split: float = 0.8, limit: int = 0 ] -> tuple: # Load from files reviews = [] for label in ["pos", "neg"]: labeled_directory = f"{data_directory}/{label}" for review in os.listdir[labeled_directory]: if review.endswith[".txt"]: with open[f"{labeled_directory}/{review}"] as f: text = f.read[] text = text.replace["
"
, "\n\n"] if text.strip[]: spacy_label = { "cats": { "pos": "pos" == label, "neg": "neg" == label} } reviews.append[[text, spacy_label]] random.shuffle[reviews] if limit: reviews = reviews[:limit] split = int[len[reviews] * split] return reviews[:split], reviews[split:]

Tại đây, bạn xáo trộn dữ liệu của mình với một cuộc gọi tớirandom.shuffle[].Sau đó, bạn có thể tùy chọn cắt bớt và chia nhỏ dữ liệu bằng cách sử dụng một số phép toán để chuyển phần tách thành một số mục xác định ranh giới phân chia.Cuối cùng, bạntrả lạihai phần củareviewsdanh sách bằng cách sử dụng các lát danh sách.

Đây là kết quả đầu ra mẫu, được cắt bớt cho ngắn gọn:

[ 'When tradition dictates that an artist must pass [...]', {'cats': {'pos': True, 'neg': False}} ]

Để tìm hiểu thêm về cáchrandomhoạt động, hãy xemTạo dữ liệu ngẫu nhiên bằng Python [Hướng dẫn].

Lưu ý:Các nhà sản xuất spaCy cũng đã phát hành một gói có tên làthinc, trong số các tính năng khác, bao gồm quyền truy cập đơn giản vào các tập dữ liệu lớn, bao gồm cả tập dữ liệu đánh giá IMDB mà bạn đang sử dụng cho dự án này.

Bạn có thể tìm thấy dự ántrên GitHub.Nếu bạn điều tra nó, hãy xem cách họ xử lý việc tải tập dữ liệu IMDB và xem những điểm trùng lặp nào tồn tại giữa mã của họ và mã của bạn.

Bây giờ bạn đã xây dựng xong bộ tải dữ liệu và đã hoàn thành một số xử lý sơ bộ nhẹ, đã đến lúc xây dựng đường ống spaCy và vòng đào tạo trình phân loại.

Đào tạo trình phân loại của bạn

Việc kết hợp đường ống spaCy với nhau cho phép bạn nhanh chóng xây dựng và đào tạo mộtmạng nơ-ron phức hợp[CNN] để phân loại dữ liệu văn bản.Trong khi bạn đang sử dụng nó ở đây để phân tích tình cảm, nó đủ chung để làm việc với bất kỳ loạinhiệm vụphân loại văn bảnnào miễn là bạn cung cấp cho nó dữ liệu đào tạo và nhãn.

Trong phần này của dự án, bạn sẽ thực hiện ba bước:

  1. Sửa đổi đường ống spaCy cơ sở để bao gồmtextcatthành phần
  2. Xây dựng vòng lặp đào tạo để đào tạotextcatthành phần
  3. Đánh giá tiến độ đào tạo mô hình của bạn sau một số vòng đào tạo nhất định

Đầu tiên, bạn sẽ thêmtextcatvào đường dẫn spaCy mặc định.

Sửa đổi spaCy Pipeline to Bao gồmtextcat

Đối với phần đầu tiên, bạn sẽ tải cùng một đường dẫn như bạn đã làm trong các ví dụ ở phần đầu của hướng dẫn này, sau đó bạn sẽ thêmtextcatthành phần nếu nó chưa có.Sau đó, bạn sẽ thêm các nhãn mà dữ liệu của bạn sử dụng ["pos"cho khẳng định và"neg"cho phủ định] vàotextcat.Sau khi hoàn tất, bạn sẽ sẵn sàng xây dựng vòng lặp đào tạo:

import os import random import spacy def train_model[ training_data: list, test_data: list, iterations: int = 20 ] -> None: # Build pipeline nlp = spacy.load["en_core_web_sm"] if "textcat" not in nlp.pipe_names: textcat = nlp.create_pipe[ "textcat", config={"architecture": "simple_cnn"} ] nlp.add_pipe[textcat, last=True]

Nếu bạn đã xemtextcatví dụcủa tài liệu spaCy, thì điều này sẽ trông khá quen thuộc.Đầu tiên, bạn tảien_core_web_smđường dẫn có sẵn, sau đó bạn kiểm tra.pipe_namesthuộc tính để xemtextcatthành phần đã có sẵn chưa.

Nếu không, thì bạn tạo thành phần [còn gọi làđường ống] với.create_pipe[], chuyển vào từ điển cấu hình.Có một số tùy chọn mà bạn có thể làm việc được mô tả trongTextCategorizertài liệu.

Cuối cùng, bạn thêm thành phần vào đường ống bằng cách sử dụng.add_pipe[], vớilasttham số biểu thị rằng thành phần này nên được thêm vào cuối đường ống.

Tiếp theo, bạn sẽ xử lý trường hợp cótextcatthành phần và sau đó thêm các nhãn sẽ đóng vai trò là danh mục cho văn bản của bạn:

import os import random import spacy def train_model[ training_data: list, test_data: list, iterations: int = 20 ] -> None: # Build pipeline nlp = spacy.load["en_core_web_sm"] if "textcat" not in nlp.pipe_names: textcat = nlp.create_pipe[ "textcat", config={"architecture": "simple_cnn"} ] nlp.add_pipe[textcat, last=True] else: textcat = nlp.get_pipe["textcat"] textcat.add_label["pos"] textcat.add_label["neg"]

Nếu thành phần hiện diện trong đường dẫn được tải, thì bạn chỉ cần sử dụng.get_pipe[]để gán nó cho một biến để bạn có thể làm việc trên đó.Đối với dự án này, tất cả những gì bạn sẽ làm với nó là thêm các nhãn từ dữ liệu của bạn đểtextcatbiết những gì cần tìm.Bạn sẽ làm điều đó với.add_label[].

Bạn đã tạo đường dẫn và chuẩn bịtextcatthành phần cho các nhãn mà nó sẽ sử dụng để đào tạo.Bây giờ đã đến lúc viết vòng lặp đào tạo sẽ cho phéptextcatphân loại các bài đánh giá phim.

Xây dựng vòng lặp đào tạo của bạn để đào tạotextcat

Để bắt đầu vòng lặp đào tạo, trước tiên bạn sẽ đặt đường dẫn của mình để chỉ đào tạotextcatthành phần, tạocác lôdữ liệu cho nó với spaCyminibatch[]vàcompounding[]các tiện ích, sau đó xem qua chúng và cập nhật mô hình của bạn.

Mộtlôchỉ là một tập hợp con dữ liệu của bạn.Kết hợp dữ liệu của bạn cho phép bạn giảm dung lượng bộ nhớ trong quá trình đào tạo và cập nhật nhanh hơn các siêu tham số của bạn.

Lưu ý:Kết hợp kích thước lô là một kỹ thuật tương đối mới và sẽ giúp tăng tốc độ đào tạo.Bạn có thể tìm hiểu thêm về cáchgộp số lượnglô trongcác mẹo đào tạo của spaCy.

Đây là cách triển khai vòng lặp đào tạo được mô tả ở trên:

1import os 2import random 3import spacy 4from spacy.util import minibatch, compounding 5 6def train_model[ 7 training_data: list, 8 test_data: list, 9 iterations: int = 20 10] -> None: 11 # Build pipeline 12 nlp = spacy.load["en_core_web_sm"] 13 if "textcat" not in nlp.pipe_names: 14 textcat = nlp.create_pipe[ 15 "textcat", config={"architecture": "simple_cnn"} 16 ] 17 nlp.add_pipe[textcat, last=True] 18 else: 19 textcat = nlp.get_pipe["textcat"] 20 21 textcat.add_label["pos"] 22 textcat.add_label["neg"] 23 24 # Train only textcat 25 training_excluded_pipes = [ 26 pipe for pipe in nlp.pipe_names if pipe != "textcat" 27 ]

Trên các dòng từ 25 đến 27, bạn tạo danh sách tất cả các thành phần trong đường ống không phải làtextcatthành phần.Sau đó, bạn sử dụng trìnhnlp.disable[]quản lý ngữ cảnh để tắt các thành phần đó cho tất cả mã trong phạm vi của trình quản lý ngữ cảnh.

Bây giờ bạn đã sẵn sàng thêm mã để bắt đầu đào tạo:

import os import random import spacy from spacy.util import minibatch, compounding def train_model[ training_data: list, test_data: list, iterations: int = 20 ] -> None: # Build pipeline nlp = spacy.load["en_core_web_sm"] if "textcat" not in nlp.pipe_names: textcat = nlp.create_pipe[ "textcat", config={"architecture": "simple_cnn"} ] nlp.add_pipe[textcat, last=True] else: textcat = nlp.get_pipe["textcat"] textcat.add_label["pos"] textcat.add_label["neg"] # Train only textcat training_excluded_pipes = [ pipe for pipe in nlp.pipe_names if pipe != "textcat" ] with nlp.disable_pipes[training_excluded_pipes]: optimizer = nlp.begin_training[] # Training loop print["Beginning training"] batch_sizes = compounding[ 4.0, 32.0, 1.001 ] # A generator that yields infinite series of input numbers

Ở đây, bạn gọinlp.begin_training[], hàm này trả về hàm tối ưu hóa ban đầu.Đây là những gìnlp.update[]sẽ sử dụng để cập nhật trọng số của mô hình cơ bản.

Sau đó, bạn sử dụngcompounding[]tiện ích để tạo một trình tạo, cung cấp cho bạn một chuỗi vô hạn củabatch_sizesnó sẽ đượcminibatch[]tiện íchsử dụng sau này.

Bây giờ bạn sẽ bắt đầu đào tạo về các lô dữ liệu:

import os import random import spacy from spacy.util import minibatch, compounding def train_model[ training_data: list, test_data: list, iterations: int = 20 ] -> None: # Build pipeline nlp = spacy.load["en_core_web_sm"] if "textcat" not in nlp.pipe_names: textcat = nlp.create_pipe[ "textcat", config={"architecture": "simple_cnn"} ] nlp.add_pipe[textcat, last=True] else: textcat = nlp.get_pipe["textcat"] textcat.add_label["pos"] textcat.add_label["neg"] # Train only textcat training_excluded_pipes = [ pipe for pipe in nlp.pipe_names if pipe != "textcat" ] with nlp.disable_pipes[training_excluded_pipes]: optimizer = nlp.begin_training[] # Training loop print["Beginning training"] batch_sizes = compounding[ 4.0, 32.0, 1.001 ] # A generator that yields infinite series of input numbers for i in range[iterations]: loss = {} random.shuffle[training_data] batches = minibatch[training_data, size=batch_sizes] for batch in batches: text, labels = zip[*batch] nlp.update[ text, labels, drop=0.2, sgd=optimizer, losses=loss ]

Bây giờ, đối với mỗi lần lặp được chỉ định trongtrain_model[]chữ ký, bạn tạo một từ điển trống có tênlosssẽ được cập nhật và sử dụng bởinlp.update[].Bạn cũng xáo trộn dữ liệu đào tạo và chia nó thành các lô có kích thước khác nhau vớiminibatch[].

Đối với mỗi lô, bạn tách văn bản và nhãn, sau đó nạp chúng,losstừ điểntrốngvàoptimizerđếnnlp.update[].Điều này chạy đào tạo thực tế trên mỗi ví dụ.

Cácdropouttham số nóinlp.update[]những gì tỷ lệ dữ liệu huấn luyện trong đợt đó để bỏ qua.Bạn làm điều này để làm cho mô hình khó vô tình chỉ ghi nhớ dữ liệu đào tạo mà không đưa ra một mô hình tổng quát hóa.

Việc này sẽ mất một khoảng thời gian, vì vậy điều quan trọng là phải đánh giá định kỳ mô hình của bạn.Bạn sẽ làm điều đó với dữ liệu mà bạn đã giữ lại từ tập huấn luyện, còn được gọi làtập hợp lưu giữ.

Đánh giá tiến độ đào tạo mô hình

Vì bạn sẽ thực hiện một số đánh giá, với nhiều phép tính cho mỗi phép tính, nên việc viết mộtevaluate_model[]hàmriêng biệt sẽ rất hợp lý.Trong chức năng này, bạn sẽ chạy các tài liệu trong bộ thử nghiệm của mình so với mô hình chưa hoàn thành để nhận dự đoán của mô hình và sau đó so sánh chúng với các nhãn chính xác của dữ liệu đó.

Sử dụng thông tin đó, bạn sẽ tính toán các giá trị sau:

  • Kết quả tích cực thực sựlà tài liệu mà mô hình của bạn đã dự đoán chính xác là tích cực.Đối với dự án này, điều này ánh xạ đến tình cảm tích cực nhưng khái quát trong các nhiệm vụ phân loại nhị phân cho lớp mà bạn đang cố gắng xác định.

  • Kết quả dương tính giảlà các tài liệu mà mô hình của bạn dự đoán không chính xác là tích cực nhưng trên thực tế là tiêu cực.

  • Phủ định thựclà tài liệu mà mô hình của bạn đã dự đoán chính xác là phủ định.

  • Phủ định giảlà tài liệu mà mô hình của bạn dự đoán không chính xác là tiêu cực nhưng trên thực tế là tích cực.

Bởi vì mô hình của bạn sẽ trả về điểm từ 0 đến 1 cho mỗi nhãn, bạn sẽ xác định kết quả tích cực hay tiêu cực dựa trên điểm số đó.Từ bốn thống kê được mô tả ở trên, bạn sẽ tính được độ chính xác và thu hồi, là những thước đo phổ biến về hiệu suất của mô hình phân loại:

  • Độ chính xáclà tỷ lệ giữa số dương tính thực với tất cả các mục mà mô hình của bạn được đánh dấu là tích cực [dương tính đúngvàsai].Độ chính xác 1,0 có nghĩa là mọi bài đánh giá mà mô hình của bạn được đánh dấu là tích cực đều thuộc loại tích cực.

  • Nhớ lạilà tỷ lệ giữa số dương tính thực sự với tất cả các bài đánh giáthực sựtích cực, hoặc sốý kiến ​​khẳng địnhthực sựchia cho tổng số ý kiến ​​khẳng định đúng và phủ định sai.

ĐiểmFlà một thước đo độ chính xác phổ biến khác, đặc biệt là trong thế giới NLP.Việc giải thích nó có thể cần bài viết riêng, nhưng bạn sẽ thấy phép tính trong mã.Đối với độ chính xác và khả năng thu hồi, điểm số nằm trong khoảng từ 0 đến 1, với 1 biểu thị hiệu suất cao nhất và 0 là thấp nhất.

Đối vớievaluate_model[], bạn sẽ cần chuyểntokenizerthành phầncủa đường dẫn,textcatthành phần và tập dữ liệu thử nghiệm của bạn:

def evaluate_model[ tokenizer, textcat, test_data: list ] -> dict: reviews, labels = zip[*test_data] reviews = [tokenizer[review] for review in reviews] true_positives = 0 false_positives = 1e-8 # Can't be 0 because of presence in denominator true_negatives = 0 false_negatives = 1e-8 for i, review in enumerate[textcat.pipe[reviews]]: true_label = labels[i] for predicted_label, score in review.cats.items[]: # Every cats dictionary includes both labels. You can get all # the info you need with just the pos label. if [ predicted_label == "neg" ]: continue if score >= 0.5 and true_label["pos"]: true_positives += 1 elif score >= 0.5 and true_label["neg"]: false_positives += 1 elif score None: # Build pipeline nlp = spacy.load["en_core_web_sm"] if "textcat" not in nlp.pipe_names: textcat = nlp.create_pipe[ "textcat", config={"architecture": "simple_cnn"} ] nlp.add_pipe[textcat, last=True] else: textcat = nlp.get_pipe["textcat"] textcat.add_label["pos"] textcat.add_label["neg"] # Train only textcat training_excluded_pipes = [ pipe for pipe in nlp.pipe_names if pipe != "textcat" ] with nlp.disable_pipes[training_excluded_pipes]: optimizer = nlp.begin_training[] # Training loop print["Beginning training"] print["Loss\tPrecision\tRecall\tF-score"] batch_sizes = compounding[ 4.0, 32.0, 1.001 ] # A generator that yields infinite series of input numbers for i in range[iterations]: print[f"Training iteration {i}"] loss = {} random.shuffle[training_data] batches = minibatch[training_data, size=batch_sizes] for batch in batches: text, labels = zip[*batch] nlp.update[text, labels, drop=0.2, sgd=optimizer, losses=loss] with textcat.model.use_params[optimizer.averages]: evaluation_results = evaluate_model[ tokenizer=nlp.tokenizer, textcat=textcat, test_data=test_data ] print[ f"{loss['textcat']}\t{evaluation_results['precision']}" f"\t{evaluation_results['recall']}" f"\t{evaluation_results['f-score']}" ] # Save model with nlp.use_params[optimizer.averages]: nlp.to_disk["model_artifacts"]

Trong phần này, bạn đã học về cách đào tạo một mô hình và đánh giá hiệu suất của nó khi bạn đào tạo nó.Sau đó, bạn đã xây dựng một hàm đào tạo mô hình phân loại trên dữ liệu đầu vào của mình.

Phân loại đánh giá

Bây giờ bạn đã có một mô hình được đào tạo, đã đến lúc kiểm tra nó so với một bài đánh giá thực tế.Đối với mục đích của dự án này, bạn sẽ viết mã một bài đánh giá, nhưng bạn chắc chắn nên thử mở rộng dự án này bằng cách đọc các bài đánh giá từ các nguồn khác, chẳng hạn như tệp hoặc API của trình tổng hợp đánh giá.

Bước đầu tiên với chức năng mới này sẽ là tải mô hình đã lưu trước đó.Trong khi bạn có thể sử dụng mô hình trong bộ nhớ, việc tải cấu phầnmô hìnhđã lưucho phép bạn tùy chọn bỏ qua hoàn toàn quá trình đào tạo mà bạn sẽ thấy sau.Đây làtest_model[]chữ ký cùng với mã để tải mô hình đã lưu của bạn:

def test_model[input_data: str=TEST_REVIEW]: # Load saved trained model loaded_model = spacy.load["model_artifacts"]

Trong mã này, bạn xác địnhtest_model[], bao gồminput_datatham số.Sau đó, bạn tải mô hình đã lưu trước đó của mình.

Dữ liệu IMDB mà bạn đang làm việc bao gồm mộtunsupthư mục trong thư mục dữ liệu đào tạo có chứa các đánh giá không được gắn nhãn mà bạn có thể sử dụng để kiểm tra mô hình của mình.Đây là một trong những đánh giá như vậy.Bạn nên lưu nó [hoặc một cái khác mà bạn chọn] trong mộtTEST_REVIEWhằng số ở đầu tệp của bạn:

import os import random import spacy from spacy.util import minibatch, compounding TEST_REVIEW = """ Transcendently beautiful in moments outside the office, it seems almost sitcom-like in those scenes. When Toni Colette walks out and ponders life silently, it's gorgeous.

The movie doesn't seem to decide
whether it's slapstick, farce, magical realism, or drama, but the best of it doesn't matter. [The worst is sort of tedious - like Office Space with less humor.] """

Tiếp theo, bạn sẽ chuyển bài đánh giá này vào mô hình của mình để tạo dự đoán, chuẩn bị cho hiển thị và sau đó hiển thị cho người dùng:

def test_model[input_data: str = TEST_REVIEW]: # Load saved trained model loaded_model = spacy.load["model_artifacts"] # Generate prediction parsed_text = loaded_model[input_data] # Determine prediction to return if parsed_text.cats["pos"] > parsed_text.cats["neg"]: prediction = "Positive" score = parsed_text.cats["pos"] else: prediction = "Negative" score = parsed_text.cats["neg"] print[ f"Review text: {input_data}\nPredicted sentiment: {prediction}" f"\tScore: {score}" ]

Trong mã này, bạn chuyển của bạninput_datavào của bạnloaded_model, điều này tạo ra một dự đoán trongcatsthuộc tính củaparsed_textbiến.Sau đó, bạn kiểm tra điểm của mỗi tình cảm và lưu điểm cao nhất trongpredictionbiến.

Sau đó, bạn lưu điểm của cảm xúc đó vàoscorebiến số.Điều này sẽ giúp dễ dàng hơn trong việc tạo đầu ra mà con người có thể đọc được, đây là dòng cuối cùng của hàm này.

Bây giờ bạn đã viếtload_data[],train_model[],evaluate_model[], vàtest_model[]các chức năng.Điều đó có nghĩa là đã đến lúc tập hợp tất cả chúng lại với nhau và đào tạo mô hình đầu tiên của bạn.

Kết nối đường ống

Cho đến nay, bạn đã xây dựng một số hàm độc lập, kết hợp với nhau, sẽ tải dữ liệu và đào tạo, đánh giá, lưu và kiểm tra bộ phân loại phân tích tình cảm bằng Python.

Có một bước cuối cùng để làm cho các hàm này có thể sử dụng được và đó là gọi chúng khi tập lệnh được chạy.Bạn sẽ sử dụngif __name__ == "__main__":thành ngữ để thực hiện điều này:

if __name__ == "__main__": train, test = load_training_data[limit=2500] train_model[train, test] print["Testing model"] test_model[]

Tại đây, bạn tải dữ liệu đào tạo của mình bằng chức năng bạn đã viết trong phầnTải và xử lý dữ liệutrước và giới hạn tổng số bài đánh giá được sử dụng2500.Sau đó, bạn đào tạo mô hình bằng cách sử dụngtrain_model[]chức năng bạn đã viết trongĐào tạo Bộ phân loại của bạnvà sau khi hoàn tất, bạn sẽ gọitest_model[]để kiểm tra hiệu suất của mô hình của mình.

Lưu ý:Với số lượng ví dụ đào tạo này, quá trình đào tạo có thể mất mười phút hoặc lâu hơn, tùy thuộc vào hệ thống của bạn.Bạn có thể giảm kích thước bộ đào tạo để có thời gian đào tạo ngắn hơn, nhưng bạn sẽ có nguy cơ có một mô hình kém chính xác hơn.

Mô hình của bạn đã dự đoán điều gì?Bạn có đồng ý với kết quả không?Điều gì xảy ra nếu bạn tăng hoặc giảmlimitthông số khi tải dữ liệu?Điểm số của bạn và thậm chí dự đoán của bạn có thể khác nhau, nhưng đây là những gì bạn nên mong đợi đầu ra của mình trông như thế nào:

$ python pipeline.py Training model Beginning training Loss Precision Recall F-score 11.293997120810673 0.7816593886121546 0.7584745762390477 0.7698924730851658 1.979159922178951 0.8083333332996527 0.8220338982702527 0.8151260503859189 [...] 0.000415042785704145 0.7926829267970453 0.8262711864056664 0.8091286306718204 Testing model Review text: Transcendently beautiful in moments outside the office, it seems almost sitcom-like in those scenes. When Toni Colette walks out and ponders life silently, it's gorgeous.

The movie doesn't seem to decide
whether it's slapstick, farce, magical realism, or drama, but the best of it doesn't matter. [The worst is sort of tedious - like Office Space with less humor.] Predicted sentiment: Positive Score: 0.8773064017295837

Khi mô hình của bạn đào tạo, bạn sẽ thấy các thước đo về mất mát, độ chính xác và thu hồi và điểm F cho mỗi lần lặp lại đào tạo.Bạn sẽ thấy sự mất mát nói chung giảm.Độ chính xác, thu hồi và điểm F đều sẽ tăng lên, nhưng lý tưởng nhất là chúng sẽ tăng lên.Sau đó, bạn sẽ thấy phần đánh giá bài kiểm tra, dự đoán cảm tính và điểm của dự đoán đó càng cao càng tốt.

Giờ đây, bạn đã đào tạo mô hình máy học phân tích cảm xúc đầu tiên của mình bằng cách sử dụng các kỹ thuật xử lý ngôn ngữ tự nhiên và mạng thần kinh với spaCy!Dưới đây là hai biểu đồ cho thấy hiệu suất của mô hình qua hai mươi lần lặp lại đào tạo.Biểu đồ đầu tiên cho thấy tổn thất thay đổi như thế nào trong quá trình đào tạo:

Trong khi biểu đồ trên cho thấy sự mất mát theo thời gian, biểu đồ dưới đây biểu thị độ chính xác, thu hồi và điểm F trong cùng một khoảng thời gian đào tạo:

Trong các biểu đồ này, bạn có thể thấy rằng mức lỗ bắt đầu cao nhưng giảm rất nhanh qua các lần luyện tập.Độ chính xác, thu hồi và điểm F khá ổn định sau vài lần lặp lại đào tạo đầu tiên.Bạn có thể mày mò những gì để cải thiện những giá trị này?

Phần kết luận

Chúc mừng bạn đã xây dựng mô hình phân tích cảm xúc đầu tiên của mình bằng Python!Bạn nghĩ gì về dự án này?Bạn không chỉ xây dựng một công cụ hữu ích để phân tích dữ liệu mà còn thu thập được rất nhiều khái niệm cơ bản về xử lý ngôn ngữ tự nhiên và học máy.

Trong hướng dẫn này, bạn đã học cách:

  • Sử dụngcáckỹ thuậtxử lý ngôn ngữ tự nhiên
  • Sử dụng bộphân loại học máyđể xác định cảm xúc của dữ liệu văn bản đã xử lý
  • Xây dựngđường ống NLPcủa riêng bạnvới spaCy

Bây giờ bạn có bộ công cụ cơ bản để xây dựng nhiều mô hình hơn để trả lời bất kỳ câu hỏi nghiên cứu nào bạn có thể có.Nếu bạn muốn xem lại những gì bạn đã học, thì bạn có thể tải xuống và thử nghiệm với mã được sử dụng trong hướng dẫn này tại liên kết bên dưới:

Lấy mã nguồn:Nhấp vào đây để lấy mã nguồn mà bạn sẽ sử dụngđể tìm hiểu về phân tích tình cảm với xử lý ngôn ngữ tự nhiên trong hướng dẫn này.

Bạn có thể làm gì khác với dự án này?Xem bên dưới để biết một số gợi ý.

Các bước tiếp theo với phân tích cảm xúc và Python

Đây là một dự án cốt lõi, tùy thuộc vào sở thích của bạn, bạn có thể xây dựng nhiều chức năng xung quanh.Dưới đây là một vài ý tưởng để giúp bạn bắt đầu mở rộng dự án này:

  • Quá trình tải dữ liệu sẽ tải mọi đánh giá vào bộ nhớ trong suốt thời gianload_data[].Thay vào đó,bạn có thể làm cho bộ nhớ hiệu quả hơn bằng cách sử dụng cácchức năng của bộ tạokhông?

  • Viết lại mã của bạn đểloại bỏ các từ dừngtrong quá trình tiền xử lý hoặc tải dữ liệu.Hiệu suất chế độ thay đổi như thế nào?Thay vào đó, bạn có thể kết hợp tiền xử lý này vào một thành phần đường ống không?

  • Sử dụng một công cụ nhưClickđể tạogiao diện dòng lệnhtương tác.

  • Triển khai mô hình của bạnlên một nền tảng đám mây nhưAWSvà chuyển một API cho nó.Điều này có thể tạo thành nền tảng của một công cụ dựa trên web.

  • Khám phá cácthông số cấu hìnhchotextcatthành phần đường ống và thử nghiệm với các cấu hình khác nhau.

  • Khám phá các cách khác nhau đểvượt qua các bài đánh giá mớiđể tạo dự đoán.

  • Tham số hóa các tùy chọnnhư nơi lưu và tải các mô hình đã đào tạo, bỏ qua đào tạo hay đào tạo một mô hình mới, v.v.

Dự án này sử dụngTập dữ liệu đánh giá phim lớn, được duy trì bởiAndrew Maas.Cảm ơn Andrew đã làm cho bộ dữ liệu được quản lý này được phổ biến rộng rãi để sử dụng.

Video liên quan

Chủ Đề