2012-02-05 18 views
7

nltk eğitiminde açıklandığı gibi aşağıdaki yöntemi kullandığımda, bir Almanca belgedeki sözcükleri ayıklamaya çalışıyorum, sözcükleri dile özgü özel karakterlerle alamıyorum.Almanca'dan nltk kullanarak sözcükleri ayıklama

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

Belgedeki sözcüklerin listesini almak için ne yapmalıyım? "Ä" "ü" olmadığı halde, sınırlayıcı olarak kabul edilir Bu örnekte

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'] 

: gibi

alman ifade Veränderungen über einen Walzer için nltk.tokenize.WordPunctTokenizer() ile bir örnek görünüyor.

+2

? Giriş dosyalarınızın kodlamasını biliyor musunuz? – shenshei

+0

Ben örneğin, anormal 'ä' ayırıcı olarak kabul edilir Alman mektup ayrılan bir kelime listesini almak. kodlama 'utf-8'dir. PlaintextCorpusReader metni tokenize için unicode işlemek WordPunctTokenizer() kullanması nedeniyle – red

+0

çok garip. . Bana nltk.tokenize.WordPunctTokenizer() tokenize (u "Eğer arabası metin") kullanılarak hata bir EXEMPLE – shenshei

cevap

1

Basit bir düzenli ifadeyi deneyebilirsiniz. Sadece kelimeleri istiyorsanız aşağıdaki yeterlidir; re.U Yerele dayalı RE içinde \w anlamını değiştirir

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

Not olduğunu, böylece doğru ayarlanmış olduğundan emin olun: tüm noktalama yutacak. Örneğiniz için yeterince iyi olan en_US.UTF-8'a ayarlıyorum. Ayrıca, "Veränderungen über einen Walzer".decode("utf-8") ve u"Veränderungen über einen Walzer"'un farklı dizeler olduğunu unutmayın.

3

http://text-processing.com/demo/tokenize/ 'a göz atın. Metninizin doğru kodlamayı aldığından emin değilim çünkü demodaki WordPunctTokenizer kelimeleri iyi işlemektedir. Ve PunktWordTokenizer da öyle.

parametre kodlama = 'utf-8' ile
+0

verebilir Bunu kontrol ama örtük sorunu ele düşünüyorum: D. – red

11

Çağrı PlaintextCorpusReader:

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

Düzenleme:

a) sembolleştirmeyi sorun:: Test Anlıyorum ... Burada iki ayrı sorunları var Almanca, bir literal dize ile düşünün Eğer unicode girerek vardır. Aslında, python'a tırnaklar arasında baytını almasını ve bunları bir unicode dizesine dönüştürmesini söylüyorsunuz. Ancak baytlarınız yanlış yorumlanıyor. Düzeltme: kaynak dosyanızın en üstünde aşağıdaki satırı ekleyin.

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

Aniden senin sabitleri görülen ve doğru olarak simgeleþtirilmiþ edilecektir:

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

İkinci sorun: Bu Text() unicode kullanmaz çıkıyor! , bir unicode dizesini iletirse, ascii olmayan girdide elbette başarısız olan bir saf ascii dizesine dönüştürmeyi deneyecektir. Ugh.

Çözüm: Benim önerim tamamen nltk.Text kullanmaktan kaçınmak ve doğrudan corpus okuyucularla çalışmak olacaktır. (Bu genel olarak iyi bir fikirdir: Bkz. nltk.Text'un kendi belgeleri).

Ama eğer zorunluluk Alman verilerle kullanım nltk.Text, burada nasıl: geri str listesine o zaman simgeleþtirilmiþ edilebilir düzgün şekilde verilerini okuma, ancak "kodlamak" senin unicode. Almanca için, muhtemelen en güvenli sadece Latin-1 kodlamasını kullanmak, ama utf-8 de çalışıyor gibi görünüyor. yerine kelime listesinin olsun ne

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) 
+0

bu ben nltk.Text ile enkapsüle zaman ": aralığı (128) 'de değil sıralı 'ascii' codec bileşeni 2. konumda karakter u '\ XDF adresine yönlendirilir' kodlamak olamaz" olsun, bana kelime listesini verir. Bence bu bir kod çözme kod çözme problemidir. – red

+0

Kesinlikle bir kodlama sorununuz var, ya da iki tane var. Güncellenen cevaba bakınız. – alexis