快快樂樂學 Python – 由 Ferret 與 PyLucene 談起

2006/11/14
By

標題當然是假的,又不是天才,怎麼快快樂樂學 Python 。也不是要出書,只是不知道要下什麼標題。

事情由來是這樣的,我在 survey 在 FreeBSD 上可以 run 的 lucene 程式,原本中意的是 ferret(1) ,不過看了一下文件發現

  1. API 不相容
  2. 不能讀 dotLucene(2) 的 index ,其實意思就是跟原生的 Java lucene 不相容啦

基於上述兩個理由,我只好含淚斬 Ruby 了。不然上面那個標題就會是「快快樂樂學 Ruby」了。

Python 有個 PyLucene 可以用,而它其實有點接近原生版本的 Lucene ,因為

  1. API 大致相容,說大致是因為我才剛學,不敢保證
  2. 可以 access dotLucene 的 index file ,這很重要,敝實驗室的流派就是點點點(3)
  3. 它是用 gcj 編譯的,感覺會比 Java 快一點,而我也可以確定大部份的功能是相同的。籠統地說,算是 Lucene 的 Python-binding 。

不過說要學個語言不是那麼容易,雖然說比起英語德語加法語來說,學個程式語言比較起來容易太多了,可是沒有個入門文件也是不行的。上網一查「Python」,結果台灣陣亡,第一頁最有用的就是第一筆: Python 教學文件。這可以位在香港的,看來我以前沒學 Python 也不能怪自己,資源少的可憐的感覺,隨隨便便要找個論壇都還來個 404 。

有了入門文件,沒有個中文文件是不行的。在我安裝了 PyLucene 之後,發現要查找中文還真是不可能的任務。程式一 run 下去就來個

SyntaxError: Non-ASCII character xxx’ in file xxxx.py on line xx, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details

的訊息,當然人家在 error message 都給了資料了,不去看一下也不對吧。所以,找出原因,只要在程式碼中加入

# -*- coding: utf-8 -*-

就沒事了。…當然不會就這樣沒事,結果你不找問題,問題還是會找上你:

UnicodeEncodeError: ‘ascii’ codec can’t encode character …..

這就糗大了,它又沒說要怎麼辦?只好再次求助 Google 了。結論是,在字串後面加上 .encode("utf-8″) 就可以了。(現在大家都老大不小了,應該改用 utf-8 了吧)

當然在做 Text Processing 的人,少不了要用到 Regular Expression,那入門文件當然是沒有啦。目前我是正在看這裡,如果有人可以指點一二的,也麻煩告訴我一下吧。 :)

先就這樣吧,反正趁有點小空的時候來學學 Python 也不錯,希望以後可以快快樂樂啦。

Reference:

[tags] python, ferret, pylucene, lucene [/tags]

  1. ruby 版的 lucene[back]
  2. dotNet 版的 lucene[back]
  3. 甚麼?不不不,我們不是兄弟象[back]

Tags: , , ,

11 Responses to 快快樂樂學 Python – 由 Ferret 與 PyLucene 談起

  1. tcc on 2006/11/16 at 7:18 下午

    「Python 教學文件」是很好的入門文件,畢竟過了這麼多年,Python 也長大不小,就蠻需要 http://www.python.org/doc/ 加持。

    如果常查閱參考文件,也剛好用 Firefox 的話,與 Trac 同家公司的傢私 http://www.edgewall.org/python-sidebar/ 可考慮裝一下。

    也是看 Kunchling 先生的文件長大(咦?)。另外 Mertz 先生的書 Text Processing in Python http://gnosis.cx/TPiP/ 涵蓋、彙整更多文字處理的主題 … 用 .txt 有點嚇人就是了。

  2. clsung on 2006/11/18 at 3:45 下午

    這, 實在是太謝謝你了 :D

  3. yungyuc on 2006/11/22 at 9:37 下午

    在 Python 裡面有兩種字串物件:str 和 unicode。str 可以使用各式各樣的編碼,包括 UTF-8, UTF-16,而 unicode 就是 Unicode。

    如果需要在不同編碼間轉換,我通常會這樣作:

    # -*- coding: UTF-8 -*-
    uni = "萬國碼".decode(‘UTF-8′)
    big5str = uni.encode(‘Big5′)
    sjisstr = uni.encode(‘S-JIS’)

  4. clsung on 2006/11/24 at 9:24 上午

    謝謝,不過請教一下,Unicode 包含 UTF-8, UTF-16, UTF-32,那 python 的 Unicode 是?

  5. yungyuc on 2006/11/24 at 11:49 下午

    我想 Python 的 unicode 物件沒存 UTF-*,而是直接存 code point (refer to http://effbot.org/zone/unicode-objects.htm and http://docs.python.org/lib/encodings-overview.html)。

  6. clsung on 2006/11/27 at 8:47 上午

    To yungyuc :
    謝謝 :)

  7. qrtt1 on 2006/12/07 at 3:04 下午

    如果在linux下可以這樣執行
    LC_ALL=zh_TW.utf8 python script.py
    因為你除了定義code encoding之外
    python執行時的自動編碼會使用環境變數裡的設定
    所以, 如果你預設非utf8時,
    他就會試著轉成你環境變數中的編碼
    但是其他編碼的set似乎都比unicode小:)
    只要對應不到就會出包了

  8. Hi! I'm clsung on 2007/05/18 at 10:56 上午

    快快樂樂學 Ruby – 再談 Ferret…

    這只是為了要呼應之前的舊文章…

    話說昨天早上到了實驗室,發現 b6s 前一晚留給我有關 Ferret 的訊息。兩點,第一是 lukhnos實作了 Ferret 處理中文的方法,在這裡。當然,處理中文很重要….

  9. Hi! I'm clsung on 2008/04/10 at 2:34 下午

    PyLucene Win32 on googlecode…

    ……

  10. Clarence on 2009/02/13 at 3:35 下午

    請問可不可以讓我下載那個文件,讓我離線時也可以看,謝謝!

  11. clsung on 2009/02/15 at 2:02 下午

    啊?什麼文件?

發表迴響

您的電子郵件位址並不會被公開。 必要欄位標記為 *

*


*