2010-02-09 104 views
6

我正在使用Python 3.1,但如果需要可以降級。Python - 字母頻率計數和轉換

我有一個ASCII文件,其中包含用其中一種語言編寫的短故事,其中的字母表可以用上和下ASCII表示。我想:

1)檢測的編碼,以我的能力,得到某種信心指標的(會根據文件的長度發生變化,右)

2)自動整個翻譯?使用一些免費的在線服務或圖書館的東西。

附加問題:如果文本是用2個或更多字節表示一個字母並且字節順序標記不能幫助我的語言編寫的呢?

最後,我該如何處理標點和misc等字符,如空格?它會比一些字母發生得更頻繁,對吧?標點符號和人物有時可能會混在一起 - 可能有逗號的兩種表示,看起來像「a」的兩種表示等等,這一事實如何?我已閱讀。請幫助我至少一些這些項目。

謝謝!

P.S.這不是一項家庭作業,但它是爲了自我教育的目的。我更喜歡使用開放源代碼和可讀的字母頻率庫,而不是那種封閉,高效的,但可以很好地完成工作的函數庫。

回答

2

本質上有來實現所描述的應用程序的三個主要任務:

  • 1a)中識別輸入文本
  • 1b的字符編碼)確定輸入的文本
  • 2)獲取的內容。通過其中一種在線服務的文本翻譯文本'API

對於1a,除了腳本本身,您可能想看看decodeh.py提供了很多關於字符集和編碼的非常有用的資源。 CharDet,在其他答案中提到的似乎也值得考慮。

一旦字符編碼已知,如您所建議的那樣,您可以通過計算文本的字符頻率輪廓並將其與已知頻率進行匹配來解決1b)。雖然簡單,但這種方法通常提供了一個體面的精確度比率,儘管在較短的文本以及遵循特定模式的文本上可能較弱;例如法文文本中對米制系統中的單位的許多參考將具有字母M,K和C的異常高比例。

一種互補且非常相似的方法,使用雙克(兩個字母的序列)和三元組(三個字母)以及相應的各種語言的頻率分佈參考表。

其他語言檢測方法涉及標記文本,即考慮文本內的文字。 NLP資源包括各種語言中使用最多的詞彙表。這些詞通常是文章,所有格形容詞,副詞等。

語言檢測的另一種解決方案是依靠在線翻譯服務爲我們解決這個問題。重要的是爲翻譯服務提供文本,並將其編碼爲可理解的字符,如果語言可能是多餘的話。

最後,儘可能多的實際NLP應用程序,您可能決定實施多個解決方案。通過使用策略設計模式,可以按特定順序應用多個過濾器/分類器/步驟,並根據情況在不同點退出該邏輯。例如,如果一個簡單的字符/雙字母頻率匹配文本與英文(偏差很小),那麼可以停止在那裏。否則,如果猜測的語言是法語或德語,執行另一個測試,等等,等等

1

如果你有一個ASCII文件,那麼我可以100%自信地告訴你它是用ASCII編碼的。除此之外,請嘗試chardet。但是知道編碼並不足以確定它所處的語言。

至於多字節編碼,處理它的唯一可靠方法是希望它具有拉丁字母表中的字符並查找哪一個對具有NULL。除非你知道更好(Shift-JIS,GB2312等),否則視其爲UTF-8。

哦,和UTF-8。 UTF-8,UTF-8,UTF-8。我不認爲我可以強調這一點。如果我沒有... UTF-8。

+0

謝謝。請詳細說明第二段。我想我的編碼知識並不像我想的那麼深。 – 2010-02-09 23:45:14

+2

有人說UTF-8?! – jathanism 2010-02-10 00:11:05

2

字頻率是相當直截了當

我只注意到你正在使用Python3.1所以這是更容易

>>> from collections import Counter 
>>> Counter("Μεταλλικα") 
Counter({'α': 2, 'λ': 2, 'τ': 1, 'ε': 1, 'ι': 1, 'κ': 1, 'Μ': 1}) 

對於舊版本的Python:

>>> from collections import defaultdict 
>>> letter_freq=defaultdict(int) 
>>> unistring = "Μεταλλικα" 
>>> for uc in unistring: letter_freq[uc]+=1 
... 
>>> letter_freq 
defaultdict(<class 'int'>, {'τ': 1, 'α': 2, 'ε': 1, 'ι': 1, 'λ': 2, 'κ': 1, 'Μ': 1}) 
+0

Metallika,哈哈。嗯,是的,我可以計算一種我稱之爲「天真」的頻率,但是我怎樣才能將這種分佈與一些已知的頻率進行比較? – 2010-02-09 23:55:09

1

我提供一些有條件的答案,但是你的問題是有點含糊和不一致。請編輯您的問題以提供以下問題的答案。

(1)你說文件是ASCII文件但你想檢測一個編碼?咦?是不是答案「ascii」?如果您確實需要檢測編碼,請使用chardet

(2)自動翻譯什麼?編碼?語言?如果使用語言,你知道輸入語言是什麼嗎?或者你是否想要檢測它?要檢測語言,請嘗試guess-language ...請注意,它需要調整以更好地檢測日語。請參閱this SO topic,其中注意到日語問題,並強調對於任何語言猜測者,您需要從文本中刪除所有HTML/XML/Javascript /等噪聲,否則會嚴重偏向僅英語(或加泰羅尼亞語) !)。

(3)你在談論一個「字母頻率庫」......你打算用這個庫來做什麼?如果猜測語言,看起來使用單個字母的頻率並不能幫助區分使用相同(或幾乎相同)字符集的語言;需要使用三個字母組(「trigrams」)的頻率。

(4)您對標點符號和空格的問題取決於您的目的(我們還不確定)。如果目的是語言檢測,那麼想法是將文本標準化;例如用單個空格替換所有不是(字母或撇號)的運行,然後刪除任何前導/尾隨空格,而不是添加1個前導空格和1個尾部空格 - 通過將單詞bigrams的開始/結束視爲卦來獲得更高的精度。請注意,像所有文本處理一樣,您應立即將輸入解碼爲unicode,然後使用unicode進行處理。