2010-02-11 129 views
3

我想檢測文本中的單詞,即我需要知道給定文本中的哪些字符是字母,也就是說它們可以是(說出的)單詞的一部分,另一方面是標點符號等。如何判斷哪些unicode字符是字母(單詞)還是標點符號?

例如,在上述句子中,「I」,「want」,「i」和「e」是這方面的詞,而空格「。」和逗號不是。

這樣做的困難在於我希望能夠讀取任何基於Unicode的腳本。例如,德語單詞「schön」是一個單詞。但是希臘,阿拉伯或日本呢?

所以,我需要的是一個表或列表,指定可以形成單詞的所有字符範圍。可選地,我也想知道哪些字符是可以形成數字的數字(假設其他腳本具有與阿拉伯數字相似的編號方案)。

我需要這個用於Mac OS X,Windows和Linux。我會編寫一個C應用程序,因此它需要是一個操作系統庫或一個完整的代碼/數據解決方案,我可以將其轉換爲C.我知道Mac OS(Cocoa)提供了用於此目的的功能,不過我不確定是否有類似的Win和Linux解決方案(基於gtk,可能?)。

另外,如果我有完整的表格,我可以編寫自己的代碼。

我發現了Unicode圖表(http://unicode.org/charts/index.html#scripts),但這並不是我可以在編程中使用的一種方便的形式。

那麼,有人能告訴我是否有Windows和Linux的功能,或者我可以在unicode中找到一個完整的表格/字符列表?

+0

什麼語言(S)? – 2010-02-11 23:00:27

回答

4

您可以嘗試使用Unicode character category來找出分隔符可能是什麼,但請注意,某些語言(例如日語)甚至沒有字詞分隔符。

+0

是的,那是我正在尋找的那種桌子。 現在,這個文件信息的大小看起來不太可靠。例如,它沒有聲明其來源(例如,它基於哪個unicode版本),或者它是否完整。我怎麼知道這不僅僅是一個收集了他自己需要的東西,而是跳過所有醜陋的休息的人? – 2010-02-11 23:06:59

+1

你必須解析原始數據文件(http://www.unicode.org/Public/5.2.0/ucd/)以獲取整個事情。此外,一些Python等語言已經將其用於方便的格式(http://docs.python.org/library/unicodedata.html)。 – 2010-02-11 23:17:38

1

如果您對Python完全熟悉,則Natural Language Toolkit提供了可以跨語言完成此操作的chunkers /詞法工具。我假裝在這裏很聰明,並告訴你更多,但我知道的一切都是this book,我強烈建議。我意識到你可以使用正則表達式編寫技術解決方案,它可以讓你80%的路徑到達你想要的位置,但爲什麼要重新發明輪子?

+0

我不認爲我可以期望一個標準的正則表達式通過像「\ w」這樣的東西來識別希臘字符。所以我不得不一一填寫所有可能的字母代碼。但首先我必須要有這個清單。 – 2010-02-11 23:06:42

+1

有一些正則表達式引擎(包括可選的Python)實現了'\ w'等的Unicode字符數據庫。有些還有更豐富的'\ p {...}'字符類選擇器。 – bobince 2010-02-11 23:40:31

+0

是的,請參閱Python的're'模塊文檔。它具有're.UNICODE',正如它所說的那樣,「使\ w,\ w,\ b,\ B,\ d,\ D,\ s和\ S依賴於Unicode字符屬性數據庫。 http://docs.python.org/library/re.html – 2010-02-12 04:15:22

0

的c運行時具有

  • ispunct()是標點字符
  • isctrl()是控制字符。
+1

那些通常可以很好地處理本地8位字符集,而不是使用可能存在各種腳本和語言的Unicode文本。 – 2010-02-11 23:20:00

+0

MSVC版本處理unicode – 2010-02-12 00:50:37

0

在Java中,有static int java.lang.Character.getType(int codePoint)可以相比,在相同的類提供的常量,像這樣:

switch(Character.getType(codePoint)) { 
    case Character.UPPERCASE_LETTER: 
    case Character.LOWERCASE_LETTER: 
    case Character.TITLECASE_LETTER: 
    case Character.MODIFIER_LETTER: 
    case Character.OTHER_LETTER: 
     // you found a letter 
    break; 
    case Character.NON_SPACING_MARK: 
     // you found a combining diacritical mark 
     // see: https://en.wikipedia.org/wiki/Combining_character 
    break; 
    default: 
     // you found other symbols 
    break; 
} 
相關問題