โปรแกรมตัดคำ แบบใช้ PHP ล้วน ๆ

ที่ผ่านมามีหลายท่านสนใจถามเข้าหลังจากที่แสดงตัวอย่างเรียก Swath จาก PHP ให้ดู แต่ส่วนมากพอใช้บน Windows หลายคน ก็งง ๆ ผมก็งง ก็เลยจัดอันนี้ไป โปรแกรมตัดคำมันบน PHP ล้วน ๆ เสียเวลาเขียนไปหลายชั่วโมงอยู่ครับ น่าจะมี bug อะไรเต็มไปหมดถ้าท่านใดพบกรุณาแจ้งไปที่ https://github.com/veer66/PhlongTaIam/issue เดี๋ยวนี้ใช้ github แล้วครับ เพื่อท่านใดจะช่วยแก้จะได้ fork แล้ว pull request กลับมาได้เลย ไม่ต้องเสียเวลาย้ายไปย้ายมาให้ลำบากเหมือนโครงการก่อน

เข้าไป download ที่ https://github.com/veer66/PhlongTaIam ได้เลยครับ ถ้าเอาง่าย ๆ ก็ click ที่ปุ่มที่เขียนว่า zip และมีรูปเมฆมีลูกศรชี้ลงครับ ก็ได้ code ไปทั้งหมด เอาไปวางใน htdocs ก็น่าจะใช้ได้เลย

แต่ก็อาจจะเจ๊งบน Windows หรือสิ่งแวดล้อมที่ต่างจากที่ผมใช้อยู่อยู่ดี ถ้าปัญหาอะไรก็ถามไว้ที่นี่ได้ครับ แต่ว่าส่วนมากผมมักจะตอบไม่ได้  แต่ก็เผื่อมีท่านอื่นตอบได้ครับ

เริ่มทำ app บน Firefox OS ตอนที่ 1

ทีแรกก็ลง Firefox ก่อนครับ แล้วก็ลง Firefox OS Simulator ทีนี้ก็โหลด app ตัวอย่างมา https://github.com/comoyo/ffos-list-detail วิธีลงก็ตามใน link อะครับ แต่ผมต้อง cd เข้าไปใน bin แล้วค่อยสั่ง sudo ./init.sh ทำแบบในเว็บแล้วเจ๊งเพลียนิด ๆ เสร็จแล้วก็กลับมาที่หน้า Simulator firefox_sim
แล้วก็เอา url ของ app ที่เรารันไว้มาแปะ ในที่นี้คือ http://localhost:8081 แล้วก็สั่ง run เลยใช้ได้แล้ว … ตั้งแต่ลอง mobile os มา ผมว่านี่ง่าย เรื่องน้อย สุด ๆ แล้ว

ใช้ route ที่ controller อยู่ใน module


angular.module('mymod', [])
.controller('CorpusCtrl', function($scope) {
$scope.foo = 'bar';
})
.config(['$routeProvider', function($routeProvider) {
$routeProvider.
when('/corpus', {templateUrl: 'partials/corpus.html', controller: 'CorpusCtrl'}); // อย่าลืมใส่ quote คล่อมชื่อ controller ด้วย

}]);

 

Partials/corpus.html:


{{foo}}

 

index.html:


<!doctype html>
<html lang="en" ng-app="mymod">
<head>
<title>MyMod</title>
</head>

<body>
<div ng-view></div>

</body>
<script type="text/javascript" src="http://localhost:3000/assets/application.js"></script>
</html>

อันนี้มีไฟล์ javascript อะไรบ้างก็ใส่เข้าไป ผมใช้ Rails เลยเรียก application.js  ที่เดียว

ลองใช้ jasmine-node เถื่อน ๆ :-P

ผมไปทำ spec ไว้ใน tests/spec/foo_spec.js ไม่ได้สื่ออะไรเลย

var subj = require(‘../../subj.js’);
describe(‘foo suite’, function() {
var subj_ = new subj.Subj();
it("do sth", function() {
expect(subj_.x).toBe(100);
});
});

แล้วก็ถามด้วยสิ่งที่จะโดน test

exports.Subj = Subj;
function Subj() {
this.x = 100;
}

ลง jasmine-node ด้วย

sudo npm install -g jasmine-node

เวลา test ก็สั่ง

jasmine-node tests

(tests นี่คือชื่อ folder นะ)

เป็นอันใช้ได้ แต่กว่าจะใช้ได้ก็ต้องมั่วอยู่สักพักอะนะ

แย่หน่อยผมไม่รู้อะไรเกี่ยวกับ BDD เลย แต่เห็น AngularJS มันใช้ตัวนี้ก็เลยใช้ตาม :-P

ใช้ bcrypt กับ mongodo ด้วยกันบน node.js … ใช้ Q ด้วย

  1. โปรแกรมนี้ไปเปิด database เอาข้อมูลของ user ชื่อ foo ออกมา
  2. เสร็จแล้วก็สร้าง password hash โดยที่ไม่ได้เอาข้อมูลของ user มาทำอะไรเลย :-P … แล้วจะรีบ query มาทำไม -_-!
  3. เสร็จแล้วก็ save ข้อมูลของ user ที่มี password hash ลงไปใน mongodb แล้วก็ปิดมันซะ
var Q = require('q');
var bcrypt = require('bcrypt-nodejs');

var mongo = require('mongodb'),
  Server = mongo.Server,
  Db = mongo.Db;

var server = new Server('localhost', 27017, {auto_reconnect: true});
var db_ = new Db('annotedw', server, {safe: true});
var coll_; 
var user_;

Q.ncall(db_.open, db_).then(
	function(db) {
		console.log("OPEN");
		return Q.ncall(db.collection, db, 'user');
	}
)
.then(
	function(coll) {
		console.log("COLL");
		coll_ = coll;
		return Q.ncall(coll.findOne, coll, {'username': 'foo'});
	}
)
.then(
	function(item) {
		user_ = item;
		console.log("CALL HASH");
		return Q.ncall(bcrypt.hash, bcrypt, "password", null, null);
	}
)
.then(
	function(hash) {
		console.log("HASH", hash);
		user_.password_hash = hash;
		return Q.ncall(coll_.update, coll_, {_id: user_._id}, user_);
	}
).then(
	function(update_result) {
		console.log("UPDATE RESULT", update_result);
		db_.close();
	}
)
.fail(
	function(error) {
		console.log("ERROR", error);
	}
);

Q + bcrypt-nodejs

ลองเรียก bcrypt โดยใช้ Q ดู ก็ไม่ยาก ใช้ท่ามาตรฐานได้เหมือนกัน

var Q = require('q');
var bcrypt = require('bcrypt-nodejs');

Q.ncall(bcrypt.hash, bcrypt, "password", null, null)
.then(
	function(hash) {
		console.log("HASH", hash);
		return Q.ncall(bcrypt.compare, bcrypt, "password", hash);
	}
)
.then(
	function(result) {
		console.log("Comparision result:", result);
	}
)
.fail(
	function(err) {
		console.log("ERROR", err);
	}
);

MongoDB Node.js และ Q

ผมจะเขียน web app บน Node.js ให้ไปเปิด database ที่ใช้ MongoDB แต่ว่าเขียนไปแล้วงง function ที่มันซ้อนกันอย่างมาก ก็เลยหาตัวช่วยดูอยู่หลายอย่าง สุดท้ายคิดว่าใช้ Q น่าจะง่ายที่สุดก็เลยลองเขียนดู แต่ว่าเป็น command line นะ

var Q = require('q');
var mongo = require('mongodb'),
  Server = mongo.Server,
  Db = mongo.Db;

var server = new Server('localhost', 27017, {auto_reconnect: true});
var db_ = new Db('annotedw', server, {safe: true});

Q.ncall(db_.open, db_).then(
	function(db) {
		return Q.ncall(db.collection, db, 'corpus');
	}
)
.then(
	function(coll) {
		return Q.ncall(coll.findOne, coll);
	}
)
.then(
	function(item) {
		console.log(item);
		db_.close();
	}
)
.fail(
	function(err) {
		console.log("Error: ", err);
	}
);

ผม save ไฟล์ข้างบนไว้ใน mongotry.js

เวลาเรียกก็ใช้ node mongotry.js แล้วก็ได้ผลแบบข้างล่าง

{ _id: 508ec1e02ca65709fc00000c,
  corpus_id: 12,
  create: Fri Jan 01 2010 00:00:00 GMT+0700 (ICT),
  name: 'KIN_1' }

มันก็พิมพ์ข้อมูลออกมา 1 item ตามต้องการ

Extracting only Thai text using Python

import codecs
import re
import sys

for line in codecs.open(sys.argv[1], encoding="UTF8", errors='ignore'):
    for unit in re.split('([\u0E00-\u0EFF]+)', line):
        if re.match('[\u0E00-\u0EFF]+', unit):
            print(unit)

(I used Python 3.2.x)