banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành *nix Đổi tên hàng loạt file từ tiếng Việt có dấu thành không dấu  XML
  [Programming]   Đổi tên hàng loạt file từ tiếng Việt có dấu thành không dấu 18/02/2012 18:39:58 (+0700) | #1 | 254393
[Avatar]
quanta
Moderator

Joined: 28/07/2006 14:44:21
Messages: 7265
Location: $ locate `whoami`
Offline
[Profile] [PM]
Giả sử mình có một thư mục ca nhạc với tên file là tiếng Việt có dấu:
Code:
Le Cat Trong Ly
├── Chênh vênh (guitar version).mp3
├── Chênh vênh.mp3
├── Chuyến xe.mp3
├── Cơn bão nghiêng đêm.mp3
├── Giấc mộng lớn.mp3
├── Hương lạc.mp3
├── Không tên.mp3
├── Lúng ta lúng túng.mp3
├── Mùa yêu.mp3
└── Trời ơi.mp3


Khi tạo playlist:
Code:
$ find Le\ Cat\ Trong\ Ly -type f -iname '*.mp3' | sort | sed 's/\//\\/' > Le\ Cat\ Trong\ Ly.mpl

rồi copy vào SL45 _http://sl4x.com/ thì file playlist không hiển thị được tiếng Việt nên gặp lỗi "File not found" khi chạy.

Có bạn nào hứng thú đổi tên của những file này thành tiếng Việt không dấu bằng shell script không nhỉ?
Code:
Le Cat Trong Ly
├── Chenh venh.mp3
├── Chuyen xe.mp3
├── Con bao nghieng đem.mp3
├── ...
Let's build on a great foundation!
[Up] [Print Copy]
  [Programming]   Đổi tên hàng loạt file từ tiếng Việt có dấu thành không dấu 18/02/2012 19:07:34 (+0700) | #2 | 254398
[Avatar]
mylove14129
Member

[Minus]    0    [Plus]
Joined: 27/04/2008 19:07:19
Messages: 106
Offline
[Profile] [PM]
cách đơn giản nhất là làm cái xâu chứa dấu và một xâu để thay thế, sau đó replace smilie
[Up] [Print Copy]
  [Programming]   Đổi tên hàng loạt file từ tiếng Việt có dấu thành không dấu 18/02/2012 19:17:39 (+0700) | #3 | 254399
hieuneo
Member

[Minus]    0    [Plus]
Joined: 06/02/2009 13:51:04
Messages: 21
Offline
[Profile] [PM]

newname=""
list=`ls |grep .mp3 > list.txt`
while read line
do
oldname=$line
newname=`echo "$oldname"| tr '[:upper:]' '[:lower:]'`
newname=`echo $newname| sed 's/\ /-/g'`
newname=`echo $newname| sed 's/[a á à ả ã ạ]/a/g'`
newname=`echo $newname| sed 's/[â ấ ầ ẩ ẫ ậ]/a/g'`
newname=`echo $newname| sed 's/[e é è ẻ ẽ ẹ]/e/g'`
newname=`echo $newname| sed 's/[ê ế ề ể ễ ệ]/e/g'`
newname=`echo $newname| sed 's/[i í ì ỉ ĩ ị]/i/g'`
newname=`echo $newname| sed 's/[o ó ò ỏ õ ọ]/o/g'`
newname=`echo $newname| sed 's/[ô ố ồ ổ ỗ ộ]/o/g'`
newname=`echo $newname| sed 's/[ơ ớ ờ ở ỡ ợ]/o/g'`
newname=`echo $newname| sed 's/[u ú ù ủ ũ ụ]/u/g'`
newname=`echo $newname| sed 's/[ư ứ ừ ử ữ ự]/u/g'`
newname=`echo $newname| sed 's/[y ý ỳ ỷ ỹ ỵ]/y/g'`
newname=`echo $newname| sed 's/đ/d/g'`
echo $newname
mv "$oldname" "$newname"
done < list.txt
rm -rf list.txt
#make-list
ls|grep .mp3|sort > list.txt
 

Của anh đây smilie), em mới viết một script hôm qua xong smilie, nay e bổ xung thêm cái tiếng việt như a cần smilie)
em replace luôn khoảng trắng thành "-"
output:
music/
|-- chenh-venh-(guitar-version).mp3
|-- chenh-venh.mp3
|-- chuyen-xe.mp3
|-- con-bao-nghieng-dem.mp3
|-- giac-mong-lon.mp3
|-- huong-lac.mp3
|-- khong-ten.mp3
|-- list.txt
|-- lung-ta-lung-tung.mp3
|-- mua-yeu.mp3
|-- rename-unicode-vn.sh
`-- troi-oi.mp3
 

[Up] [Print Copy]
  [Programming]   Đổi tên hàng loạt file từ tiếng Việt có dấu thành không dấu 19/02/2012 15:58:35 (+0700) | #4 | 254493
[Avatar]
quanta
Moderator

Joined: 28/07/2006 14:44:21
Messages: 7265
Location: $ locate `whoami`
Offline
[Profile] [PM]
@hieuneo: giả sử mình vẫn thích để khoảng trắng (không dùng cách chuyển thành gạch ngang rồi chuyển ngược lại), bạn thử viết cả đoạn trên thành one-liner xem.
Let's build on a great foundation!
[Up] [Print Copy]
  [Programming]   Đổi tên hàng loạt file từ tiếng Việt có dấu thành không dấu 19/02/2012 17:36:54 (+0700) | #5 | 254504
hieuneo
Member

[Minus]    0    [Plus]
Joined: 06/02/2009 13:51:04
Messages: 21
Offline
[Profile] [PM]
script trên công nhận là dài dòng và chưa tối ưu a ạ smilie
e viết lại cái này chắc ngắn hơn smilie
Code:
for oldname in *.mp3; do newname=`echo $oldname| sed 's/[aáàảãạâấầẩẫậ]/a/g'| sed 's/[eéèẻẽẹêếềểễệ]/e/g'| sed 's/[iíìỉĩị]/i/g'| sed 's/[oóòỏõọôốồổỗộơớờởỡợ]/o/g'|sed 's/[uúùủũụưứừửữự]/u/g'| sed 's/[yýỳỷỹỵ]/y/g'| sed 's/[đ]/d/g'`; echo $newname; mv "$oldname" "$newname"; done


Output:
music2/
|-- Chenh\ venh\ (guitar\ version).mp3
|-- Chenh\ venh.mp3
|-- Chuyen\ xe.mp3
|-- Con\ bao\ nghieng\ dem.mp3
|-- Giac\ mong\ lon.mp3
|-- Huong\ lac.mp3
|-- Khong\ Ten.mp3
|-- lung\ ta\ lung\ tung.mp3
|-- Mua\ yeu.mp3
`-- Troi\ oi.mp3 
[Up] [Print Copy]
  [Programming]   Đổi tên hàng loạt file từ tiếng Việt có dấu thành không dấu 19/02/2012 18:08:13 (+0700) | #6 | 254508
[Avatar]
quanta
Moderator

Joined: 28/07/2006 14:44:21
Messages: 7265
Location: $ locate `whoami`
Offline
[Profile] [PM]
Có cách nào không pipe sed to sed không nhỉ smilie?
Let's build on a great foundation!
[Up] [Print Copy]
  [Programming]   Đổi tên hàng loạt file từ tiếng Việt có dấu thành không dấu 19/02/2012 18:56:07 (+0700) | #7 | 254512
hieuneo
Member

[Minus]    0    [Plus]
Joined: 06/02/2009 13:51:04
Messages: 21
Offline
[Profile] [PM]
hóa ra sed này còn hỗ trợ multiple patterns smilie

Code:
for oldname in .mp3; do newname=`echo $oldname| sed 's/[aáàảãạâấầẩẫậ]/a/g; s/[eéèẻẽẹêếềểễệ]/e/g; s/[iíìỉĩị]/i/g; s/[oóòỏõọôốồổỗộơớờởỡợ]/o/g; s/[uúùủũụưứừửữự]/u/g; s/[yýỳỷỹỵ]/y/g; s/[đ]/d/g'`; echo $newname; mv "$oldname" "$newname"; done


hình như còn -e nữa phải không a quanta.
A quanta còn cách nào nữa không ?
[Up] [Print Copy]
  [Programming]   Đổi tên hàng loạt file từ tiếng Việt có dấu thành không dấu 19/02/2012 19:06:34 (+0700) | #8 | 254513
tuxevil
Member

[Minus]    0    [Plus]
Joined: 19/02/2012 06:29:06
Messages: 2
Offline
[Profile] [PM]
Theo em biết thì có 2 cách smilie để tránh pipe sed to sed

Cách 1 : Dùng sed với option "-e" :
Code:
for oldname in *.mp3; do newname=`echo $oldname|sed -e 's/[aáàảãạâấầẩẫậ]/a/g' -e 's/[eéèẻẽẹêếềểễệ]/e/g' -e 's/[iíìỉĩị]/i/g' -e 's/[oóòỏõọôốồổỗộơớờởỡợ]/o/g' -e 's/[uúùủũụưứừửữự]/u/g' -e 's/[yýỳỷỹỵ]/y/g' -e 's/[đ]/d/g'`; echo $newname; mv "$oldname" "$newname"; done


Cách 2 : Sử dụng "-f":
Ví dụ tạo 1 file vn_lowercase.sed với nội dung :

s/[aáàảãạâấầẩẫậ]/a/g
s/[eéèẻẽẹêếềểễệ]/e/g
s/[iíìỉĩị]/i/g
s/[oóòỏõọôốồổỗộơớờởỡợ]/o/g
s/[uúùủũụưứừửữự]/u/g
s/[yýỳỷỹỵ]/y/g
s/[đ]/d/g 


Và lệnh sau:

Code:
for oldname in *.mp3; do newname=`echo $oldname|sed -f ../vn_lowercase.sed`; echo $newname; mv "$oldname" "$newname"; done

[Up] [Print Copy]
  [Programming]   Đổi tên hàng loạt file từ tiếng Việt có dấu thành không dấu 19/02/2012 19:20:55 (+0700) | #9 | 254515
hieuneo
Member

[Minus]    0    [Plus]
Joined: 06/02/2009 13:51:04
Messages: 21
Offline
[Profile] [PM]
còn lệnh rename nữa, ai đã thử rename với lệnh này chưa
[Up] [Print Copy]
  [Programming]   Đổi tên hàng loạt file từ tiếng Việt có dấu thành không dấu 19/02/2012 20:43:52 (+0700) | #10 | 254524
idid231
Member

[Minus]    0    [Plus]
Joined: 03/06/2011 09:36:19
Messages: 32
Offline
[Profile] [PM]
Em xin mạn phép chen tay hỏi ngu một câu.
Theo như e thấy thì thuật toán ở đây là scan xem ở đâu có dấu thì thay trở về chữ thường không dấu. May mắn là số lượng nguyên âm ít nên mảng cũng ít phần tử.
Trên thực tế em thấy nhu cầu convert từ không dấu sang có dấu cũng khá cần thiết, bởi vẫn còn khá nhiều các phần mềm không hỗ trợ tiếng việt, báo lỗi không đọc đc. Như vậy ta sẽ phải chuyển toàn bộ file sau khi convert về dạng có dấu. Em có sử dụng tính năng này trên một trang web, nó cho phép chuyển các comment ở máy không có unikey sang dạng có dấu, các dấu, mũ và móc em thấy đặt khá chính xác nên câu cú không bị mất nghĩa.
Vậy em muốn hỏi là cái thuật toán chuyển từ không dấu thành có dấu ấy nó như thế nào? Các anh có thể cho em xin ý tưởng để hình dung nó được không ạ, em chưa hình dung đc nó thế nào smilie
[Up] [Print Copy]
  [Programming]   Đổi tên hàng loạt file từ tiếng Việt có dấu thành không dấu 20/02/2012 10:04:05 (+0700) | #11 | 254593
[Avatar]
quanta
Moderator

Joined: 28/07/2006 14:44:21
Messages: 7265
Location: $ locate `whoami`
Offline
[Profile] [PM]

idid231 wrote:

Vậy em muốn hỏi là cái thuật toán chuyển từ không dấu thành có dấu ấy nó như thế nào? Các anh có thể cho em xin ý tưởng để hình dung nó được không ạ, em chưa hình dung đc nó thế nào smilie 

Mình thử Google thì tìm được cái này: http://www.cs.hcmus.edu.vn/elib/bitstream/123456789/112574/1/0112267.pdf, bạn tham khảo xem.

Tình cờ hôm qua cũng thấy một bạn submit tính năng này lên commandlinefu: http://www.commandlinefu.com/commands/view/10268/thm-du-ting-vit-t-ng. Lưu ý là bạn ấy thiếu mất dấu nháy đơn ở cuối nhé. Bạn cũng có thể liên lạc để hỏi thêm.

Test phát smilie

Code:
$ curl http://vietlabs.com/vietizer/vietizer.php -d 'INPUT=em dang o truong, anh den ngay nhe, em muon lam roi&R1=1' | grep "<br>" | sed 's/<br>//g'
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   250    0   188  100    62     86     28  0:00:02  0:00:02 --:--:--   105

Kết quả:
em đang ở trường, anh đến ngày nhẹ, em muốn làm rồi 
Let's build on a great foundation!
[Up] [Print Copy]
  [Programming]   Đổi tên hàng loạt file từ tiếng Việt có dấu thành không dấu 20/02/2012 18:29:23 (+0700) | #12 | 254665
hieuneo
Member

[Minus]    0    [Plus]
Joined: 06/02/2009 13:51:04
Messages: 21
Offline
[Profile] [PM]
e thấy ý kiến của idid231 cũng hay, hôm qua nghiên cứu nhưng trước mắt là chịu vì văn phạm Tiếng Việt mình còn chưa thông được hết smilie, nên không nghĩ đến việc viết Tool , nên cũng tìm hiểu xem có trang nào cho mình "ké" được không smilie
khi submit lên e quên dấu nháy smilie
[Up] [Print Copy]
  [Programming]   Đổi tên hàng loạt file từ tiếng Việt có dấu thành không dấu 20/02/2012 20:37:06 (+0700) | #13 | 254672
idid231
Member

[Minus]    0    [Plus]
Joined: 03/06/2011 09:36:19
Messages: 32
Offline
[Profile] [PM]
Rất cảm ơn các anh đã lắng nghe ý kiến của em :X
Tệp pdf của anh quanta thực sự rất hữu ích, phân tích rất rõ ràng :X Em sẽ cố gắng dành thời gian học 1 ngôn ngữ để viết được một phần mềm có tác dụng covert qua lại giữa có dấu và không dấu smilie
[Up] [Print Copy]
  [Programming]   Đổi tên hàng loạt file từ tiếng Việt có dấu thành không dấu 03/06/2012 15:35:13 (+0700) | #14 | 264521
[Avatar]
chiro8x
Member

[Minus]    0    [Plus]
Joined: 26/09/2010 00:38:37
Messages: 661
Location: /home/chiro8x
Offline
[Profile] [PM] [Yahoo!]

em đang ở trường, anh đến ngày nhẹ, em muốn làm rồi
 

Đoạn này mà nó dịch "em muốn lắm rồi" thì khó đỡ thật. Em có test qua nhưng không hài lòng lắm, mặc dù đề tài này thực sự rất hay smilie. Nếu làm một con bot tìm kiếm "tri thức" trên internet rồi tự động correct chắc hay hơn.
while(1){}
[Up] [Print Copy]
  [Programming]   Đổi tên hàng loạt file từ tiếng Việt có dấu thành không dấu 05/06/2012 18:24:52 (+0700) | #15 | 264709
[Avatar]
noWhere_Man
Member

[Minus]    0    [Plus]
Joined: 19/10/2005 04:21:47
Messages: 38
Location: Tsinghua
Offline
[Profile] [PM]
Về việc chuyển tiếng Việt từ không dấu sang có dấu, mọi người có thể tham khảo bài báo này
http://ieeexplore.ieee.org/xpl/login.jsp?tp=&arnumber=5174609&url=http%3A%2F%2Fieeexplore.ieee.org%2Fiel5%2F5174598%2F5174599%2F05174609.pdf%3Farnumber%3D5174609
(ngày xưa mình down free được, chẳng hiểu sao giờ ko tìm thấy link pdf, nếu bạn nào tìm mà ko ra chỗ để down thì PM mình)

Đây có thể xem là một bài toán của lĩnh vực NLP. Mình đã từng tham khảo bài báo này + dùng thuật toán Viterbi để thực hiện, kết quả Pre = 89,5%, so với kết quả của luận văn mà anh quanta dẫn link thì cao hơn một chút (86.9%) smilie

Đang có ý tưởng phát triển viết một phần mềm gõ tiếng Việt tự động thêm dấu mà chưa có thời gian. Bạn nào có hứng thú thì pm nhé smilie

PS: ví dụ trên, chương trình của mình cho kết quả là
em đang ở trường, anh đến ngay nhe, em muốn lắm rồi 

vẫn còn hơi lởm, hehe
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|