分類をテストするために、NLTK を使用してコーパスとして使用する RSS フィードのセットをダウンロードしてクリーンアップしました。しかし、度数分布を実行すると、上位の結果の多くが特殊文字のように見えます。
<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 -*-
完全を期すために、次のコードを使用してコーパス リーダーを操作してトレーニング データを作成します。
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 でエンコードされていると表示されます。
理想的には、頻度分布を生成する前に単語リストから特殊文字と句読点を削除したいと考えています。どんな助けでも大歓迎です。