La creazione di token unicode utilizzando nltk

Ho textfiles che utilizza la codifica utf-8 che contengono caratteri come ‘ö’, ‘ü’, etc. Vorrei analizzare il testo forma di questi file, ma non riesco a ottenere il tokenizer per funzionare correttamente. Se io uso standard nltk tokenizer:

f = open('C:\Python26\text.txt', 'r') # text = 'müsli pöök rääk'
text = f.read()
f.close
items = text.decode('utf8')
a = nltk.word_tokenize(items)

Di uscita: [u'\ufeff', u'm', u'\xfc', u'sli', u'p', u'\xf6', u'\xf6', u'k', u'r', u'\xe4', u'\xe4', u'k']

Punkt tokenizer sembra fare di meglio:

f = open('C:\Python26\text.txt', 'r') # text = 'müsli pöök rääk'
text = f.read()
f.close
items = text.decode('utf8')
a = PunktWordTokenizer().tokenize(items)

di uscita: [u'\ufeffm\xfcsli', u'p\xf6\xf6k', u'r\xe4\xe4k']

C’è ancora “\ufeff ” prima il primo token che io non riesco a capire (non che io non riesco a toglierlo). Che cosa sto facendo di sbagliato? Aiuto molto apprezzato.

InformationsquelleAutor root | 2012-02-10



3 Replies
  1. 20

    È più probabile che il \uFEFF char è una parte del contenuto di leggere dal file. Il dubbio mi e ‘ stato inserito dal tokeniser. \uFEFF all’inizio di un file è obsoleta forma di Byte Order Mark. Se compare qualsiasi altro luogo, quindi è considerato come un larghezza zero non rompere spazio.

    Era il file scritto da blocco note di Microsoft? Da il codec modulo docs:

    Per aumentare l’affidabilità con cui la codifica UTF-8 può essere rilevato, Microsoft ha inventato una variante di UTF-8 (che Python 2.5 chiama “utf-8-sig”) per il suo programma blocco note: Prima di qualsiasi di caratteri Unicode viene scritto il file, una codifica UTF-8 DISTINTA materiali (che assomiglia a questo come una sequenza di byte: 0xef, 0xbb, 0xbf) è scritto.

    Provare a leggere il file utilizzando codec.open() invece. Nota il "utf-8-sig" di codifica che consuma BOM.

    import codecs
    f = codecs.open('C:\Python26\text.txt', 'r', 'utf-8-sig')
    text = f.read()
    a = nltk.word_tokenize(text)

    Esperimento:

    >>> open("x.txt", "r").read().decode("utf-8")
    u'\ufeffm\xfcsli'
    >>> import codecs
    >>> codecs.open("x.txt", "r", "utf-8-sig").read()
    u'm\xfcsli'
    >>> 
    • Grazie. Il codice fa il trucco rimozione \uFEFF
    • Sei il benvenuto. Contento di aver potuto aiutare.
    • Mi ha aiutato, troppo. Molte grazie!
  2. 13

    È necessario assicurarsi che si sta passando stringhe unicode nltk tokenizers. Ho il seguente identici tokenizations di una stringa con entrambi tokenizers sul mio fine:

    import nltk
    nltk.wordpunct_tokenize('müsli pöök rääk'.decode('utf8'))
    # output : [u'm\xfcsli', u'p\xf6\xf6k', u'r\xe4\xe4k']
    
    nltk.word_tokenize('müsli pöök rääk'.decode('utf8'))
    # output: [u'm\xfcsli', u'p\xf6\xf6k', u'r\xe4\xe4k']
  3. 4

    l’UFEE codice è “ZERO LARGHEZZA NO-BREAK SPAZIO” tipo di carattere e questo non è considerare come uno spazio da re modulo, in modo che il PunktWordTokenizer() che usare le regex r'\w+|[^\w\s]+' con unicode e dotall bandiere riconoscere questo carattere di una parola. Se non si desidera rimuovere il carattere manualmente, è possibile utilizzare il seguente tokenizer:

    nltk.RegexpTokenizer(u'\w+|[^\w\s\ufeff]+')

Lascia un commento