データの読み取りとデータ分析
データの読み取り
質問データはテキストデータですが、各ニュースの長さは可変ですが、それでもcsv形式で保存されます。したがって、Pandasを直接使用してデータ読み取り操作を完了することができます。
import pandas as pd
train_df = pd.read_csv('train_set.csv', sep='\t', nrows=100)
#这里的read_csv由三部分组成,第一个为路径,第二个为分割符,第三个为读取行数(这里训练集比较大,因此就先读取少部分)。
Pandasでデータを読み取った後、データが正確に読み取られているかどうかを確認したいことがよくあります。これには、Pandasのhead()関数が必要です。
ここでは、head関数に関連する5行のデータのみが表示される理由を説明します。
DataFrame.head(n=5)
Return the first n rows.
Parameters: n : int, default 5
Number of rows to select.
Returns: obj_head : type of caller
The first n rows of the caller object.
head関数はデフォルトで5行を読み取ることがわかります。
上記のデータでは、表は最初の列がニュースタイプであり、2番目の列がニュース文字であることを示しています。
データ解析
データセットを読み取った後、データセットに対してデータ分析操作を実行することもできます。非構造化データに対して多くのデータ分析を行う必要はありませんが、データ分析を通じていくつかのルールを見つけることができます。
このステップでは、すべてのトレーニングセットのデータを読み取りました。ここでは、データ分析を通じて次の結論を導き出すことを望んでいます。
- データ内のニューステキストの長さはどれくらいですか?
- データのカテゴリ分布とは何ですか?また、どのカテゴリがより多いですか?
- データ内の文字の分布は何ですか?
ここでは、最初に文の長さを分析します。
文の長さの分析
質問データの各文の文字はスペースで区切られているため、単語数を直接数えて各文の長さを取得できます。統計は次のとおりです。
%pylab inline
train_df['text_len'] = train_df['text'].apply(lambda x: len(x.split(' ')))
print(train_df['text_len'].describe())
ニュース文の統計は、この競争の質問で与えられたテキストは比較的長く、各文は平均で907文字で構成され、最短の文の長さは2、最長の文の長さは57921であると結論付けることができます。
次の図は、文の長さのヒストグラムを示しています。ほとんどの文の長さが2000以内であることがわかります。
_ = plt.hist(train_df['text_len'], bins=200)
plt.xlabel('Text char count')
plt.title("Histogram of char count")
ニュースカテゴリの分類
次に、データセットのカテゴリで分布統計を実行し、具体的には各タイプのニュースのサンプル数をカウントできます。
train_df['label'].value_counts().plot(kind='bar')
plt.title('News class count')
plt.xlabel("category")
データセット内のラベルの対応する関係は次のとおりです。{「テクノロジー」:0、「ストック」:1、「スポーツ」:2、「エンターテインメント」:3、「時事」:4、「社会」: 5、「教育」:6、「金融」:7、「家具」:8、「ゲーム」:9、「財産」:10、「ファッション」:11、「宝くじ」:12、「星座」:13 }
統計結果から、競争質問のデータセットカテゴリの分布が比較的不均一であることがわかります。トレーニングセットでは、テクノロジーニュースが最も多く、次に株式ニュースが続き、最も少ないニュースは星座ニュースです。
文字分布統計
次に、各文字の出現回数を数えることができます。最初に、トレーニングセット内のすべての文をスプライスしてから文字に分割し、各文字の数を数えることができます。
from collections import Counter
all_lines = ' '.join(list(train_df['text']))
word_count = Counter(all_lines.split(" "))
word_count = sorted(word_count.items(), key=lambda d:d[1], reverse = True)
統計結果から、トレーニングセットには合計6869語が含まれており、そのうち単語番号3750が最も多く出現し、単語番号3133が最も少なく出現していることがわかります。
ここでは、各文の単語の出現に応じて句読点を推測することもできます。次のコードは、異なる文字が文に現れる回数をカウントします。その中で、20wニュースの文字3750、文字900、および文字648のカバー率は99%に近く、句読点である可能性があります。
train_df['text_unique'] = train_df['text'].apply(lambda x: ' '.join(list(set(x.split(' ')))))
all_lines = ' '.join(list(train_df['text_unique']))
word_count = Counter(all_lines.split(" "))
word_count = sorted(word_count.items(), key=lambda d:int(d[1]), reverse = True)
最も頻繁に出現する文字を数える
ここでは、頻度の上位3文字をカウントする関数を記述します
def TopWord(type_, n):
all_lines = " ".join([train_df["text"][i] for i in range(len(train_df["text"])) if train_df["label"][i]==type_])
word_count = Counter(all_lines.split(" "))
word_count = sorted(word_count.items(), key=lambda d:d[1], reverse=True)
for i in range(n):
print(word_count[i])
TopWord(2, 3)
データ分析の結論
上記の分析を通じて、次の結論を導き出すことができます。
- 質問の各ニュース項目に含まれる平均文字数は1000文字であり、一部のニュース文字はそれより長くなっています。
- コンテストの質問におけるニュースカテゴリの分布は不均一であり、テクノロジーニュースのサンプルサイズは4wに近く、コンステレーションニュースのサンプルサイズは1k未満です。
- 質問には合計7000〜8000文字が含まれます。
データ分析を通じて、次の結論を導き出すこともできます。
- 各ニュース項目の平均文字数は多く、切り捨てる必要がある場合があります。
- カテゴリの不均衡により、モデルの精度に深刻な影響を及ぼします。
総括する
主な内容はデータ読み取りとデータ分析です。Pandasライブラリを使用してデータ読み取り操作を完了し、コンテストデータを分析して構成し、ニュース文の長さ、カテゴリ、文字を視覚化します。