Giới thiệu
Chào mừng bạn đến với bài viết thứ hai trong loạt bài về cách cấu trúc dữ liệu không có cấu trúc để lưu trữ và làm việc với SurrealDB. Nếu bạn chưa xem bài viết đầu tiên, hãy kiểm tra nó tại đây.
Trong bài viết này, chúng ta sẽ khám phá cách sử dụng các cuốn sách lịch sử để xây dựng các biểu đồ tri thức trong SurrealDB. Đặc biệt, chúng ta sẽ tập trung vào việc phân tích những thay đổi trong quan điểm của thế giới nói tiếng Anh về một số quốc gia ở châu Âu trong thời kỳ Chiến tranh Thế giới thứ nhất.
Các cuốn sách lịch sử lựa chọn
Để tiến hành nghiên cứu này, chúng ta sẽ chọn bốn cuốn sách đại diện cho các năm trước, trong và sau chiến tranh:
- The Complete Pocket-Guide to Europe (1911) - 592 trang.
- Europe Since Napoleon (1914) - 368 trang.
- Present-day Europe: Its National States of Mind (1917) - 346 trang.
- Geographical and Industrial Studies: The New Europe (1920) - 474 trang.
Chúng ta sẽ sử dụng Archive.org để tìm kiếm và tải về các cuốn sách này dưới định dạng PDF.
Bắt đầu dự án và kiểm tra dữ liệu
Đầu tiên, chúng ta sẽ khởi tạo một dự án mới bằng cách sử dụng lệnh cargo new history
. Tiếp theo, tải về các cuốn sách và lưu chúng với tên tương ứng là 1911.pdf
, 1914.pdf
, 1917.pdf
, và 1920.pdf
. Dưới đây là các liên kết tải về:
Sau khi tải về, chúng ta sẽ sử dụng mã dưới đây để chuyển đổi các file PDF này thành các file văn bản .txt
:
rust
use std::io::Write;
fn main() {
for path in ["1911.pdf", "1914.pdf", "1917.pdf", "1920.pdf"] {
let bytes = std::fs::read(path).unwrap();
let out = pdf_extract::extract_text_from_mem(&bytes).unwrap();
let mut f = std::fs::File::create(path.replace("pdf", "txt")).unwrap();
f.write(&mut out.as_bytes()).unwrap();
println!("Đã hoàn thành {path}!");
}
}
Phân tích dữ liệu
Sau khi chuyển đổi, chúng ta sẽ sử dụng mô hình SentimentModel từ thư viện rust_bert
để phân tích tâm trạng trong các văn bản. Mô hình này sẽ cho chúng ta biết liệu các bài viết có thiên về tích cực hay tiêu cực đối với từng quốc gia.
Ví dụ về kết quả phân tích
Khi chạy mã dưới đây, chúng ta sẽ đếm số lượng kết quả tích cực và tiêu cực cho mỗi quốc gia qua các năm:
rust
use rust_bert::pipelines::sentiment::{Sentiment, SentimentModel, SentimentPolarity};
use std::fs::read_to_string;
fn main() {
let sentiment_model = SentimentModel::new(Default::default()).unwrap();
for subject in ["Germany", "France", "Russia", "Belgium", "Italy", "Austria", "Britain"] {
for path in ["1911.txt", "1914.txt", "1917.txt", "1920.txt"] {
let content = read_to_string(path).unwrap();
let res = content.lines().filter(|l| {
l.to_ascii_lowercase().contains(&subject.to_ascii_lowercase())
});
let output = sentiment_model.predict(content.clone().lines().filter(|l| {
l.to_ascii_lowercase().contains(&subject.to_ascii_lowercase())
}).collect::<Vec<&str>>());
let (positive, negative): (Vec<(&str, Sentiment)>, Vec<(&str, Sentiment)>) = res.into_iter().zip(output.into_iter()).filter(|(_, sentiment)| sentiment.score > 0.9).partition(|n| n.1.polarity == SentimentPolarity::Positive);
let positive = positive.len() as f64;
let negative = negative.len() as f64;
let ratio = positive / (positive + negative);
println!("{path} cho {subject}: tỷ lệ tích cực là {ratio:.2} (tích cực là {positive}, tiêu cực là {negative})");
}
println!();
}
}
Mô hình phân loại không cần giám sát
Ngoài mô hình SentimentModel, chúng ta cũng có thể sử dụng mô hình ZeroShotClassificationModel để xác định các tương tác giữa các quốc gia trong các văn bản. Mô hình này có khả năng phân loại các câu văn theo nhiều nhãn mà không cần huấn luyện trước.
Cách sử dụng mô hình ZeroShot
Chúng ta có thể kiểm tra xem một câu văn có thể được phân loại theo các nhãn như "Germany did something good to France" hoặc "Germany did something bad to France" hay không.
rust
fn main() {
let z = ZeroShotClassificationModel::new(Default::default()).unwrap();
z.predict_multilabel(&["Germany planned to march her armies quickly through Belgium into France and take Paris."], &[
"Germany did something good to France",
"Germany did something bad to France"],
None,
1024);
}
Kết hợp các mô hình để tạo biểu đồ tri thức
Chúng ta sẽ kết hợp các kết quả từ mô hình SentimentModel và ZeroShotClassificationModel để tạo ra các mối quan hệ trong biểu đồ tri thức của chúng ta, từ đó tạo ra các bản ghi cho việc lưu trữ trong SurrealDB.
Thực hành và tối ưu hóa
Cuối cùng, hãy nhớ rằng việc phân tích dữ liệu từ sách lịch sử để xây dựng biểu đồ tri thức là một quá trình cần thời gian và tài nguyên. Hãy kiểm tra kết quả trong SurrealDB và tiếp tục tối ưu hóa mã của bạn để có được những phân tích chính xác hơn.
Kết luận
Việc sử dụng SurrealDB để xây dựng các biểu đồ tri thức từ sách lịch sử không chỉ giúp chúng ta hiểu rõ hơn về các sự kiện trong quá khứ mà còn mở ra nhiều cơ hội phát triển trong việc xử lý dữ liệu không có cấu trúc. Hãy bắt đầu với dự án của bạn ngay hôm nay và khám phá những điều thú vị mà dữ liệu lịch sử có thể mang lại!
Câu hỏi thường gặp
- SurrealDB là gì?
SurrealDB là một cơ sở dữ liệu NoSQL có khả năng lưu trữ và truy vấn dữ liệu không có cấu trúc một cách linh hoạt và hiệu quả. - Làm thế nào để bắt đầu với SurrealDB?
Bạn có thể bắt đầu bằng cách tải về tài liệu hướng dẫn từ trang web chính thức của SurrealDB và làm theo các bước cài đặt. - Có cần kiến thức lập trình để sử dụng SurrealDB không?
Có, việc sử dụng SurrealDB yêu cầu bạn có kiến thức cơ bản về lập trình, đặc biệt là với ngôn ngữ Rust trong ví dụ này.