blog.Ring.idv.tw

Open Source

Universal Encoding Detector - 編碼偵測(Python)

什麼時候我們需要做「編碼偵測」的動作呢?最明顯的例子不外乎就是「瀏覽器」~ 假設我們的網頁沒附上「<meta http-equiv="Content-Type" content="text/html;charset=utf-8">」這樣的字句~ 那Browser還能有足夠的能力偵測此網頁是用何種編碼的嗎?

再舉另一個例子~ 當我們寫了一個Crawler來爬行網頁的同時~ 在下載這些網頁之後~ 我們又該如何得知這些網頁的編碼呢?

所以~ 「編碼偵測」算是處理文字資訊前的必要動作~ 而「Universal Encoding Detector」就提供了一個這麼好的工具~ 當然也是給它Open Source的嚕~ 不過這是針對Python語言的~ 當然也還有其它的解決方案~ 就請參考相關資源!

Universal Encoding Detector

Universal Encoding Detector」目前的版本是1.0.1版~ 而在使用它之前必須先安裝在你的電腦~

下載:chardet-1.0.1.tgz

安裝過程如下:

tar zxvf chardet-1.0.1.tgz
cd chardet-1.0.1
setup.py build
setup.py install

接著就給它寫一個簡單的測試程式:

import urllib2, chardet

if __name__ == "__main__":
	urlread = lambda url: urllib2.urlopen(url).read()
	running = True
	while running:
		str = raw_input('Please enter a url: ')
		if str == 'q':
			running = False
		else:
			print chardet.detect(urlread(str))
	else:
		print 'Done'

測試結果:

Please enter a url: http://www.google.com.cn
{'confidence': 0.98999999999999999, 'encoding': 'GB2312'}
Please enter a url: http://blog.ring.idv.tw
{'confidence': 0.98999999999999999, 'encoding': 'utf-8'}
Please enter a url: http://www.cnn.com
{'confidence': 1.0, 'encoding': 'ascii'}
Please enter a url: q
Done

相關資源

中文編碼偵測 || William's Blog

A composite approach to language/encoding detection

大步向前走: Programming 自動偵測編碼

Shared Development: Character encoding detection

Java port of Mozilla charset detector

cpdetector, free java code page detection.

2008-09-29 03:11:15 | Add Comment

How to Write a Spelling Corrector in Python

最近忙著比賽的事項~ 所以有點久沒有來po文了~ XDD~

How to Write a Spelling Corrector.這是今天Lab所發出來的訊息~ 重點就在於「Spelling Corrector」拼字檢查器,就類似像Google所提供的功能~ 當我們拼字錯誤時,它能提供建議修正~ 詳細的演算法請參考上述網頁資源~

底下我加上一些小程式方便測試:

import re, collections

def words(text):
	return re.findall('[a-z]+', text.lower()) 

def train(features):
	model = collections.defaultdict(lambda: 1)

	for f in features:
		model[f] += 1

	return model

NWORDS = train(words(file('big.txt').read()))

alphabet = 'abcdefghijklmnopqrstuvwxyz'
def edits1(word):
	n = len(word)
	return set([word[0:i]+word[i+1:] for i in range(n)] +                     # deletion
	           [word[0:i]+word[i+1]+word[i]+word[i+2:] for i in range(n-1)] + # transposition
	           [word[0:i]+c+word[i+1:] for i in range(n) for c in alphabet] + # alteration
	           [word[0:i]+c+word[i:] for i in range(n+1) for c in alphabet])  # insertion

def known_edits2(word):    
	return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS)

def known(words): 
	return set(w for w in words if w in NWORDS)

def correct(word):    
	candidates = known([word]) or known(edits1(word)) or known_edits2(word) or [word]
	return max(candidates, key=lambda w: NWORDS[w])

if __name__ == "__main__":
	running = True
	while running:
		str = raw_input('Please input a word: ')
		if str == 'q':
			running = False
		else:
			print correct(str)
	else:
		print 'Done'

執行結果:(按Q離開程式)

C:\>corrector.py
Please input a word: speling
spelling
Please input a word: korrecter
corrected
Please input a word: q
Done

執行效率似乎還蠻快的~ 有空再來深入看看~ 不過我想是沒空了...... XD

原始檔下載(含索引檔)

2008-07-22 01:00:34 | Comments (2)

Windows平臺上玩Hadoop - Local Mode

由於學校下學期有門NLP課程要全程使用「Hadoop」來授課,為了開發方便~ 所以這裡介紹如何在Windows平臺上來玩Hadoop~

作業環境

.Windows XP Home Edition

Hadoop 0.17.1

JDK 6 Update 7

環境設置

.設定「JAVA_HOME」環境變數

.安裝Cygwin -- 可參考「如何安裝Cygwin

.設定「Cygwin/bin」至「PATH」環境變數

.將「hadoop-0.17.1.tar.gz」搬移至「C:\cygwin\home\家目錄」。

Hadoop設定

開始啟動「Cygwin」之後,先切換到「家目錄」解壓縮「hadoop-0.17.1.tar.gz」。

tar zxvf hadoop-0.17.1.tar.gz

執行Hadoop範例

這裡我們用一個簡單的「WordCount」來測試~

mkdir input
cd input
echo "hello world bye hello" > file1.txt
echo "hadoop hello goodbye hadoop" > file2.txt
cd..

然後執行下述指令:

bin/hadoop jar hadoop-0.17.1-examples.jar wordcount input output

看看結果吧~

cat output/*
bye     1
goodbye 1
hadoop  2
hello   3
world   1

相關資源

Hadoop/Windowsでの実行

Hadoop Quickstart

H_Yamaguchi日記

Running Hadoop on Windows

Running Hadoop On OS X 10.5 64-bit (Single-Node Cluster)

How to install OpenSSH sshd server and sftp server on a Windows 2000 or Windows XP or Windows Vista

Setting up a Single-Node Hadoop "Cluster" on Windows XP

2008-07-16 18:25:53 | Comments (13)

Android - Dump your .dex file

由於對於「Google Android」不甚熟悉,所以在上一篇的po文「初探Google Android」我不了解如何Dump出「.dex」檔案中所包含的opcode,還因此麻煩院內的同事(avain) ^^a 幫我詢問相關的資源,雖然沒有直接的解決我所要的需求,不過也提供我一個Google在五月底舉辦的Google I/O所發佈的Dalvik handouts,感謝呢! ^^

還好,今天終於發現了解決方案,原來Android OS就提供了一個「dexdump」的小工具,所以我們可以利用Android SDK所提供的「Android Debug Bridge (adb)」工具來操控Android Emulator,並透過remote shell command來達成我們的需求~

由於我先前已經開發了一個簡單的Android App來測試,所以現在直接啟動Android Emulator,然後執行Android SDK所提供的「Android Debug Bridge (adb)」工具來操作,而我只要輸入下列指令即可Dump出來:

adb shell dexdump -d -f -h /data/dalvik-cache/data@[email protected]@classes.dex > FirstAndroid.txt

接下來就花點時間去讀懂它了~ XDD

........................
source_idx    : 7 (FirstAndroid.java)
insns         : 17 16-bit code units
0004b4:                                        |[0004b4] tw.idv.ring.FirstAndroid.onCreate:(Landroid/os/Bundle;)V
0004b8: fa02 5800 3200                         |0000: +invoke-super-quick {v2, v3}, [0058] // vtable #0058
0004be: 2100 0200                              |0003: new-instance v0, Landroid/widget/TextView; // class@0002
0004c2: 7002 0200 2000                         |0005: invoke-direct {v0, v2}, Landroid/widget/TextView;.<init>:(Landroid/content/Context;)V // method@0002
0004c8: 1801 0000                              |0008: const-string v1, "Hello, Android" // string@0000
0004cc: f802 1e01 1000                         |000a: +invoke-virtual-quick {v0, v1}, [011e] // vtable #011e
0004d2: f802 6f00 0200                         |000d: +invoke-virtual-quick {v2, v0}, [006f] // vtable #006f
0004d8: 0e00                                   |0010: return-void
exceptions    : (none)
positions     : 
        0x0000 line=11
........................

相關資源

{HOWTO} Poke into the dex file

How to decompile .dex file on Android

2008-07-15 23:13:19 | Add Comment

初探Google Android

有一陣子沒碰Google Android,不過自從上次聽完Google Developer Day之後,對於Dalvik virtual machine內部的設計以及不同於JVM所客製化設計的「Shared Constant Pool」就一直抱持著想一探究竟的興趣~ 所以今天簡單的試了一下~ 想看看這樣以Register-based VM在opcode上面的執行情況是如何~

我用Google Android SDK所提供的小工具「dx」來看看「.dex」(Dalvik Executable)的檔案格式~

dx --verbose-dump --dex --dump-to=FirstAndroid.dump FirstAndroid.class

不過為何那一個個opcode都被「code-address」所取代掉了...?

....................
                           |codes:
0001c8: 0400 0000          |[1c8] tw.idv.ring.FirstAndroid.<init>:()V
                           |0000: code-address
                           |0000: code-address
                           |0000: code-address
                           |0000: code-address
                           |0000: code-address
                           |0000: code-address
0001cc: 7001 0000 0000     |0000: invoke-direct {v0}, android.app.Activity.<init>:()V // method@0000
                           |0003: code-address
                           |0003: code-address
0001d2: 0e00               |0003: return-void
                           |0004: code-address
                           |debug info @ [2f9]
                           |line starts at 7
                           |00000000: prologue end
                           |00000000: line 7
                           |End Sequence
....................

有人知道怎麼dump出這些「.dex」格式所對應的opcode嗎?

我不是很了解整個Android~ 希望有人可以分享~ ^^

相關資源

{Google Code} Android - An Open Handset Alliance Project

2008-07-11 23:20:33 | Add Comment

Next Posts~:::~Previous Posts
Copyright (C) Ching-Shen Chen. All rights reserved.

::: 搜尋 :::

::: 分類 :::

::: Ads :::

::: 最新文章 :::

::: 最新回應 :::

::: 訂閱 :::

Atom feed
Atom Comment