Sắp xếp danh sách trong tiếng Việt bằng PHP

Thú thực với các bác là cả đời mình, em chưa bao giờ nghiên cứu một thuật toán nào về sắp xếp cả (vì một thằng khối C như em thì chỉ nghe đến “thuật toán” là đã hãi rồi). Bình thường thì, khi có nhu cầu sắp xếp, em dùng sort. Cứ echo input | sort > output, thế là xong! Nhưng giờ thì phải dùng PHP. Thực ra thì cũng có thể dùng tham số SORT_LOCALE_STRING, nhưng có phải máy chủ nào cũng có phần locale tiếng Việt ngon lành đâu.

Continue reading “Sắp xếp danh sách trong tiếng Việt bằng PHP”

Siêu trâu bò lợn gà

Về lí thuyết, tiếng Việt có bao nhiêu âm tiết ở dạng chữ viết? Câu hỏi vớ vẩn này thỉnh thoảng lại làm lắm kẻ động lòng… Bây giờ kết hợp tất cả các “âm vị” ở dạng chữ viết, cho vào một danh sách. Sau đó tách danh sách to đó ra thành các danh sách nhỏ theo 4 mô hình vần. Từ đó ngồi nghĩ ra các luật để “trừ khử” dần các âm tiết không thể tồn tại.

Continue reading “Siêu trâu bò lợn gà”

Em fix my brain

Trong khi mọi người vui vẻ về quê hoặc đi du lịch thì em phải ngồi nhà cố nuốt chửng mớ lí thuyết ngôn ngữ học chán chết. Cứ tưởng là dễ ăn, hoá ra toàn những bài học thuộc lòng, mà em thì xưa nay có trí nhớ cực tồi. Làm gì em cũng phải tra tra cứu cứu.

Dù sao thì cũng phải cố mà thi cho xong. Em cũng biết vậy, cũng thử cố mà nhai mà nuốt. Nhưng quả thực là em thấy ngán quá chừng. Ngán đến mức em lại phải thả trâu bò ra cho thay đổi không khí…

Vẫn là vấn đề cũ rích: “i ngắn, y dài” 😛

#! /bin/sh
# Em fix 'i/y problem'

filename="$1"

voY=(y ỳ Ỳ ỷ Ỷ ỹ Ỹ ý Ý ỵ Ỵ)
voI=(i ì Ì ỉ Ỉ ĩ Ĩ í Í ị Ị)

# To prevent from converting un-wanted words, such as
# non-Vietnamese words, XML tags, email addresses,...
# set start=1 instead.
start=0

for j in `seq $start 10`; do
        Y=${voY[$j]}
        I=${voI[$j]}
        sed -r "s/(\b[hklmtsv])$Y(\b)/\1$I\2/ig" -i "$filename"
        sed -r "s/(\bqu)$I(ch|t|nh|p|t|u|\b)/\1$Y\2/ig" -i "$filename"
done

Hoan hô thông tư 60

Chả phải đợi đến 24h ngày 05/12, mà tầm hơn 20h đã đơ ra như thế này. Tốt quá (nhưng lúc ấy đang buff, kể ra cũng tiếc 2 lọ MP :P)!

Khởi động Linux. Mới cài FC6. Lúc mới cài thì chạy ngon. Nhưng chả hiểu sao hôm nọ “ụp đất” bằng yum thì nó thông báo một tin rất đau buồn là “kdeinit failed to start”. Thôi, đã thế thì ông dùng Gnome. Mà mấy hôm nữa thì Gnome cũng nghỉ cho khoẻ để nhường chỗ cho iceWM.

Continue reading “Hoan hô thông tư 60”

Tạo danh sách đối chiếu chính tả

#! /bin/sh

# Trường hợp CH - TR
#  Lấy 'LIST' (danh sách các âm tiết) ở đây: 
echo 'Đang tạo danh sách các âm tiết...'
egrep "^ch" LIST > ch.txt
egrep "^tr" LIST > ch.txt

echo 'Đang tạo danh sách tạm...'
sed -e 's/^ch//g' -e 's/$/_ /g' ch.txt > tmp.txt
sed -e 's/^tr//g' -e 's/$/__ /g' tr.txt >> tmp.txt

# Sắp xếp (sau khi đã cập nhật locale:  http://forum.vnoss.org/viewtopic.php?id=1948)
sort tmp.txt > CH-TR.txt

echo 'Tạo các cặp'
sed -r -e 's/^(.*)__ $/\\|tr\\1/g; s/^(.*)_ $/\\|ch\\1\\|/g' -i CH-TR.txt
sed -e :a -e '/$/N;s/\\n//g; ta' -i CH-TR.txt
sed -r -e 's/\\|ch/\\nch/g' -i CH-TR.txt
sed -r -e 's/\\|\\|/\\t/g; s/\|$/\\t/g; s/\\|tr/\\n\\ttr/g' -i CH-TR.txt
sed -e '/^$/d' -i CH-TR.txt

echo 'Removing temporary file'
rm -f tmp.txt

echo -e "\\nCẢNH BÁO:\\nDanh sách còn nhiều lỗi.\\nTrong phiên bản này, bạn phải chỉnh sửa thủ công.\\n"

#  TODO:
#  Tự động sửa lỗi cho các cặp không đúng. Có lẽ phải dùng Perl.

“Regex Spellcheck” for Vietnamese

“Regex Spellcheck” (step 1) 😆

(ch|gh|kh|ngh|ng|nh|p|ph|th|tr|b|c|d|đ|g|h|gi|k|l|m|n|q|r|s|t|v|x)?
(
  	(
  		[uo]
  	)?
  	(
  		(
  			[aàảãáạăằẳẵắặâầẩẫấậeèẻẽéẹêềểễếệiìỉĩíịoòỏõóọôồổỗốộơờởỡớợuùủũúụưừửữứựyỳỷỹýỵ]
  		)
  		|
  		(
  			y[aàảãáạêềểễếệ]
  		)
  	)
	|
	(
	ia|ìa|ỉa|ĩa|ía|ịa|iê|iề|iể|iễ|iế|iệ|ưa|ừa|ửa|ữa|ứa|ựa|ươ|ườ|ưở|ưỡ|ướ|ượ|ua|ùa|ủa|ũa|úa|ụa
	)
)
(
	(i|o|u|y|m|n|ng|nh|p|t|c|ch)?
)

😛