เรื่องการเรียกใช้ package ใน package อีกทีของภาษา Wolfram

พอดีกำลังรับงานพัฒนาโมเดลตัวหนึ่งด้วยภาษา Wolfram แล้วเจอปัญหาเรื่องการเรียกใช้ Package ในอีก Package หนึ่ง code ที่เขาส่งมาให้ช่วยดูให้มันมีการเรียกใช้ package ตั้งแต่คำสั่ง BeginPackage เช่น

BeginPackage[ "Package`", {"Package1`", "Package2`"}]
  ...

แต่ปรากฏว่าหลังจากที่ทำการ deploy ไปแล้ว เจอว่ามันมีการคำนวณอะไรบางอย่างผิด ทั้งที่ในตัว unit test ก็ไม่เจอ ผมก็นั่งไล่ดูทีล่ะบรรทัดจนพบว่ามันมีการเขียนทับ functions กัน เพราะชื่อดันเหมือนกัน

ผมก็เลยเปลี่ยนวิธีการเรียก packages ด้วย Needs ไปใช้วิธีเรียกทีล่ะตัวหลังคำสั่ง BeginPackage แทน เช่น

BeginPackage[ "Package`"]
  Needs[ "Package1`"]
  Needs[ "Package2`"]
  ...

ด้วยวิธีนี้ตัว คำสั่งจาก package1 หรือ package2 จะถูกเรียกใช้ได้ภายใน package แต่ด้านนอก package จะเรียกไม่ได้ พูดง่ายๆคือไม่มีผลอะไรกับตัวแปรนอก package

RLongLexTo แบ่งคำภาษาไทยใน R

จาก http://wp.me/p1rsA6-pn

ผมเอา code ที่เขียนมาทำเป็น r-package แล้วเรียกมันว่า RLongLexTo (https://github.com/slphyx/RLongLexTo) ครับเผื่อว่าใครอยากเอาไปพัฒนาต่อ  เบื้องต้นนี้ผมทดสอบเฉพาะสำหรับใช้งานบนวินโดว์ 10 เท่านั้น

วิธีติดตั้ง

*RLongLexTo ต้องการบางคำสั่งจาก package rJava ครับ ดังนั้นผู้ใช้ก็ต้องลง rJava ก่อนครับ

library(rJava)
library(devtools)
install_github("slphyx/RLongLexTo", INSTALL_opts="--no-multiarch")

##คำแนะนำสำหรับผู้ที่ลง rJava แล้วมีปัญหาใช้RLongLexToไม่ได้ ผมแนะนำให้ลง java JDK (http://www.oracle.com/technetwork/java/javase/downloads/index.html) หรือไม่ก็ลองดูเรื่อง PATH ของ Java ก่อนครับ

ใน RLongLexTo นี้จะมีคำสั่งหลักคือ RLongLexToC ที่จะทำการรับข้อความภาษาไทยมาเพื่อทำการแบ่งคำ

วิธีการใช้งาน

RLongLexToC("ข้อความที่ต้องการแบ่งคำ")

หากมีปัญหาเรื่องการแสดงผลภาษาไทยก็ให้ลองเซ็ตlocaleเป็นภาษาไทยก่อนใช้งานอีกทีครับ

Sys.setlocale(locale="Thai")

rlonglexto3

มีหลายคนเมล์มาสอบถามเรื่องการเอา RLongLexTo ไปใช้พร้อมกับถามเรื่องรายละเอียดของอัลกอรึทึ่มด้วย ซึ่งผมก็อยากบอกตรงนี้เลยนะครับว่าผมไม่รู้เรื่องหรอกครับ  ผมเพียงแต่เอา code ต้นฉบับมาดัดแปลงให้ใช้ใน R ตามที่มีคนถามมาและผมก็ว่างทำให้ดูเป็นตัวอย่างเท่านั้นครับ

ส่วนตัวแล้วผมอยากจะบอกว่าคำสั่งสำหรับจัดการเรื่องข้อมูลประเภท string จาก package ชื่อ stringr หรือ stringi ครับ ก็มีเรื่องการแบ่งคำก็เช่นกันครับ  เช่น stringr มีคำสั่งช่วยเรื่องแบ่งคำอยู่แล้วซึ่งใช้ได้กับภาษาไทยด้วย ตัวอย่างเช่น str_split เป็นคำสั่งจาก stringr ที่เราสามารใช้แยกstring ให้ได้เพียงแค่บอกว่าจะแยกเป็นคำหรือเป็นประโยค

ลองไปดูเพิ่มเติมที่ http://stringr.tidyverse.org/ ครับ

จริงๆแล้ว stringr ก็เขียนมาจาก stringi เพื่อทำให้ใช้ง่ายขึ้น โดยที่ stringi นี้ก็คือ wrapper ของ ICU library ครับ ซึ่งICUนี้มีความสามารถในการแบ่งคำภาษาไทยด้วย (ต้องขอบคุณผู้ที่พัฒนานี้จริงๆ) ICU มี demo ให้ทดลองใช้งานด้วยครับที่ http://demo.icu-project.org/icu-bin/icusegments

ตัว RLongLexTo มันก็ยังมีข้อดีอยู่บ้างครับ เพราะตัวมันเองใช้ dictionary พจนานุกรมเป็นตัวช่วยในการแบ่งคำ นั่นก็หมายความว่าผู้ใช้สามารถที่จะปรับแต่งหรือเพิ่มเติมคำได้ตามที่ต้องการเลย และใน RLongLexTo นี้ผมใส่ตัวแปรชื่อ path.dic ไว้สำหรับใช้กับพจนานุกรมของผู้ใช้เอง ซึ่งผู้ใช้สามารถที่จะ download พจนานุกรมจากเวบของ Lexitron มาแก้ไขดัดแปลงเองหรือจะเพิ่มจากที่ผมเตรียมไว้แล้วกับแพคเกจนี้ครับ

แบ่งคำภาษาไทยใน R ด้วย LexTo

มีคนส่งข้อความมาว่าให้ช่วยทำให้ดูหน่อยว่าจะเอาโปรแกรมตัดคำภาษาไทย http://www.sansarn.com/lexto/ ซึ่งเขียนด้วยภาษา Java โดย Choochart Haruechaiyasak มาใช้ใน R ได้อย่างไร
ด้วยความที่เห็นว่าผู้ถามเป็นหญิง แถมส่งการ์ตูนมาด้วยว่าร้องไห้หนักมาก ไอ้เราก็เป็นคนใจอ่อนด้วยสิ เลยทำให้ดูแบบคร่าวๆตามนี้ครับ
R สามารถที่เรียกโปรแกรมที่เขียนด้วย Java มาใช้ใน R หมายถึงมีการส่งผ่านค่าหรือรับค่าต่างๆจากโปรแกรมนั้นได้โดยใช้คำสั่งที่อยู่ในpackageอย่าง rJava ครับรายละเอียดก็ไปหาอ่านเอาเองนะครับ
โปรแกรม LexTo ที่ให้โหลดกันนั้นจะมีfunction main อยู่ในไฟล์ LongLexTo.java ครับ ผมก็แก้ไขอะไรบางอย่าง(จำไม่ได้ ต้องเปิดดู) หลักๆก็วิธีที่เขียนผลลัพท์ออกมา แล้วก็คอมไพล์ใหม่ซึ่งเราก็จะได้เป็น .class มาครับ

ส่วนอันนี้ก็เป็น code ที่เขียนเพื่อเรียกใช้ function main ของโปรแกรม LongLexTo ที่คอมไพล์แล้วครับ
library(rJava)

.jinit()
.jaddClassPath(“D:\\works\\LongLexTo\\R”) # replace with the path to the folder containing LongLexTo class file
.jclassPath()

# export the input string to a text file
writeinput<-function(inputstring){
inputfile<-file(“RLongLexToinput.txt”)
writeLines(inputstring,inputfile,useBytes=T)
close(inputfile)
}

## call the main function in LongLexTo
RLongLexToF<-function(inputfilename,outputfilename){
J(‘LongLexTo’,’main’,c(inputfilename,outputfilename))
}

RLongLexToC<-function(inputtext){
writeinput(inputtext)
inputfilename <- “RLongLexToinput.txt” # input file
outputfilename <- “RLongLexTotemp.txt” # temp output file
RLongLexToF(inputfilename,outputfilename)
outtxt<-as.vector(strsplit(readLines(outputfilename,encoding=”UTF-8″),”[|]”)[[1]])
outtxt
}

setwd(“D:\\works\\LongLexTo\\R”) # set the path to your dictionary file

ผลที่ได้ก็ประมาณนี้ครับ

RLexLongTo

ผมลองกับข้อความแบบต่างๆแล้วรู้สึกว่าจะมีปัญหาเรื่อง encoding อยู่ครับ ต้องขอให้ผู้ที่รู้เรื่องทางด้านนี้หรือใครก็ตามที่อยากปรับปรุงให้มันดีขึ้นมาช่วยแล้วล่ะครับ

ผมทำเป็น R package แล้วที่ https://github.com/slphyx/RLongLexTo

ลองดูเพิ่มเติมที่นี่อีกครับ

ส่วนตัวแล้วผมอยากจะบอกว่าคำสั่งสำหรับจัดการเรื่องข้อมูลประเภท string จาก package ชื่อ stringr หรือ stringi ครับ ก็มีเรื่องการแบ่งคำเช่นกันครับ  เช่น stringr มีคำสั่งช่วยเรื่องแบ่งคำอยู่แล้วซึ่งใช้ได้กับภาษาไทยด้วยอย่าง str_split ที่เราสามารใช้แยก string ให้ได้เพียงแค่บอกว่าจะแยกเป็นคำหรือเป็นประโยค

##

ผมเขียนpackageสำหรับแบ่งคำโดยใช้ LexTo อีกตัวครับเรียกมันว่าอะไรวะ https://github.com/slphyx/araiwa เป็นตัวอย่างแบบง่ายที่ผมใช้สอนเรื่องการใช้.net ในR ครับ

ติดตั้ง R package เพิ่มใน RLink

ใครที่ใช้ R ผ่าน RLink ของ Mathematica 9.0 บน Windows สามารถที่จะติดตั้ง R package ตัวที่ต้องการได้โดยเพียงพิมพ์

REvaluate[“install.packages(\” ชื่อ package ที่ต้องการ “\)”]

มันจะมี windows อันหนึ่ง popup ขึ้นมาให้เราเลือก mirror host สำหรับ download ไฟล์ package

เวลาเรียกใช้ก็เหมือนใน R เลยครับ เช่น

REvaluate[“{

library(ชื่อ library)

blah

blah ..

}”]

 

🙂

 

 

 

ใช้ Mathematica ช่วยในการตรวจสลากกินแบ่งรัฐบาลครับ

วิธีการก็คือดึงเอาภาพจากเวบของกองสลากมาครับ

dat = Import[“http://www.glo.or.th/detail.php?link=result_image”, {“Source”}];
date = StringCases[dat, “option” ~~ __ ~~ “select”];
datels = StringCases[date, “value” ~~ __ ~~ “.gif” ~~ __ ~~ “select”];
pics = (StringReplace[#, {“” -> “,”, “” -> “”}] & /@ StringSplit[datels[[1]], “\n”][[1]]);
pics = pics[[2 ;; Length@pics – 1]];

filenamels = StringCases[#, __ ~~ “.gif”][[1]] & /@ pics;
datethls = StringDrop[#, 11] & /@ pics;
checkpics = Import[“http://www.glo.or.th/check_result/” <> #] & /@ filenamels;

Manipulate[checkpics[[ i ]], {{i, 1, “”}, # -> datethls[[ # ]] & /@ Range[Length@checkpics]}, ControlType -> PopupMenu]

ส่วนนี้ผมลองเขียน package สั้นๆสำหรับดึงข้อมูลผลสลาก
จากเวบ http://lotto.mthai.com/lottery/result-PageNum.html
โดยที่ PageNum คือหมายเลขของเวบเพจครับ
เช่น งวดล่าสุด (1 เมษายน 55) ก็คือหมายเลข 1775 หรือ
http://lotto.mthai.com/lottery/result-1775.html ครับ

ทดลองใช้ package ก็ทำตามนี้ได้เลยครับ

(*load package*)
Import[“http://slphyx.sakngoi.com/temp/Mpeclottery/mpeclottery4U.m”]

คำสั่งหลักของ package คือ Mpeclottery โดยที่มันต้องการ input 2 ตัวคือ
หมายเลขเวบเพจของ mthai กับ รูปแบบของ output ที่ผมแทนด้วย 0 หรือ 1 สำหรับ
แสดงผลเป็น list ของตัวเลข กับเป็นแบบตารางตามลำดับครับ

ส่วนอันนี้เป็นหมายเลขเพจของ mthai ของแต่ล่ะงวด ที่ผมพอหาได้ครับ {55,57,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,104,106,108,110, 112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,143,145,147,149,151, 153,156,158,160,162,164,166,168,179,185,187,189,191,193,195,197,199,201,203,205, 207,209,211,213,215,217,219,221,223,225,227,229,231,233,235,237,239,241,243,245, 247,249,251,253,255,257,259,261,263,265,267,269,271,273,275,277,279,281,283,285, 287,289,291,293,295,297,299,301,303,305,307,309,311,319,321,323,325,327,329,331, 333,335,337,339,341,343,345,347,349,351,491,500,578,667,688,733,770,810,885,943, 1132,1148,1206,1236,1340,1401,1425,1443,1461,1489,1505,1529,1537,1545,1564,1587, 1609,1636,1665,1682,1702,1720,1755,1775}

 

%d bloggers like this: