Подтвердить что ты не робот

Tokenizing unicode с помощью nltk

У меня есть текстовые файлы, которые используют кодировку utf-8, которые содержат символы, такие как "ö", "ü" и т.д. Я хотел бы проанализировать текстовую форму этих файлов, но я не могу заставить токенизатор работать правильно. Если я использую стандартный токенизатор nltk:

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)

Выход: [u'\ufeff', u'm', u'\xfc', u'sli', u'p', u'\xf6', u'\xf6', u'k', u'r', u'\xe4', u'\xe4', u'k']

Пункт токенизатор, похоже, работает лучше:

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)

вывод: [u'\ufeffm\xfcsli', u'p\xf6\xf6k', u'r\xe4\xe4k']

До первого токена все еще есть '\ ufeff', который я не могу понять (не то, что я не могу его удалить). Что я делаю не так? Помогите с благодарностью.

4b9b3361

Ответ 1

Скорее всего, что \uFEFF char является частью содержимого, считанного из файла. Я сомневаюсь, что он был вставлен токенизатором. \uFEFF в начале файла - это устаревшая форма "Знак порядка байтов" . Если он появляется где-то еще, то он рассматривается как нулевая ширина без пробелов.

Был ли файл написан Microsoft Notepad? Из модуль кодеков docs:

Чтобы повысить надежность, с которой может быть обнаружена кодировка UTF-8, Microsoft придумала вариант UTF-8 (который Python 2.5 вызывает "utf-8-sig" ) для своей программы "Блокнот": перед любым символом Unicode записывается в файл, кодированная кодировка UTF-8 (которая выглядит как последовательность байтов: 0xef, 0xbb, 0xbf).

Попробуйте прочитать файл codecs.open(). Обратите внимание на кодировку "utf-8-sig", которая использует спецификацию.

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

Эксперимент:

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

Ответ 2

Вы должны убедиться, что вы передаете строки unicode в токенизаторы nltk. Я получаю следующие идентичные токенизации вашей строки с обоими токенизаторами на моем конце:

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

код UFEE является символом "ZERO WIDTH NO-BREAK SPACE", и это не рассматривается как пространство модулем re, поэтому PunktWordTokenizer(), которые используют регулярное выражение r'\w+|[^\w\s]+' с unicode и dotall flags, распознают этот символ как слово. Если вы не хотите удалять символ вручную, вы можете использовать следующий токенизатор:

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