1. ホーム

百科事典における有名人情報と非有名人情報の分離

2022-02-23 06:30:01
<パス

Pythonパッケージのインポート

import pandas as pd
from pandas import Series, DataFrame

非セレブリティデータのインポート

notCelebrity=[]
for each in 'ABCDEFGHIJKLMNOPQRSTUVWYZ':
    dataCSV = pd.read_csv('baidubaike_noCelebrity/{}_notCelebrity.csv'.format(each), sep='|', header=None)
    notCelebrity.extend(dataCSV[4])

data_1 = {
'content':notCelebrity}
dataFrame_1 = DataFrame(data_1)
dataFrame_1['values']='1'

有名人データの取り込み

Celebrity=[]
dataCSV = pd.read_csv('baidubaike_celebrity.csv', sep='|')
for each in dataCSV['Celebrity'].values:
    if each==each:
        Celebrity.append(each)

data_2 = {
'content':Celebrity}
dataFrame_2 = DataFrame(data_2)
dataFrame_2['values']='0'

有名人データと非有名人データのマージ

dataFrame = dataFrame_1.append(dataFrame_2)
dataFrame=dataFrame.dropna(axis=0,how='any')

単語の分割を実行する

import jieba
dataFrame['subword']=dataFrame['content'].apply(lambda x:' '.join(jieba.cut(x)))
X=dataFrame['subtext']
y=dataFrame['values']

Kフォールドクロスカット

from sklearn.model_selection import StratifiedKFold,KFold
from sklearn import preprocessing
from sklearn.feature_extraction.text import TfidfTransformer,CountVectorizer
from sklearn.preprocessing import LabelEncoder,OneHotEncoder
from sklearn.naive_bayes import GaussianNB,MultinomialNB
from sklearn.metrics import accuracy_score

skf = StratifiedKFold(n_splits=10, random_state=1, shuffle=False)

for train_index, test_index in skf.split(X, y):

    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]

    # Extract text features
    vectorizer = CountVectorizer()
    X_train_termcounts = vectorizer.fit_transform(X_train.astype('U'))

    tfidf_transformer = TfidfTransformer()
    X_train_tfidf = tfidf_transformer.fit_transform(X_train_termcounts)

    # Get the keywords of all the texts in the bag of words
    feature_name = vectorizer.get_feature_names()

    #Build a plain Bayesian classifier for training
    classifier = MultinomialNB().fit(X_train_tfidf, y_train.astype('str'))

    #Model test
    X_input_termcounts = vectorizer.transform(X_test.astype('str'))
    X_input_tfidf = tfidf_transformer.transform(X_input_termcounts)
    # model prediction
    predicted_categories = classifier.predict(X_input_tfidf)
    print(accuracy_score(y_test.astype('str'),predicted_categories))

生成された予測結果。

0.9666283084004603
0.9700115340253749
0.9619377162629758
0.9676674364896074
0.9688221709006929
0.9711316397228638
0.9688221709006929
0.9653579676674365
0.9745958429561201
0.964203233256351    



私が遭遇したエラー

途中で遭遇した問題をメモしておく

  • TypeError: bytes-like オブジェクトが必要で、'str' ではありません。
  • AttributeError: 'NoneType' オブジェクトには 'get_text' という属性がありません。
  • RandomForestClassfier.fit(): ValueError: 文字列をfloatに変換できませんでした。
  • ValueError: 2D 配列を期待したが、代わりに 1D 配列を得た。
  • TypeError: '<' は 'float' と 'str ' のインスタンスの間でサポートされていません。
  • scikit-learnで複数列にわたるラベルのエンコーディング
  • ValueError: np.nan is invalid document, expected byte or unicode string

1.TypeError: バイトのようなオブジェクトが必要で、'str' ではありません。

エラーにあるように、文字列型ではなくbytes-like型が必要で、bytes-likeはバイトに変換されることに注意が必要です。

2. AttributeError: 'NoneType' オブジェクトには 'get_text' という属性がありません。

null オブジェクト (null 型) には get_text() メソッドがありません。ここで NoneType は null None を意味することに注意してください。これはクローラーでよくあるエラーであるはずです。

3.RandomForestClassfier.fit(): ValueError: 文字列をfloatに変換できませんでした。

機械学習の過程で発生する問題で、stackoverflowで提供されている解決策はLabelEncoderとOneHotEncoderで、以下を参照してください。 リンク

4.ValueError。2次元の配列を期待したが、代わりに1次元の配列が得られた

解決策はreshape(-1,1)です。データの配置を変更するreshape()関数について知っておくことは重要です。

5.TypeError: '<' は 'float' と 'str ' のインスタンスの間でサポートされていません。

これは間違ったデータ型によるエラーで、これを見てください。 ご覧いただければ一目瞭然かと思います。この問題を解決するには、関数 astype("str") を使用する必要があります。

6. scikit-learnの複数列にわたるラベルエンコーディング

機械学習の過程でデータをデジタル化することで、多くの不要な問題を解決することができ、2D(2次元)デジタル化を実現する方法は、以下の通りです。 これは

7. ValueError: np.nan is an invalid document, expected byte or unicode string

最後の文を見てください。バイトまたはユニコードを期待していますが、これは明らかにastype()で修正できます。


StratifiedKFoldとKFoldの比較

k-foldクロスバリデーションでは、第1段階で元のデータを既約サンプリングによりランダムにk分割し、第2段階でそのうちのk-1個のデータをモデルの学習に用い、残りの1個のデータをモデルのテストに用います。そして、第二段階をk回繰り返し、k個のモデルとその評価結果を得る(注:データ分割による誤差を減らすため、通常、k-foldクロスバリデーションを異なる分割方法を用いてランダムにp回繰り返し、一般的には10回10-foldクロスバリデーションを行う)。

そして、パラメータ/モデルの性能評価として、k-foldクロスバリデーションの結果の平均を算出する。k-foldクロスバリデーションを用いて最適なパラメータを見つけることは、ホールドアウト法よりも安定している。最適なパラメータが見つかったら、このパラメータセットを使って、最終モデルとして元のデータセットでモデルを学習させたいと思います。

StratifiedKFoldは層別サンプリングによるランダムサンプリングで、KFoldはStratifiedKFoldのランダム性だけを実装した下位バージョンに相当するものです。

CountVectorizer()とTfidfTransformer()

1. 単語袋モデル

まず、Bag of words (BoW)モデルから始めると便利かもしれません。

Bag of wordsモデルは、テキスト中の単語間の文脈的な関係を考慮せず、すべての単語の重みだけを考慮することを前提としている。重みは、その単語がテキストにどれだけ頻繁に現れるかに関係する。

Bag-of-Wordsモデルは、まず単語を分割し、その後、各単語がテキストに何回現れるかを数えることで、そのテキストの単語ベースの特徴を得ることができ、これらの単語と各テキストサンプルの対応する単語頻度を合わせれば、それがよく言うベクトル化ということである。ベクトル化の後は、一般にTF-IDFで特徴の重みを補正し、特徴を正規化する。その後、機械学習モデルに取り込み、計算を行う。

Bag of Wordsモデルは、トークン化、カウント、修正した単語特徴の正規化という3つのプロセスで構成されている。

Bag-of-wordsモデルは、文脈ではなく単語の頻度しか考慮しないため、テキストの意味付けが失われるという大きな制約がある。

bag-of-wordsモデルで単語の頻度をカウントする場合、sklearnのCountVectorizerを使うとよい。

2. 単語頻度ベクトル化

CountVectorizerクラスは,テキスト中の単語を単語頻度行列に変換します.例えば,クラスiのテキスト下での単語jの頻度を表す要素a[i][j]を含む行列を生成します.fit_transform関数で各単語の出現回数を計算し、get_feature_names()でテキストのすべてのキーワードをbag of wordsで取得し、toarray()で単語頻度行列の結果を見ています。

3. TF-IDF処理

TF-IDF (Term Frequency-Inverse Document Frequency) は、情報検索やテキストマイニングでよく用いられる重み付け手法である。TF-IDFは、文書集合またはコーパス内の1つの文書に対する単語の重要度を評価する統計手法である。TF-IDFは、文書またはコーパス内の1つの文書に対する単語の重要度を評価する統計的手法であり、単語の重要度は文書内の出現回数に比例して増加し、コーパス内の頻度に反比例して減少する。検索エンジンでは、ユーザーのクエリと文書の関連性の尺度または評価として、さまざまな形式のTF-IDF重み付けがしばしば適用される。

TF-IDFの主な考え方は、ある単語やフレーズがある記事でTF高く出現し、他の記事ではほとんど出現しない場合、その単語やフレーズはカテゴリ分化が良好で分類に適していると考えられるというものです。TF-IDFは実際には。TF-IDFは、実際には、TF * IDFである。

(1) 用語頻度(TF)とは、ある単語がその文書にどれくらいの頻度で出現しているかを示す。つまり、文書dに含まれる単語の総数size(d)に対する、文書dに含まれる単語wの出現数count(w, d)の比である。

この数値は、長い文書に偏らないようにするために、単語数を正規化したものである。(同じ単語でも、短い文書より長い文書の方が、その単語が重要かどうかに関係なく、単語数が多くなることがある)。

(2) 逆文書頻度(IDF)は、単語の一般的な重要度を示す指標である。ある単語のIDFは、全文書数をその単語を含む文書数で割り、その商の対数をとることで得られる。つまり、文書総数nと単語wが出現する文書数docs(w, D)の比の対数である。

特定の文書内での単語の頻度が高く、文書集合全体におけるその単語の頻度が低ければ、TF-IDFの重みが高くなる。したがって、TF-IDFは一般的な単語をフィルタリングし、重要な単語を残す傾向がある。

4. sklearnによるTF-IDFの前処理

# Extract text features
vectorizer = CountVectorizer()
X_train_termcounts = vectorizer.fit_transform(X_train.astype('U'))

tfidf_transformer = TfidfTransformer()
X_train_tfidf = tfidf_transformer.fit_transform(X_train_termcounts)

参考資料です。
https://blog.csdn.net/m0_37324740/article/details/79411651
https://ljalphabeta.gitbooks.io/python-/content/kfold.html