Обработка проблем с кодировкой символов в Python с использованием NLTK

Я загрузил и очистил набор RSS-каналов для использования в качестве корпуса с NLTK для тестирования классификации. Но когда я запускаю частотное распределение, многие из лучших результатов кажутся специальными символами:

<FreqDist: '\x92': 494, '\x93': 300, '\x97': 159, ',\x94': 134, 'company': 124, '.\x94': 88, 'app': 84, 'Twitter': 82, 'people': 76, 'time': 73, ...>

Я попробовал предложение в вопросе здесь и инициализировал корпус таким образом (указав кодировку):

my_corpus = CategorizedPlaintextCorpusReader('C:\\rss_feeds', r'.*/.*', cat_pattern=r'(.*)/.*',encoding='iso-8859-1')
print len(my_corpus.categories())
myfreq_dist = make_training_data(my_corpus)

но это только изменило результаты на:

<FreqDist: u'\x92': 494, u'\x93': 300, u'\x97': 159, u',\x94': 134, u'company': 124, u'.\x94': 88, u'app': 84, u'Twitter': 82, u'people': 76, u'time': 73, ...>

Кодировка файла кода Python установлена:

# -*- coding: iso-8859-1 -*-

Для полноты картины я использую следующий код, чтобы преобразовать Corpus Reader в обучающие данные:

def make_training_data(rdr):
    all_freq_dist = []
    #take union of all stopwords and punctuation marks
    punctuation = set(['.', '?', '!', ',', '$', ':', ';', '(',')','-',"`",'\'','"','>>','|','."',',"'])
    full_stop_set = set(nltk.corpus.stopwords.words('english')) | punctuation
    for c in rdr.categories():
        all_category_words = []
        for f in rdr.fileids(c):
            #try to remove stop words and punctuation
            filtered_file_words = [w for w in rdr.words(fileids=[f]) if not w.lower() in full_stop_set]
            #add the words from each file to the list of words for the category
            all_category_words = all_category_words + filtered_file_words
        list_cat_fd = FreqDist(all_category_words), c
        print list_cat_fd
        all_freq_dist.append(list_cat_fd)
    return all_freq_dist

Когда я открываю сами файлы в Notepad++, он говорит, что они закодированы в ANSI.

В идеале я хотел бы удалить специальные символы и знаки препинания из списка слов перед созданием частотного распределения. Любая помощь будет принята с благодарностью.


person user2766185    schedule 26.09.2013    source источник
comment
это могут быть не специальные символы, это могут быть символы с диакритическими знаками. см. stackoverflow.com/questions/ 3328995/   -  person alvas    schedule 26.09.2013


Ответы (1)


Самым простым решением на данный момент кажется добавление еще одного набора символов (unicode_chars) к набору точек, который необходимо исключить перед генерацией частотного распределения:

punctuation = set(['.', '?', '!', ',', '$', ':', ';', '(',')','-',"`",'\'','"','>>','|','."',',"'])
other_words = set([line.strip() for line in codecs.open('stopwords.txt',encoding='utf8')])
unicode_chars = set([u',\u201d',u'\u2019',u'\u2014',u'\u201c',u'.\u201d',u'\ufffd', u',\ufffd', u'.\ufffd'])
full_stop_set = set(nltk.corpus.stopwords.words('english')) | punctuation | other_words | unicode_chars

а затем в цикле, как и раньше:

filtered_file_words = [w for w in rdr.words(fileids=[f]) if not w.lower() in full_stop_set]

Это может быть не самое красивое, но оно не позволяет странным персонажам учитываться в частотном распределении.

person user2766185    schedule 27.09.2013