Hôm nay mới nhớ ra một công cụ mà mình đã làm từ lâu lắm rồi có tên là Anna. Để giải thích Anna là cái gì thì cũng khó bởi vì không có cái gì giống nó trên đời này cả. Vậy nên mình sẽ cho ví dụ Anna có thể làm dược gì:
1 - Bạn muốn tìm các từ tiếng Việt mà (bỏ dấu đi) viết xuôi viết ngược đều như nhau. Một ví dụ: mất tăm, mặc cảm. Có bao nhiêu từ như vậy?
2 - Bạn làm thơ, muốn tìm một câu vần với câu tiếp theo. Ví dụ làm thơ lục bát, cần từ nào có cùng vần với "bờ mương" chẳng hạn.
3 - Bạn viết nhạc, muốn tìm từ nào có hai âm tiết, mà một âm tiết có thanh ngang, một âm tiết có thanh sắc.
4 - Bạn muốn tìm các từ, không phải từ láy âm có hai âm tiết, mà cả hai âm tiết đều có dấu huyền, mà hai âm tiết vần với nhau.
Công cụ Anna sẽ cho phép bạn tra cứu các từ như vậy.
1 - Tra:
dict.search('
(w.slen() >= 2)
&& (w.toAscii().joinSyls().reverse() == w.toAscii().joinSyls().string()) 
', 100)
Ra:
ô tô
na pan
cô độc
nói giỡn...
2 - Tra
dict.search('
(w.slen() == 2) 
&& (w.syls(1).tail().string() == "ương")
', 50)
Ra:
đại dương
lập phương
chủ trương
khoa trương
bát hương
bốn phương
công thương...
3 - Tra
dict.search('
(w.slen() == 2) 
&& (w.syls(0).getTone() == "-")
&& (w.syls(1).getTone() == "\'")
',1000)
Ra:
tam giác
cơ số
ra sức
to lớn
ăn uống
ngoan cố
nghi thức
phân tích...
4 - Tra:
dict.search('
(w.slen() == 2)
&& (w.syls(0).string() != w.syls(1).string())
&& (w.syls(0).getTone() == "`")
&& (w.syls(1).getTone() == "`")
&& (w.syls(0).tail().string() == w.syls(1).tail().string())
', 1000)
Ra:
bùi ngùi
bùi nhùi
bần thần
bầy hầy
bồi hồi
bờm xờm
cằn nhằn
làu bàu
lèo tèo
lầm bầm...
What the fuck?
Để tự mình trả lời các câu hỏi của mình thì bạn cần biết cách Anna tìm kiếm từ như thế nào.
Bạn cần đặt từ cần tra thỏa mãn điều kiện vào
dict.search('criteria', maxResultsDefault = 10)
Criteria là các tiêu chí bạn cần tìm. Bạn có các phương thức sau để biến hóa từ cần tìm:
w <- annaword: từ cần tìm
.len() <- int: có bao nhiêu chữ cái
.slen() <- int: có bao nhiêu âm tiết
.string() <- string: chuyển từ annaword thành string
.getTone() <- string: trả về một trong các kết quả sau "-", "~", ".", "?", "`", "'"
.anagram() <- string: trả về anagram của annaword, tức là các chữ cái hợp thành từ đó, ví dụ annaword("trâu").anagram() == "ârtu"
.syls(k) <- annaword: lấy âm tiết thứ k (bắt đầu từ 0)
.removeTones() <- annaword: trả về bản không thanh của annaword annaword("trâu nước").removeTones() = annaword("trâu nươc")
.joinSyls() <- annaword: nhập các âm tiết vào nhau, ví dụ annaword("trâu nước").joinSyls() = annaword("trâunước")
.tail() <- annaword: trả về vần sau của annaword, ví dụ annaword("trâu").tail() == annaword("âu")
.head() <- annaword: trả về phần đầu của annaword, ví dụ annaword("trâu").head() == annaword("tr")
.toAscii()  <- annaword: trả về annaword không dấu, ví dụ annaword("trâu nước").toAscii() == annaword("trau nuoc")
Bạn cũng có thể xâu thành từng chuỗi miễn là đầu ra của hàm đó là annaword, ví dụ:
w.syls(0).tail().toAscii().string() == "eu"
Là hợp lệ, và sẽ trả về các từ mà âm tiết đầu tiên kết thúc bằng "eu" không dấu.
Bạn cũng có thể dùng các phép logic như && và || để tìm nhiều tiêu chí khác nhau.
Ví dụ như ở trên, bạn có thể tìm từ có hai âm tiết, mà âm tiết thứ hai kết thúc bằng "eu":
w.slen() == 2 && w.syls(1).tail().toAscii().string() == "eu"
Mình không biết ai cần nó để làm gì, nhưng có lẽ là mua vui cũng được một vài trống canh.