vnTokenizer trên PySpark
Note: This post is over 10 years old. The information may be outdated.
vnTokenizer của tác giả Lê Hồng Phương ở phiên bản thứ 3 (vn.vitk) này được build trên Apache Spark, cho phép xử lý dữ liệu lớn. vn.vitk hỗ trợ các tác vụ: Word segmentation, Part-of-speech tagging, Dependency parsing.
Tuy nhiên vn.vitk được viết trên Java và sử dụng như một công cụ command line tools, khó tùy chỉnh và sử dụng dạng programming:
./bin/spark-submit ~/vitk/target/vn.vitk-3.0.jar -m <master-url> -i <input-file> -o <output-file> -v
Trong blog này mình sẽ custom lại vn.vitk để có thể chạy như một thư viện lập trình, sử dụng ngôn ngữ python (trên PySpark và Jupyter Notebook).
Xem qua bài viết về cách sử dụng Jupyter Notebook với Apache PySpark: Chạy Apache Spark với Jupyter Notebook
PySpark sử dụng py4j để gọi trực tiếp các thư viện Spark trên Scala/Java. Vì vậy chúng ta hoàn toàn có thể import các hàm của vn.vitk trên Python.
Chú ý:
- Để custom mã nguồn của vn.vitk, clone project tại đây: https://github.com/phuonglh/vn.vitk, cài đặt trước Java và Maven
- Bạn hoàn toàn có thể sử dụng file vn.vitk-3.0.jar mình đã build sẵn tại đây mà không cần đọc các bước modified bên dưới. Sử dụng file jar này để submit vào PySpark.
1. vn.vitk.tok.Tokenizer
Với vn.vitk.tok.Tokenizer, Class này chỉ có Constructor với tham số String sparkMaster (link), địa chỉ của Spark Master. Mình muốn truyền trực tiếp Spark Context từ PySpark vào, thêm vào file vn.vitk/src/main/java/vn/vitk/tok/Tokenizer.java
public Tokenizer(JavaSparkContext _jsc, String lexiconFileName, String regexpFileName) {
jsc = _jsc;
lexicon = new Lexicon().load(lexiconFileName);
if (verbose) {
System.out.println("#(nodes of the lexicon) = " + lexicon.numNodes());
List<String> lines = jsc.textFile(regexpFileName).collect();
for (String line : lines) {
line = line.trim();
if (!line.startsWith("#")) {
// ignore comment lines
String[] s = line.split("\\s+");
if (s.length == 2) {
patterns.put(s[0], Pattern.compile(s[1]));
}
}
}
}
}
Xem file hoàn chỉnh tại đây: https://github.com/duyet/vn.vitk/.../java/vn/vitk/tok/Tokenizer.java
Build lại project bằng lệnh: mvn compile package, sau khi build thành công file vn.vitk-3.0.jar sẽ nằm trong thư mục target.
Submit PySpark và code
Submit vn.vitk-3.0.jar bằng lệnh:
export PYSPARK_DRIVER_PYTHON=ipython
export PYSPARK_DRIVER_PYTHON_OPTS="notebook --NotebookApp.open_browser=False --NotebookApp.ip='*' --NotebookApp.port=8880"
export SPARK_HOME=~/spark-1.6.2-bin-hadoop2.6 # Path to home of Spark
pyspark --master local --jars=./lib/vn.vitk-3.0.jar --driver-class-path=./lib/vn.vitk-3.0.jar
Tham khảo thêm về Notebook PySpark trong bài viết sau: Chạy Apache Spark với Jupyter Notebook
Mở Jupyter notebook trên trình duyệt và code mẫu theo notebook sau:
https://gist.github.com/duyet/e1f8122a015b300456ece1b4f92c69f1
Kết quả:
https://gist.github.com/duyet/9252f98405738ac63d5d8fd034866dac
Bạn có thể xem toàn bộ mã nguồn, input và output mẫu tại đây: https://github.com/duyet/pyspark-vn.vitk
Tham khảo
Related Posts
Spark: Convert Text (CSV) to Parquet để tối ưu hóa Spark SQL và HDFS
Lưu trữ dữ liệu dưới dạng Columnar như Apache Parquet góp phần tăng hiệu năng truy xuất trên Spark lên rất nhiều lần. Bởi vì nó có thể tính toán và chỉ lấy ra 1 phần dữ liệu cần thiết (như 1 vài cột trên CSV), mà không cần phải đụng tới các phần khác của data row. Ngoài ra Parquet còn hỗ trợ flexible compression do đó tiết kiệm được rất nhiều không gian HDFS.
Phân lớp văn bản
Trong Machine Learning và NLP, phân lớp văn bản là một bài toán xử lí văn bản cổ điển, gán các nhãn phân loại lên một văn bản mới dựa trên mức độ tương tự của văn bản đó so với các văn bản đã được gán nhãn trong tập huấn luyện.
Cài Apache Spark standalone bản pre-built
Mình nhận được nhiều phản hồi từ bài viết BigData - Cài đặt Apache Spark trên Ubuntu 14.04 rằng sao cài khó và phức tạp thế. Thực ra bài viết đó mình hướng dẫn cách build và install từ source.
Chạy Apache Spark với Jupyter Notebook
IPython Notebook là một công cụ tiện lợi cho Python. Ta có thể Debug chương trình PySpark Line-by-line trên IPython Notebook một cách dễ dàng, tiết kiệm được nhiều thời gian.