2009-05-02 47 views
7

Tôi có ý tưởng cho một vài ứng dụng web viết để giúp tôi và có thể là những người khác, học tiếng Nhật tốt hơn vì tôi đang học ngôn ngữ.Mẹo lập trình với ngôn ngữ/ký tự tiếng Nhật

Vấn đề của tôi là trang web sẽ chủ yếu là tiếng Anh, vì vậy nó cần kết hợp các ký tự lưu loát tiếng Nhật, thường là chữ hirigana và katakana, nhưng sau đó là chữ kanji. Tôi đang tiến gần hơn đến việc hoàn thành điều này; Tôi đã tìm ra rằng các trang và tệp nguồn cần phải là các loại nội dung unicode và utf-8.

Tuy nhiên, sự cố của tôi xuất hiện trong mã hóa thực tế. Những gì tôi cần là thao tác các chuỗi văn bản là kana. Một ví dụ là:

け す Tôi cần phải thực hiện động từ đó và chuyển nó thành dạng te け し て. Tôi muốn làm điều này trong javascript vì nó sẽ giúp xuống con đường để làm thao tác nhiều hơn, nhưng nếu tôi phải chỉ sẽ làm DB cuộc gọi và giữ tất cả mọi thứ trong một DB.

Câu hỏi của tôi không chỉ là cách thực hiện nó trong javascript, nhưng còn một số mẹo và chiến lược để thực hiện những thứ này bằng các ngôn ngữ khác nữa. Tôi hy vọng sẽ nhận được nhiều hơn vào việc làm các ứng dụng học ngôn ngữ, nhưng tôi bị mất khi nói đến điều này.

+0

Bạn đang tìm kiếm tại một số hình thức bắt nguồn? Tha thứ sự thiếu hiểu biết của tôi, nhưng điều này có vẻ khó khăn hơn (đối với một ngôn ngữ bản đồ) so với những gì bạn sẽ làm cho một ngôn ngữ dựa trên bảng chữ cái thông thường. – dirkgently

+0

Không bắt nguồn từ ví dụ, từ gốc về cơ bản là け す nhưng tôi thay đổi す thành し và thêm て. Ví dụ khác là の む thay đổi む thành ん で để nhận の ん で. Một ví dụ dễ dàng hơn có thể là.た べ る mà bạn sẽ thả る và thêm て để nhận た べ て. Hy vọng điều này có ý nghĩa hơn. – percent20

+0

Các ví dụ của bạn (kỳ lạ!) Cho tôi một khái niệm (mà tôi chắc chắn là sai) mà tất cả những gì bạn muốn là một số chuỗi replacemnet. Ngay cả (Unicode) regex sẽ làm việc. – dirkgently

Trả lời

4

Câu hỏi của tôi là không chỉ làm thế nào để làm điều đó trong javascript, nhưng một số lời khuyên và chiến lược để làm những loại của sự vật trong langauges khác nữa là gì.

Điều bạn muốn làm là xử lý chuỗi khá cơ bản - ngoài các dấu tách từ còn thiếu, như Barry lưu ý, mặc dù đó không phải là vấn đề kỹ thuật. Về cơ bản, đối với một ngôn ngữ lập trình nhận thức Unicode hiện đại (JavaScript từ phiên bản 1.3, tôi tin) không có sự khác biệt thực sự giữa kana và kanji Nhật Bản, và chữ cái Latinh - tất cả chỉ là các ký tự. Và một chuỗi chỉ là một chuỗi ký tự.

Trường hợp khó khăn là khi bạn phải chuyển đổi giữa các chuỗi và byte, bởi vì sau đó bạn cần phải chú ý đến mã hóa bạn đang sử dụng.Thật không may, nhiều lập trình viên, đặc biệt là người nói tiếng Anh bản địa có xu hướng làm sáng tỏ vấn đề này bởi vì ASCII là mã hóa chuẩn cho các chữ cái latin và các mã hóa khác thường cố gắng tương thích. Nếu các chữ cái Latinh là tất cả những gì bạn cần, thì bạn có thể hiểu rõ về mã hóa ký tự, tin rằng các byte và ký tự về cơ bản là giống nhau - và viết các chương trình cắt xén bất cứ thứ gì không phải ASCII.

Vì vậy, "bí mật" của chương trình nhận thức Unicode là: học cách nhận biết khi nào và ở đâu chuỗi/ký tự được chuyển đổi và từ byte, và đảm bảo rằng ở tất cả các địa điểm đó, mã hóa chính xác được sử dụng sẽ được sử dụng để chuyển đổi ngược lại và có thể mã hóa tất cả ký tự bạn đang sử dụng. UTF-8 đang dần trở thành tiêu chuẩn thực tế và thường được sử dụng ở bất cứ đâu bạn có lựa chọn.

Ví dụ điển hình (chưa đầy đủ):

  • Khi viết mã nguồn với xâu không phải ASCII (mã hóa trong trình soạn thảo/IDE cấu hình)
  • Khi biên dịch hoặc thông dịch mã nguồn ví dụ (trình biên dịch/thông dịch viên cần biết mã hóa)
  • Khi đọc/ghi chuỗi vào tệp (mã hóa phải được chỉ định ở đâu đó trong API hoặc trong siêu dữ liệu của tệp)
  • Khi viết chuỗi vào cơ sở dữ liệu (mã hóa phải được chỉ định trong cấu hình của DB o r bảng)
  • Khi phân phối các trang HTML qua máy chủ web (mã hóa phải được chỉ định trong tiêu đề HTML hoặc tiêu đề meta của trang; các biểu mẫu có thể phức tạp hơn)
+0

Thực ra sau khi đọc và nói chuyện với một người bạn tôi đã cố gắng thực hiện thao tác chuỗi cơ bản một lần nữa b ased trên "tất cả mọi thứ là một chuỗi" và nó đã làm việc. Tôi không biết mình đang làm gì đã giết chết nỗ lực đầu tiên, nhưng tôi vui vì điều đó thật dễ dàng và cảm thấy câm vì nó không hoạt động lần đầu tiên. Cảm ơn bạn đã phản hồi. – percent20

0

Nếu tôi nhớ chính xác (và tôi đã giảm rất nhiều năm tôi đã lấy tiếng Nhật để tôi có thể sai), các thay thế bạn muốn làm được xác định bằng biểu tượng cuối cùng hoặc hai trong từ. Lấy ví dụ đầu tiên của bạn, bất kỳ động từ nào kết thúc bằng 'す' sẽ luôn có 'し て' khi liên hợp theo cách này. Tương tự cho む -> ん で. Có thể bạn có thể thiết lập một bản đồ của ký tự cuối cùng (s) -> hình thức liên hợp. Bạn có thể phải tính đến các ngoại lệ, chẳng hạn như bất kỳ thứ gì liên hợp với xx っ て.

Đối với tính di động giữa các ngôn ngữ, bạn sẽ phải triển khai logic khác nhau dựa trên cách chúng hoạt động. Giải pháp này sẽ khá đơn giản để thực hiện cho tiếng Tây Ban Nha là tốt, vì các liên hợp phụ thuộc vào nếu động từ kết thúc bằng -ar, -er hoặc -ir (với một số động từ yêu cầu ngoại lệ trong logic của bạn). Thật không may, đó là giới hạn của các kỹ năng đa ngôn ngữ của tôi, vì vậy tôi không biết làm thế nào nó sẽ làm tốt hơn cả hai.

+0

Thực ra tôi đã nghĩ về việc lập bản đồ và có thể thấy lợi ích của nó, nhưng cũng thấy lợi ích của việc chuyển đổi chúng bay nhiều hơn. Tôi đã không chắc chắn về cách tiếp cận nào và thậm chí làm thế nào để đối phó với tiếng Nhật tất cả cùng nhau khi tôi viết mã. Điều quan trọng là sau này khi tôi nhận được các hình thức ngắn và hình thức tai là nơi tôi nhìn thấy trên họ bay giúp đỡ. – percent20

1

câu hỏi của bạn hoàn toàn không rõ ràng đối với tôi.

tuy nhiên, tôi đã có một số kinh nghiệm làm việc với ngôn ngữ Nhật Bản, vì vậy tôi sẽ cung cấp cho 2 Cent của tôi.

vì văn bản tiếng Nhật không có tính năng tách từ (ví dụ: ký tự khoảng trắng), công cụ quan trọng nhất mà chúng tôi phải có là trình nhận dạng từ dựa trên từ điển.

khi bạn đã tách văn bản, việc thao tác với công cụ "thông thường" sẽ dễ dàng hơn.

chỉ có 2 công cụ đã thực hiện ở trên và dưới dạng sản phẩm phụ, chúng cũng hoạt động như một người gắn thẻ (tức là danh từ, động từ, v.v.).

chỉnh sửa: luôn sử dụng unicode khi làm việc w languagers.

+0

Xin lỗi, Câu hỏi của tôi là loại hai thứ trong một. Tôi rất lo lắng khi bắt đầu 2 chủ đề khác nhau nên tôi kết hợp "Một số mẹo để làm việc với tiếng Nhật" và "Làm thế nào tôi có thể hoàn thành xyz". Có thêm bất kỳ mẹo nào bạn có thể cung cấp cùng với trải nghiệm của mình hay không. Tôi đã không nghĩ đến việc nói ra những lời, đã không đi xa đến vậy. Chủ yếu là sau khi làm thế nào để thao tác các từ riêng lẻ. Tuy nhiên, bất kỳ mẹo nào về lập trình với ngôn ngữ tiếng Nhật đều hữu ích và được đánh giá cao. Thành thật mà nói, tôi đã cố gắng tránh ánh xạ các tập tin một unicode, nhưng có vẻ như cần phải sử dụng một trong hai hoặc cả hai. – percent20

26
  • Gắn vào Unicode và utf-8 ở mọi nơi.
  • Tránh xa các mã hóa tiếng Nhật bản địa: euc-jp, shiftjis, iso-2022-jp, nhưng lưu ý rằng có thể bạn sẽ gặp phải chúng vào một lúc nào đó nếu bạn tiếp tục.
  • Làm quen với một nhà phân đoạn để thực hiện các công cụ phức tạp như phân tích POS, phân đoạn từ, v.v ... các công cụ chuẩn được sử dụng bởi hầu hết những người làm NLP (xử lý ngôn ngữ tự nhiên) hoạt động trên tiếng Nhật.

MeCab (ban đầu trên SourceForge) là tuyệt vời: nó cho phép bạn chụp văn bản như thế nào,

「日本語は、とても難しいです。」

và nhận được tất cả các loại thông tin tuyệt vời về

kettle:~$ echo 日本語は、難しいです | mecab 
日本語 名詞,一般,*,*,*,*,日本語,ニホンゴ,ニホンゴ 
は 助詞,係助詞,*,*,*,*,は,ハ,ワ 
、 記号,読点,*,*,*,*,、,、,、 
難しい 形容詞,自立,*,*,形容詞・イ段,基本形,難しい,ムズカシイ,ムズカシイ 
です 助動詞,*,*,*,特殊・デス,基本形,です,デス,デス 
EOS

mà về cơ bản là một chi tiết chạy xuống các phần của bài phát biểu, bài đọc, phát âm, v.v. Nó cũng sẽ giúp bạn phân tích các động từ động từ,

kettle:~$ echo メキシコ料理が食べたい | mecab 
メキシコ 名詞,固有名詞,地域,国,*,*,メキシコ,メキシコ,メキシコ 
料理 名詞,サ変接続,*,*,*,*,料理,リョウリ,リョーリ 
が 助詞,格助詞,一般,*,*,*,が,ガ,ガ 
食べ 動詞,自立,*,*,一段,連用形,食べる,タベ,タベ 
たい 助動詞,*,*,*,特殊・タイ,基本形,たい,タイ,タイ 
EOS

Tuy nhiên, tài liệu là tất cả bằng tiếng Nhật và hơi phức tạp để thiết lập và tìm ra cách định dạng đầu ra theo cách bạn muốn. Có gói sẵn cho Ubuntu/Debian, và các ràng buộc trong một loạt các ngôn ngữ bao gồm perl, python, ruby ​​...

Apt-Repos cho ubuntu:

deb http://cl.naist.jp/~eric-n/ubuntu-nlp intrepid all 
deb-src http://cl.naist.jp/~eric-n/ubuntu-nlp intrepid all

Gói cài đặt: $ apt-get install mecab-ipadic-utf8 mecab python-mecab

nên làm điều tôi nghĩ.

Các lựa chọn thay thế khác cho mecab là, ChaSen, được viết năm trước bởi tác giả của MeCab (người tình cờ làm việc tại google bây giờ) và Kakasi, ít mạnh mẽ hơn nhiều.

Tôi chắc chắn sẽ cố tránh để tránh các thói quen chia động từ của riêng bạn. vấn đề với điều này chỉ là nó sẽ đòi hỏi tấn và tấn công việc, mà những người khác đã làm, và bao gồm tất cả các trường hợp cạnh với các quy tắc là, vào cuối ngày, không thể.

MeCab được định hướng theo thống kê và được đào tạo về vô số dữ liệu. Nó sử dụng một kỹ thuật học máy tinh vi được gọi là trường ngẫu nhiên có điều kiện (CRFs) và kết quả thực sự khá tốt.

Vui chơi với người Nhật. Tôi không chắc chắn tiếng Nhật của bạn tốt như thế nào, nhưng nếu bạn cần trợ giúp với tài liệu cho mecab hoặc bất cứ điều gì cảm thấy tự do để hỏi về điều đó là tốt. Kanji có thể khá đáng sợ ngay từ đầu.

+0

Tôi ước gì mình cũng có thể đánh dấu câu trả lời này. Tôi đã chỉ làm những thói quen chia sẻ của tôi như là một bài tập lập trình và để tìm hiểu tốt hơn cốt lõi xung quanh ngôn ngữ tiếng Nhật Nếu tôi tiếp tục học tiếng Nhật, tôi chắc chắn sẽ xem xét một nhà phân đoạn. – percent20

+1

Bài đăng tuyệt vời, cảm ơn vì điều này. Đá MeCab – aehlke

+0

Tình cờ gặp MeCab khi chơi với C#. Chỉ muốn thêm rằng nó thật tuyệt vời. Ngoài ra còn có một webservice MeCab @ http://mimitako.net/api/mecapi.cgi. Oh và "không chính thức" C# bindings @ http://en.sourceforge.jp/projects/mecabdotnet/. Chúc mừng! –

2

Điều bạn cần làm là xem xét các quy tắc ngữ pháp. Có một loạt các quy tắc cho mỗi cách chia động từ. Hãy lấy mẫu 〜 て chẳng hạn. Psudocode:

def te_form(verb) 
    switch verb.substr(-1, 1) == "る" then return # verb minus ru plus te 
    case "る" #return (verb - る) + て 
    case "す" #return (verb - す)+して 

vv Về cơ bản, hãy chia nhỏ thành động từ loại I, II và III.

0

Vì hầu hết các động từ trong tiếng Nhật theo một trong số các mẫu có thể dự đoán được, cách dễ nhất và dễ mở rộng nhất để tạo tất cả các dạng của động từ đã cho là có động từ. tạo ra mỗi dạng tùy thuộc vào cách chia động từ.

Mã giả:

generateDictionaryForm(verb) 
    case Ru-Verb: verb.stem + る 
    case Su-Verb: verb.stem + す 
    case Ku-Verb: verb.stem + く 
    ...etc. 

generatePoliteForm(verb) 
    case Ru-Verb: verb.stem + ります 
    case Su-Verb: verb.stem + します 
    case Ku-Verb: verb.stem + きます 
    ...etc. 

động từ bất quy tắc sẽ đương nhiên được đặc biệt-cased.

Một số biến thể này sẽ hoạt động đối với bất kỳ ngôn ngữ thông thường nào khác (tức là không phải tiếng Anh).

-2

Hãy thử cài đặt đá quý của tôi (rom2jap). Nó là ruby.

gem install rom2jap 

Mở terminal và gõ của bạn:

require 'rom2jap' 
Các vấn đề liên quan