2013-02-01 24 views
0

我在寫字典應用程序。如果用戶輸入一個Unicode字符,我想檢查該字符是哪種語言。粗糙的Unicode - >沒有CLDR的語言代碼?

例如

字 - returns ['zh', 'ja', 'ko'] 
العربية - returns ['ar'] 
a - returns ['en', 'fr', 'de'] //and many more 
й - returns ['ru', 'be', 'bg', 'uk'] 

我搜索,發現它可能與CLDR做https://stackoverflow.com/a/6445024/41948

或谷歌API Python - can I detect unicode string language code?

但在我的情況下

  • 找了一個大字符映射分貝似乎花費大量的存儲和內存
  • 調用API的速度太慢,除了需要網絡連接離子
  • 不需要非常準確。只需約80%的正確率即可
  • 簡單&快速是主要要求
  • 只需覆蓋UCS2 BMP字符即可。

任何提示?

我需要在Python和Javascript中使用它。謝謝!

+0

它可能有助於評估可能的方法,知道爲什麼你會這樣做。對於在某些大型語言列表中使用字母「a」的信息,您會做什麼? –

+0

也許「a」只是一個不好的例子。正如我所提到的,我正在撰寫一本詞典應用程序,這意味着我可以根據用戶正在嘗試查找的語言提供更多信息(或廣告)。 – est

+0

我認爲「a」就是一個很好的例子:將會有數百種可能的語言,所以猜測*語言將是相當困難的。 –

回答

2

將字形縮小到語言族是否足夠?如果是這樣,您可以根據BMP的映射創建一組範圍(語言 - >代碼範圍),如http://en.wikipedia.org/wiki/Plane_(Unicode)#Basic_Multilingual_Plane或Unicode圖表頁面的腳本部分 - http://www.unicode.org/charts/

可靠地確定字形的父語言由於共享符號的數量肯定更復雜。如果您只需要80%的準確度,您可以調整某些語言的範圍,以便在某些字符簡化您的範圍時故意包含/忽略某些字符。

編輯:我重新閱讀你引用CLDR的問題,以及關於代碼 - >語言映射的第一個答案。我認爲這絕對沒有問題,但如果計算成本很高,反向似乎是可行的。藉助巧妙的數據結構,您可以識別語言族,然後深入到實際的語言範圍,通過不相關的語言 - >範圍對來減少遍歷。

1

如果語言數量相對較少(或者您關心的數字相當小),則可以對每種語言使用布隆過濾器。布盧姆過濾器可以讓你做非常便宜的會員測試(可能會有誤報),而不必將所有成員(本例中爲代碼點)存儲在內存中。然後,通過檢查每個語言的預構造過濾器的代碼點來構建結果集。這是可以調整的 - 如果你得到太多的誤報,你可以使用一個更大尺寸的過濾器,代價是內存。

Python和Javascript有Bloom過濾器實現。 (嘿 - 我見過誰做這個傢伙http://www.jasondavies.com/bloomfilter/

布隆過濾器:http://en.m.wikipedia.org/wiki/Bloom_filter

做了一些更多的閱讀,如果你只需要BMP(65,536碼點),你可以只商店爲每種語言設置一個直接位。或者用於語言X代碼點的2D bitarray

你想考慮幾種語言?

+0

我其實非常喜歡使用布隆過濾器,並以各種語言維基的明文形式預先填充一組維基百科文章,但國際字符是如此之大;我感覺到k和m必須是令人厭惡的大。 –

+1

那麼,這取決於est對誤報的敏感程度,我猜 - 我認爲需要一些實驗才能找到最佳點(如果存在)。不過,我喜歡它簡單快捷。 – babbageclunk