簡體   English   中英

用德語文本中的nltk提取單詞

[英]Extracting Words using nltk from German Text

我試圖從德語文檔中提取單詞,當我使用nltk教程中描述的以下方法時,我無法獲得具有特定語言特殊字符的單詞。

ptcr = nltk.corpus.PlaintextCorpusReader(Corpus, '.*');
words = nltk.Text(ptcr.words(DocumentName))

如何獲取文檔中的單詞列表?

nltk.tokenize.WordPunctTokenizer()用於德語短語Veränderungen über einen Walzer如下所示:

In [231]: nltk.tokenize.WordPunctTokenizer().tokenize(u"Veränderungen über einen Walzer")

Out[231]: [u'Ver\xc3', u'\xa4', u'nderungen', u'\xc3\xbcber', u'einen', u'Walzer']

在這個例子中,“ä”被視為分隔符,即使“ü”不是。

使用參數encoding ='utf-8'調用PlaintextCorpusReader:

ptcr = nltk.corpus.PlaintextCorpusReader(Corpus, '.*', encoding='utf-8')

編輯:我明白了......你有兩個不同的問題:

a)標記化問題:當您使用德語的文字字符串進行測試時,您認為您正在輸入unicode。 事實上,你告訴python取引號之間的字節並將它們轉換為unicode字符串。 但你的字節被誤解了。 修復:在源文件的最頂部添加以下行。

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

突然間,您的常量將被正確顯示和標記:

german = u"Veränderungen über einen Walzer"
print nltk.tokenize.WordPunctTokenizer().tokenize(german)

第二個問題:事實證明Text()不使用unicode! 如果你傳遞一個unicode字符串,它會嘗試將它轉換為pure-ascii字符串,當然在非ascii輸入上失敗。 啊。

解決方案:我的建議是完全避免使用nltk.Text ,並直接使用語料庫閱讀器。 (這通常是一個好主意:請參閱nltk.Text自己的文檔)。

但是如果你必須nltk.Text與德國數據一起使用,請nltk.Text方法:正確讀取數據以便對其進行標記化,然后將你的unicode“編碼”回str列表。 對於德語,使用Latin-1編碼可能是最安全的,但utf-8似乎也有效。

ptcr = nltk.corpus.PlaintextCorpusReader(Corpus, '.*', encoding='utf-8');

# Convert unicode to utf8-encoded str
coded = [ tok.encode('utf-8') for tok in ptcr.words(DocumentName) ]
words = nltk.Text(coded)

看一下http://text-processing.com/demo/tokenize/我不確定你的文本是否得到正確的編碼,因為演示中的WordPunctTokenizer處理的話很好。 PunktWordTokenizer也是如此。

您可以嘗試一個簡單的正則表達式。 如果你只想要單詞,以下就足夠了; 它將吞下所有標點符號:

>>> import re
>>> re.findall("\w+", "Veränderungen über einen Walzer.".decode("utf-8"), re.U)
[u'Ver\xe4nderungen', u'\xfcber', u'einen', u'Walzer']

請注意, re.U根據當前區域設置更改RE中\\w的含義,因此請確保正確設置。 我把它設置為en_US.UTF-8 ,這對你的例子來說顯然已經足夠了。

另請注意, "Veränderungen über einen Walzer".decode("utf-8")u"Veränderungen über einen Walzer"是不同的字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM