Xử lý ngôn ngữ tự nhiên là môn học kỹ sư mà các bạn theo bên Hệ thống thông tin (HTTT) hay Công nghệ phần mềm (CNPM) đều phải học. Thoạt nghe thì chúng ta chắc ai cũng nghỉ tới những công nghệ AI gì đó cao siêu, nhưng môn học này không dạy như vậy, môn học này dạy đúng bản chất thực sự gọi là xử lý ngôn ngữ tự nhiên. Các bạn sẽ được học về các bài toán cụ thể của xử lý ngôn ngữ tự nhiên và các phương pháp để giải quyết các bài toán này và thường là các phương pháp giải quyết bằng xác suất. Các bài toán cụ thể mà môn học đề cập tới như là: Tách từ tiếng Việt, gán nhãn từ loại, phân tích cú pháp, phân tích vai nghĩa, nghĩa từ vựng và phân giải nhập nhằng. Show
Nếu các bạn chưa biết thì chúng ta có một thư viện cũng khá nổi tiếng trong bài toán tách từ tiếng việt của thầy Trần Việt Trung là thư viện Pyvi, có thể nhiều bạn chưa biết hoặc cũng có thể nhiều bạn đã dùng nhưng chưa biết nó là của thầy Trung. Github của thư viện trên github của thầy Trung tại https://github.com/trungtv/pyvi. Môn học này thường sẽ thi tự luận và thường tập chung vào các dạng bài:
Tài liệu môn học:
Về bài tập lớn, bài tập lớn các bạn sẽ phải làm về xử lý ngôn ngữ tự nhiên. Nếu đề tài mà nhóm bạn chọn bạn không chắc chắn nó là một đề tài của xử lý ngôn ngữ tự nhiên hãy hỏi lại cô giáo để tránh làm lệch đề. Các bạn có thể tham khảo danh sách đề tài của cô Lê Thanh Hương TẠI ĐÂY. Các bạn có thể xem qua trang web về môn học Xử lý ngôn ngữ tự nhiên (NLP) của cô Lê Thanh Hương tại website cá nhân của cô Hương: https://users.soict.hust.edu.vn/huonglt/NLP/ Dịch từ tài liệu 言語処理100本ノック của lab Inui-Okazaki, đại học Tohoku, Nhật Bản. Người dịch: Phạm Quang Nhật Minh (minhpqn). Tham khảo thêm phiên bản cũ của tài liệu tại Chú ý: Khi sử dụng tài liệu 100 bài luyện tập xử lý ngôn ngữ tự nhiên, cần trích dẫn các nguồn sau:
Chương 1: Bài tập khởi động00. Đảo ngược xâu ký tựHãy đảo ngược xâu ký tự "stressed" (theo thứ tự từ cuối xâu đến đầu xâu ký tự). 01. Trích xuất ký tự từ xâu ký tựTừ xâu ký tự "MPyaktQrBoilk RCSahr", hãy trích xuất các ký tự ở vị trí 2,4,6,8,10,12,14,16,18,20 và kết hợp theo thứ tự đó để tạo thành 1 xâu ký tự mới (ký tự space cũng được tính, các ký tự được đánh số từ 1). 02. Kết hợp hai xâu ký tựHãy kết hợp hai xâu ký tự "Partrol" và "Car" để tạo thành xâu mới "PatrolCar". 03. Tokenize và thống kê số lượng ký tự của mỗi từ
04. Ký tự thành phần
05. n-gram
06. Tập hợp
07. Sinh ra câu từ templateViết hàm số nhận vào 3 biến x, y, z và trả về xâu ký tự "y vào lúc x giờ là z" Sinh ra kết quả với các giá trị x, y, z sau đây x="12" y="Nhiệt độ" z=22.4 08. Xâu mật mãTừ các ký tự của một xâu cho trước, cài đặt hàm có tên cipher để mã hoá xâu như sau:
Sử dụng hàm đã viết để mã hoá và giải mã các xâu ký tự tiếng Anh. 09. TypoglycemiaCho đầu vào là một câu tiếng Anh bao gồm các word ngăn cách nhau bằng ký tự space. Viết chương trình thực hiện việc sau:
Chương 2: Các lệnh cơ bản trên môi trường UnixCác bài tập trong chương này sử dụng dữ liệu trong file hightemp.txt. File này bao gồm các bản ghi nhiệt độ cao nhất ở Nhật Bản. Mỗi bản ghi bao gồm 3 cột "Tỉnh", "Địa điểm", "Nhiệt độ" (độ C), và ngày tháng đo. Các cột dữ liệu được phân cách bằng ký tự tab. Viết các chương trình thực hiện các nhiệm vụ trong các bài tập dưới đây. Sau đó, chỉ sử dụng các lệnh trong unix để thực hiện các nhiệm vụ đó và xác nhận xem kết quả của chương trình bạn viết có giống với kết quả các lệnh unix đưa ra hay không. 10. Đếm số dòng trong fileĐếm số dòng trong file. Xác nhận kết quả bằng lệnh wc trong unix. 11. Biến đổi các ký tự tab thành spaceChuyễn mỗi ký tự tab thành ký tự space. Xác nhận kết quả lần lượt bằng các lệnh sed, tr, và expand. 12. Lưu cột 1 vào file col1.txt, cột 2 vào file col2.txtTrích xuất nội dung trong cột 1, cột 2 và lưu vào các file tương ứng: col1.txt và col2.txt. Thử thực hiện công việc chỉ dùng lệnh cut trong unix. 13. Trộn hai file col1.txt và col2.txtKết hợp nội dung trong 2 file col1.txt và col2.txt để tạo thành một file mới có nội dung giống với cột 1 và cột 2 trong file ban đầu (các cột cách nhau bởi ký tự tab). Sử dụng lệnh paste để thực hiện bài tập và xác nhận kết quả của chương trình bạn viết. 14. Trích xuất ra N hàng đầu tiên của fileViết chương trình trích xuất ra N hàng đầu tiên của file. Biến số dạng dòng lệnh là số tự nhiên N. Sử dụng lệnh head trong unix để thực hiện công việc. 15. Trích xuất ra N hàng cuối cùng của fileViết chương trình trích xuất ra N hàng cuối cùng của file. Chương trình nhận đầu vào từ dòng lệnh là số tự nhiên N. Sử dụng lệnh tail trong unix để thực hiện công việc. 16. Chia file thành N phầnChia file thành các files nhỏ với N lines mỗi file (đơn vị là các hàng trong file). Chương trình nhận đầu vào từ dòng lệnh là số tự nhiên N. Sử dụng lệnh split để thực hiện công việc (split -l N). Sau đó, cải tiến chương trình để chia file thành thành N phần bằng nhau (thay vì N lines mỗi file). 17. Đưa ra các các xâu ký tự duy nhất (unique) trong cột 1Đưa ra các xâu ký tự duy nhất trong cột 1 của file. Sử dụng lệnh cut, sort, uniq để thực hiện nhiệm vụ. 18. Sắp xếp các hàng theo thứ tự giảm dần của giá trị (numeric value) của cột thứ 3Viết chương trình thực hiện nhiệm vụ trên. Dùng lệnh sort để xác nhận (trong bài tập này, kết quả của chương trình của bạn với lệnh sort có thể khác nhau do có thể có các giá trị giống nhau trong cột thứ 3). 19. Sắp xếp theo tần suất xuất hiệnĐưa ra tần suất xuất hiện của các giá trị trong cột 1; sắp xếp các giá trị trong cột 1 theo thứ tự từ cao đến thấp của tần suất xuất hiện. Chỉ dùng lệnh cut, uniq, sort để thực hiện nhiệm vụ. Chương 3: Biểu thức chính quy (regular expressions)Bài tập trong chương 3 sử dụng file jawiki-country.json.gz. File này lưu trữ các tài liệu Wikipedia và có định dạng sau đây.
Lập trình để xử lý các việc sau đây. 20. Đọc vào dữ liệu JSONĐọc dữ liệu từ file JSON chứa các tài liệu Wikipedia, trích xuất & hiển thị nội dung của tài liệu (trường text của JSON object) có liên quan đến "イギリス" (có nghĩa là nước Anh). Sử dụng các nội dung của tài liệu được trích xuất này để thực thi các nhiệm vụ trong các bài tập từ 21-29. 21. Trích xuất các dòng có chứa tên đề mụcTrong các tài liệu, trích xuất các dòng có chứa tên đề mục (category name hay カテゴリ名). 22. Trích xuất các tên đề mục (Category name)Trích xuất tên đề mục của trong các tài liệu. Trong bài tập này, cần trích xuất chính xác các tên đề mục chứ không phải dòng chứa tên đề mục. 23. Cấu trúc của các SectionHiển thị tên của các section và level của các section trong các tài liệu Wikipedia (Ví dụ với section == Section Name ==" thì level bằng 1) 24. Trích xuất các liên kết fileTrích xuất toàn bộ các liên kết đến các media files trong tài liệu. 25. Trích xuất templatesTrích xuất vị trí và tên các folder có template "基礎情報" trong tài liệu. Lưu kết quả trong các đối tượng dictionary. Tham khảo về templates tại đây. 26. Loại bỏ các emphasis markupsTrong khi làm các xử lý ở bài tập 25, xoá các emphasis markup (italic, bold, both) từ vị trí của các templates và biến đổi thành plain text. (Tham khảo về các loại markup tại Wiki markup, bảng tham khảo bằng tiếng Nhật tại マークアップ早見表). 27. Xoá các link đến các trang Wikipedia khácNhiệm vụ giống như bài 26 và thêm vào xử lý sau. Xoá các markups của liên kết đến các trang Wikipedia khác từ các templates được trích xuất và biến đổi thành dạng text. (Tham khảo về các loại markup tại Wiki markup, bảng tham khảo bằng tiếng Nhật tại マークアップ早見表). 28. Xoá các markup trong văn bảnThêm vào xử lý ở bài 27. Xoá các markup trong các templates càng nhiều càng tốt và in ra các thông tin cơ bản về quốc gia. 29. Lấy ra các URL của quốc kỳSử dụng nội dung của các template và lấy ra URl đến quốc kỳ (国旗画像のURL). Hint: Gọi API imageinfo của MediaWWiki, biến đổi các file references thành URL. Chương 4: Morphological Analysis trong tiếng Nhật (形態素解析)Download file neko.txt là nội dung bằng plain text của cuốn tiểu thuyết "吾輩は猫である" của nhà văn 夏目漱石 (Soseki Natsume). Sử dụng package MeCab để thực hiện "morphological analysis" (Tham khảo trang tiếng Nhật tại đây). Lưu kết quả vào file neko.txt.mecab. Sử dụng file kết quả để thực hiện các công việc ở các bài tập dưới đây. Chú ý: Trong các bài tập 37, 38, 39 có thể sử dụng các phần mềm matplitlib hoặc Gnuplot. @All: Với các bạn không quen xử lý text tiếng Nhật, có thể dùng một file text tiếng Anh và thực hiện POS tagging, sau đó làm các bài tập dưới đây. 30. Đọc vào kết quả morphological analysisViết chương trình đọc vào kết quả morphological analysis (file neko.txt.mecab). Yêu cầu: Với mỗi morpheme, lưu các thông tin: 表層形 (surface form), 基本形 (base form), 品詞 (pos), 品詞細分類1 (pos1) bằng cấu trúc dữ liệu hash map với các key tương ứng là: surface, base, pos, pos1. Lưu trữ mỗi câu bằng danh sách của các morpheme. Trong các bài tập còn lại trong chương 4, hãy sử dụng cách tổ chức dữ liệu trong bài 30 này. 31. Động từTrích xuất tất cả các surface forms của động từ (pos=動詞). 32. Dạng nguyên thể của động từ (動詞の原形)Trích xuất tất cả dạng nguyên thể của động từ (base form). 33. Danh từ dạng サ (サ変名詞)Trích xuất toàn bộ các danh từ dạng サ (サ変名詞). Tham khảo trang Wikipedia tiếng Nhật về サ行変格活用. 34. 「AのB」Trích xuất tất cả các danh từ ghép (compound nouns) gồm 2 danh từ kết nối bằng の. 35. Trích xuất các kết nối danh từ (noun connections hay 名詞の連接)Trích xuất tất cả các noun connections (các danh từ đứng cạnh nhau liên tiếp). Khi trích xuất, chú ý trích xuất chuỗi danh từ matching dài nhất có thể. Ví dụ ABC trong đó A, B, C là danh từ thì phải trích xuất ABC thay vì AB. 36. Tần suất xuất hiện của từLập trình tính tần suất xuất hiện của từ trong văn bản. Đưa ra các từ theo thứ tự giảm dần của tần suất xuất hiện. 37. Top 10 từ xuất hiện nhiều nhấtVẽ đồ thị (ví dụ bar graph) của tần suất xuất hiện của 10 từ xuất hiện nhiều nhất trong văn bản. 38. HistogramVẽ đồ thị histogram tần suất xuất hiện của các từ. Trục ngang là tần suất xuất hiện. Trục dọc là các từ. 39. Luật ZipfVẽ đồ thị với trục ngang là rank của các từ theo tần suất xuất hiện (cao đến thấp), trục dọc là tần suất xuất hiện của các từ. Chương 5: Dependency parsing (係り受け解析)Thực hiện phân tích cấu trúc ngữ pháp (dependency parsing) bằng công cụ CaboCha cho file neko.txt và lưu kết quả vào file neko.txt.cabocha. Sử dụng file kết quả này làm đầu vào cho các bài tập dưới đây. 40. Đọc vào kết quả dependency parsing (theo morphemes)Cài đặt lớp Morph cho các morphemes. Lớp này có các biến thành phần (member variables) là surface (cho surface forms của morphems), base (cho base form), pos (cho POS tag), pos1 (cho detailed POS tag 1 品詞細分類1). Sau đó đọc vào kết quả phân tích dependency parsing trong file neko.txt.cabocha. Mỗi câu sẽ bao gồm một danh sách các Morph objects. Hiển thị danh sách các morphemes cho câu thứ 3 trong văn bản. 41. Đọc vào kết quả dependency parsing (theo chunks và depedency relations)Tiếp theo bài 40, cài đặt lớp Chunk để lưu trữ các chunk (hay bunsetsu (文節)). Lớp này có các biến thành phần là:
Sau đó, đọc vào kết quả dependency parsing. Mỗi câu sẽ bao gồm danh sách của các Chunk objects. Hiển thị xâu ký tự và giá trị của biến dst của các chunk trong câu thứ 8 của file đầu vào. Các bài tập còn lại trong chương 5 sẽ sử dụng các chương trình được tạo ra trong bài tập 40 và 41. 42. Hiển thị chunk nguồn (head) và chunk đích (modifier) trong các depedency relationsHiển thị nội dung (dạng text) các chunk nguồn (head) và chunk đích (modifier) trên mỗi dòng và cách nhau bởi ký tự tab. Chú ý không hiển thị các dấu (punctuation marks) trong các chunk. 43. Trích xuất các dependency relations giữa các chunk chứa danh từ và các chunk chứa động từTrích xuất các dependency relations giữa các chunk chứa danh từ và các chunk chứa động từ. In ra theo định dạng tab. Tương tự như bài 42, không hiển thị các dấu (punctuation marks) trong các chunk. 44. Visualize cây dependencyVisualize dependency trees của một câu cho trước. Khi visualize, biến các dependency trees theo ngôn ngữ DOT, hay sử dụng Graphviz. Nếu sử dụng Python, có thể hiển thị đồ thị có hướng bằng thư viện/package pydot. 45. Trích xuất các verb case patternsYêu cầu của bài tập này là tìm hiểu (investigate) về case frame trong tiếng Nhật sử dụng dữ liệu trong file đầu vào neko.txt. Coi các động từ là vị ngữ (predicate), các trợ từ (như が,を,...) của chunk liên với với động từ là các case, hãy in ra các động từ và các "case" theo định dạng cách nhau bởi ký tự tab. Output của chương trình cần thoả mãn các điều kiện sau:
Xem xét ví dụ sau: 「吾輩はここで始めて人間というものを見た」(câu thứ 8 trong file neko.txt.cabocha). Câu này gồm hai động từ 始める và 見る. Nếu trong kết quả phân tích cú pháp, động từ 始める liên kết với chunk ここで, động từ 見る liên kết với với chunk 吾輩は và ものを, chương trình sẽ in ra: Lưu output của chương trình ra file, xác nhận các mục sau chỉ với các lệnh của Unix.
Tham khảo về case frame structures trong tiếng Nhật tại đây (Kawahara et al., 2010). 46. Trích xuất thông tin của case frames của các động từChỉnh sửa bài tập 45, trích xuất thêm các chunks mà các vị ngữ (predicate) liên kết tới. In ra theo định dạng tab. Ngoài các điều kiện đưa ra ở bài tập 45, output phải thoả mãn các điều kiện sau.
Xem xét ví dụ sau: 「吾輩はここで始めて人間というものを見た」(câu thứ 8 trong file neko.txt.cabocha). Câu này gồm hai động từ 始める và 見る. Nếu trong kết quả phân tích cú pháp, động từ 始める liên kết với chunk ここで, động từ 見る liên kết với với chunk 吾輩は và ものを, chương trình sẽ in ra: 47. Mining các cấu trúc câu có động từ chức năng(cấu trúc này có tên tiếng Nhật là 機能動詞構文) Bài tập này tập trung vào các case frame を của các động từ, trong đó động từ có dạng liên kết サ変接続名詞. Cải tiến bài tập 46 để thoả mãn các yêu cầu sau đây.
Ví dụ, cho câu sau. 「別段くるにも及ばんさと、主人は手紙に返事をする。」. Chương trình sẽ in ra kết quả sau.
Lưu kết quả của bài tập 47 ra file, chỉ sử dụng lệnh unix để xác nhận:
48. Trích xuất ra dependency path từ các danh từ đến gốcChương trình yêu cầu trích xuất ra depedency path từ các chunk có chứa danh từ đến root của cây depedency. Các dependency path phải thoả mãn yêu cầu sau đây.
Ví dụ, đầu ra cho câu ví dụ 「吾輩はここで始めて人間というものを見た」(câu thứ 8 trong file neko.txt.cabocha) như sau:
49. Trích xuất ra chuỗi liên kết giữa các danh từTrích xuất dependency path ngắn nhất liên kết giữa các noun chunk. Đối với cặp noun chunk với index tương ứng là i và j (i < j), các dependency paths thoả mãn các yêu cầu sau.
Thêm nữa, các dependency path trong bài tập này có thể được diễn dịch như sau.
Ví dụ, kết quả đưa ra cho câu ví dụ 「吾輩はここで始めて人間というものを見た」(câu thứ 8 trong file neko.txt.cabocha) như sau:
Chương 6: Xử lý văn bản tiếng AnhCài đặt các chương trình xử lý văn bản tiếng Anh (nlp.txt). 50. Tách câu (Sentence segmentation)Sử dụng patterns (. or ; or : or ? or !) 51. Tách từCoi ký tự trắng (space) là ký tự phân tách các từ. Lấy đầu ra của bài 50 làm đầu vào, trích xuất các từ trong các câu và in ra theo định dạng: mỗi dòng 1 từ. In ra dòng trắng để đánh dấu kết thúc câu. 52. StemmingĐầu vào là đầu ra của bài tập 51, áp dụng thuật toán Porter stemming để lấy ra gốc của các từ (stem). In ra các từ và stem cách nhau bởi ký tự tab. Nếu bạn sử dụng Python, bạn có thể sử dụng module stemming. 53. TokenizationSử dụng tool Stanford Core NLP để phân tích văn bản đầu vào và lấy ra output theo định dạng XML. Sau đó đọc vào đầu ra XML và trích xuất ra các token (word) theo định dạng mỗi word trên 1 dòng. 54. POS TagĐọc vào kết quả phân tích dạng XML của Stanford Core NLP. Trích xuất ra word, lemma, POS tag và in ra các thuộc tính của mỗi word trên một dòng; các thuộc tính cách nhau bởi dấu tab. 55. Trích xuất named entitiesTrích xuất tất cả các named entities trong văn bản đầu vào. 56. Phân tích coreferenceDựa trên kết quả phân tích coreference của Stanford Core NLP, thay thế các mention bằng representative mention. Chú ý khi thay thế các mention bằng representative mention, lưu lại các mention gốc trong dấu ngoặc theo định dạng representative mention (mention). 57. Phân tích cấu trúc dependencyTừ kết quả phân tích dependency của Stanford Core NLP (collapsed-dependencies), visualize câu đầu vào bằng đồ thị có hướng. Khi visualize các dependency trees, có thể sử dụng ngôn ngữ DOT, hay sử dụng Graphviz. Nếu sử dụng Python, có thể hiển thị đồ thị có hướng bằng thư viện/package pydot. 58. Trích xuất tuplesTừ kết quả phân tích dependency của Stanford Core NLP (collapsed-dependencies), trích xuất các bộ 3 [Subject, Predicate, Purpose] và in ra các bộ 3 này (các thành phần cách nhau bởi ký tự tab). Subject, Predicate, Purpose được xác định dựa vào các tiêu chuẩn sau:
59. Phrase structure analysisTừ kết quả phân tích cây cú pháp phrase structure (theo định dạng S-expression), in ra tất cả các noun phrases trong văn bản. Chú ý, cần in ra cả các noun phrases nằm trong các noun phrases khác (nested NP). Chương 7: DatabaseFile artist.json.gz là file nén lưu trữ thông tin về các artist trong cơ sở dữ liệu mở MusicBrainz. Các thông tin về các artist được lưu trữ ở định dạng JSON, mỗi dòng lưu thông tin về một artist. Các trường thông tin (field) của file JSON như sau. Field Nội dung Format Ví dụ id id của artist Integer 20660 gid global id String "ecf9f3a3-35e9-4c58-acaa-e707fba45060" name Tên artist String "Oasis" sort_name Teen artist (dùng để sắp xếp) String "Oasis" area Khu vực hoạt động String "United Kingdom" aliases Các Tên khác Dictionary aliases[].name Tên khác String "Oasis" aliases[].sort_name Tên khác (dùng để sắp xếp) String "Oasis" begin Ngày bắt đầu hoạt động Dictionary begin.year Năm bắt đầu hoạt động Integer 1991 begin.month Tháng bắt đầu hoạt động Integer begin.date Ngày bắt đầu hoạt động Integer end Ngày dừng hoạt động Dictionary begin.year Năm dừng hoạt động Integer 2009 begin.month Tháng dừng đầu hoạt động Integer begin.date Ngày dừng hoạt động Integer tags Tag List các Dictionary objects tags[].count Số tag Integer 1 tags[].value Nội dung tag String "rock" rating Rating Dictionary rating.count Số phiếu bình chọn Integer 13 rating.value Giá trị bình chọn (trung bình) Integer 86 Hãy suy nghĩ phương pháp lưu trữ, tìm kiếm dữ liệu trong file artist.json.gz bằng các database Key-Value-Store (KVS) hay document-oriented database. Với KVS database, có thể sử dụng LevelDB, Redis, KyotoCabinet. Với document-oriented database, có thể sử dụng MongoDB, CouchDB hoặc RethinkDB. 60. Tạo KVS databaseĐể giúp cho việc tìm kiếm các trường (fields) từ name đến area của dữ liệu, hãy sử dụng Key-Value-Store (KVS) để lưu trữ dữ liệu. 61. Tìm kiếm với KVSSử dụng cơ sở dữ liệu đã tạo ra trong bài tập 60, tìm kiếm khu vực hoạt động (area) của một artist cho trước. 62. Xử lý kiểu vòng lặp trong KVSSử dụng cơ sở dữ liệu đã tạo ra trong bài tập 60, hãy đưa ra số artist có khu vực hoạt động (area) là Japan. 63. Lưu trữ các objects (đối tượng) trong KVSSử dụng KVS, hãy tạo ra database cho việc tìm kiếm các trường từ name đến tag và số lượng tag. Thử tìm kiếm các trường từ name đến tag và số lượng tag với database đã tạo ra. 64. Tạo MongoDBHãy lưu thông tin của artist (artist.json.gz) vào cơ sở dữ liệu MongoDB. Thêm nữa, hãy tạo indexes với các trường sau: name, aliases.name, tags.value, rating.value. 65. Tìm kiếm trong cơ sở dữ liệu MongoDBSử dụng interactive shell của MongoDB, đưa ra các thông tin liên quan đến artist có tên "Queen". Tiếp theo, cài đặt chương trình thực hiện chức năng đó. 66. Lấy số kết quả tìm kiếmSử dụng interactive shell của MongoDB, tính số lượng các artist có khu vực hoạt động (area) là "Japan." 67. Đưa ra multiple documentsTìm kiếm các artist có aliases cho trước. 68. Sắp xếpTrong số các artist có tag "dance", lấy ra top 10 artist có số phiếu bình chọn cao nhất. 69. Tạo Web applicationTạo ứng dụng Web cho phép người dùng nhập vào các điều kiện tìm kiếm và hiển thị các artist phù hợp với điều kiện tìm kiếm. Các điều kiện tìm kiếm bao gồm: tên artist (name), aliases, tag, etc. Hiển thị thông tin các artist (theo dòng) theo thứ tự từ cao tới thấp của lượng rating. Chương 8: Machine LearningChương này yêu cầu bạn thực hiện bài toán sentiment analysis trên corpus sentence polarity dataset v1.0 trong Moview Review Data của tác giả Bo Pang và Lillian Lee. Yêu cầu của bài toán sentiment analysis là phân loại các câu thành positive và negative sentiments. 70. Download và tiền xử lý dữ liệuSử dụng dữ liệu liên quan đến sentiment polarity của các câu (download tại đây), tạo dữ liệu chuẩn hoá (sentiment.txt) theo hướng dẫn dưới đây.
Sau khi đã thu được file sentiment.txt, xác nhận số lượng các câu với positive polarity và các câu với negative polarity. 71. StopwordsTạo ra danh sách các stopwords trong tiếng Anh. Sau đó viết 1 hàm để kiểm tra một từ có thuộc danh sách stopwords hay không. Hàm sẽ trả về giá trị TRUE nếu từ cho trước thuộc danh sách stopwords. Ngược lại hàm sẽ trả về giá trị FALSE. Sau đó viết mô tả về các test cho hàm đã viết. 72. Trích xuất đặc trưngTự thiết kế các đặc trưng cho bài toán sentiment analysis. Sau đó trích xuất đặc trưng từ dữ liệu training. Hint: phương pháp trích xuất đặc trưng đơn giản nhất là sử dụng từ gốc (stem) các từ không trong danh sách các stopwords. Phương pháp này có thể sử dụng để làm hệ thống baseline. 73. TrainingTraining model bằng phương pháp logistics regressions sử dụng các đặc trưng tạo ra trong bài 72. 74. PredictionSử dụng mô hình logistics regressions đã huấn luyện trong bài 73, hãy viết chương trình dự đoán polarity cho một câu đầu vào và tính xác suất cho các nhãn (+1, -1). 75. Trọng số của các features (Feature weights)Trong mô hình logistics regression đã huấn luyện trong bài 73, đưa ra top 10 các features có trọng số cao nhất và top 10 các features có trọng số thấp nhất. 76. Dự đoán trên dữ liệu trainingSử dụng mô hình đã học trong bài 73 để đưa ra dự đoán trên dữ liệu training. Đưa ra nhãn gốc, nhãn dự đoán, và xác suất của nhãn dự đoán cho mỗi câu trong dữ liệu (cách nhau bởi ký tự tab). 77. Tính độ chính xác của mô hìnhSử dụng đầu ra của bài 76, tính accuracy cho toàn bộ dữ liệu; precision, recall, F1 cho nhãn +1. 78. 5-fold cross validationVì các thực nghiệm trong bài 76, 77 đánh giá model trên dữ liệu huấn luyện nên khó có thể nói đó là các đánh giá hợp lý. Các đánh giá này chỉ đánh giá khả năng mô hình "fit" với dữ liệu training chứ không đánh giá khả năng khái quát (generalization) của mô hình. Vì thế bài tập 78 yêu cầu bạn đánh giá mô hình sử dụng 5-fold cross validation. Đưa ra accuracy, precision, recall, F1 score cho 5-fold cross validation (tính trung bình của 5 folds). 79. Vẽ đồ thị precision-recallVẽ đồ thị precision-recall theo sự thay đổi của giá trị threshold trong mô hình logistic regression. Chương 9: Không gian vector (I)File enwiki-20150112-400-r10-105752.txt.bz2 là file nén dạng bzip2 của 105752 file text được lấy mẫu ngẫu nhiên (tỷ lệ 1/10) từ các bài báo trên Wikipedia có trên 400 từ. Các bài báo trên Wikipedia được lấy vào ngày 12 tháng 1 năm 2015. |