แบ่งคำภาษาไทยใน 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 ครับ

สมการดอกกุหลาบ

Rose[x_,theta_]:=Module[{phi=(Pi/2)Exp[-theta/(8 Pi)],X=1-(1/2)((5/4)(1-Mod[3.6 theta,2 Pi]/Pi)^2-1/4)^2},
y=1.95653 x^2 (1.27689 x-1)^2 Sin[phi];
r=X(x Sin[phi]+y Cos[phi]);
{r Sin[theta],r Cos[theta],X(x Cos[phi]-y Sin[phi])}
];

ParametricPlot3D[Rose[x,theta],{x,0,1},{theta,-2 Pi,15 Pi},PlotPoints->{25,576},PlotStyle->Red,Mesh->None,Axes->False,Boxed->False]

rose

ลอกมาจาก www.bugman123.com

 

เรียกใช้งาน R ใน Mathematica

สำหรับคนที่สนใจหรือใช้งาน R ใน Mathematica (version < 9.0) ลองดูตัวอย่างที่นี่นะครับ http://mathematica.stackexchange.com/questions/844/are-there-any-rlink-like-projects-which-enable-the-interaction-between-r-and
ซึ่งต้องติดตั้ง RAndFriends (http://rcom.univie.ac.at/download.html) ก่อนนะครับ (แนะนำเลยครับตัวนี้ สะดวกมากๆ)

ตัวอย่าง Code

Needs[“NETLink`”]
myR = CreateCOMObject[“StatConnectorSrv.StatConnector”]
myR@Init[“R”]
myR@SetSymbol[“xxx”, 12321]
result1 = myR@GetSymbol[“xxx”]
myR@EvaluateNoReturn[“randmat<-matrix(rnorm(100),10)”]
rmat = myR@GetSymbol[“randmat”]
result2 = myR@Evaluate[“solve(matrix(1:4,2))”]

เพิ่มเติม
R http://mpec.sc.mahidol.ac.th/forums/index.php/topic,2817.0.html
RStudio http://mpec.sc.mahidol.ac.th/forums/index.php/topic,5184.0.html

สำหรับใครที่ใช้ Mathematica version 9.0 ขึ้นไปสามารถที่จะเรียกใช้งาน R ได้โดยตรงจาก package ชื่อ RLink ซึ่งมากับตัว Mathematica ได้เลยครับสะดวกมาก ผมเขียนการใช้งานแบบง่ายของ RLink ไว้ที่นี่ครับ การใช้งาน RLink แบบง่ายๆ