見出し画像

【メモ】Colab&パイソンを利用したテキスト分析(0905)


非指導学習
正解データなしで、存在するデータから類似したものを整理して分類
K平均法(K-Means)
-長所?
簡単だ。

-短所?
クラスターの数などは自分で決める必要がある。
ラベルは自分で決める必要がある。

指導学習
正解があり、事前に学習したモデルに基づいて入力データを分類する。
各テキストをグループ化(Word2Vec化)
FastTextで学習させたmodelを作成


!pip install -U ginza ja_ginza
!pip install fasttext
#最終的にfasttextに渡したいデータ形式
#['__label__バッテリーの持ちが良い  バッテリー の 持続 時間 は 問題 なし 。','...','...']
# 必要なもの
#    spacyのライブラリ, csvモジュール
import spacy,csv
nlp = spacy.load('ja_ginza')
targetlist = []
with open("./cluster_out_w_label.csv",encoding='utf_8_sig') as fh, open('./target.csv','w',encoding='utf_8_sig') as fh_out:
  reader = csv.reader(fh,quotechar='"')
  writer = csv.writer(fh_out)
  next(reader)
  for line_list in reader:
   # レビューについて、改行が邪魔になるので改行を取り除く
   # nlpにレビューを渡して、トークン化(lemma_)
   # トークン化したものをスペース区切りの文字列に変換する
   # 正解ラベルと合体させた一つの文字列にする
   label = line_list[1]
   review_text = line_list[2]
   review_text = review_text.replace('\n','')
   docs = nlp(review_text)
   tmplist = []
   for sent in docs.sents:
    for token in sent:
      tmplist.append(token.lemma_)
   tmpstr = " ".join(tmplist)
   tmpstr = "__label__"+label+" "+tmpstr
   writer.writerow([tmpstr])


トークン化(Tokenization):トークン化は、与えられたテキストを小さなピースまたはトークンに分離する作業です。 通常、単語、句読点、空白などを基準にテキストを分けます。 例えば、「Hello, world!」という文章は、「Hello」、「world」、「!」の4つのトークンに分離できます。

レマ抽出(Lemma Extraction): レマ抽出は、各トークンの基本形態または辞書形態を抽出する作業です。 単語の原型を見つけることができます。 たとえば、「running」は「run」のレマで、「better」は「good」のレマです。 レマ抽出は、テキスト処理タスクで単語のさまざまな形態を統合し、正規化するために使用されます。

例えば、「I am running in the park」という文章をトークン化してレマ形式で抽出すると、次のような結果が得られます:

トークン化: ["I", "am", "running", "in", "the", "park"]
レマ抽出: [「I」、「be」、「run」、「in」、「the」、「park」]
レマ抽出は、テキスト分析および自然言語処理タスクで単語のさまざまな形態を統合してテキストデータを処理するのに役立ちます。 これにより、似たような意味の単語を一つの形に統一し、テキストの次元を減らすのに役立ちます。

import spacy
import csv

# spaCyの日本語モデル'ja_ginza'をロードします。
nlp = spacy.load('ja_ginza')

# targetlistにテキストデータを保存する空のリストを生成します。
targetlist = []

# 「cluster_out_w_label.csv」ファイルを読んで、「target.csv」ファイルに保存します。
with open("./cluster_out_w_label.csv", encoding='utf_8_sig') as fh, open('./target.csv', 'w', encoding='utf_8_sig') as fh_out:
    reader = csv.reader(fh, quotechar='"')
    writer = csv.writer(fh_out)
    next(reader)  # ヘッダー行をスキップします。

    for line_list in reader:
        # ラベルとレビュー テキストを抽出します。
        label = line_list[1]
        review_text = line_list[2]

        # レビュー テキストから改行文字を削除します。
        review_text = review_text.replace('\n', '')

        # spaCyを使用してレビューテキストをトークン化し、レマ形式で抽出します。
        docs = nlp(review_text)
        tmplist = []
        for sent in docs.sents:
            for token in sent:
                tmplist.append(token.lemma_)
        
        # トークン化されたテキストをスペースで区切られた文字列に変換します。
        tmpstr = " ".join(tmplist)
        
        # ラベルとテキストをFastText形式で結合してリストに追加します。
        labeled_text = "__label__" + label + " " + tmpstr
        targetlist.append(labeled_text)
        
        # 結果を 'target.csv' ファイルに保存します。
        writer.writerow([labeled_text])
#'target.csv'ファイルを使用してFastTextモデルを学習します。
import fasttext as ft

model = ft.train_supervised('./target.csv',epoch=2000,label_prefix='__label__',loss='softmax')

modelとは数式のことです。
model = aX1 + bX2 + cX3 + … + cXN + e

Start
a=1 
b=10
c=30

(<- 初期値): 1X1 + 10X2 + 30X3 =⁇ ←→ 正解 xxxx
a = 2, b= 10, c = 29 

上のコードでは、modelはFastTextモデルを示します。 FastTextは、テキスト分類およびテキスト関連作業のための機械学習モデルの一つです。 modelは学習されたFastTextモデルを指し、与えられた学習データに基づいてテキスト分類タスクを実行するために使用されます。

modelは次のような機能を実行することができます:

テキストを入力として受け取り、そのテキストのラベルを予測します。
学習されたモデルを保存または再読み込み、再利用できます。
モデルのパフォーマンスと特徴を調べるためのいくつかのメソッドとプロパティを提供します。
このように学習されたFastTextモデルは、特定のテキストに対する予測を実行したり、テキストデータを分類したり、さまざまな自然言語処理タスクを実行するために使用されます。

# 単語 "る" の埋め込みベクトルを取得します。
model.get_word_vector("剃る")

単語埋め込みベクトル(Word Embedding Vector)は自然言語処理で使われる技術の一つで、テキストデータの単語を数値化されたベクトルで表現する方法です。 これらのベクトル表現は、コンピュータがテキストを理解し、処理するのに役立ちます。

単語埋め込みベクトルはまるで単語をコンピュータ言語に翻訳してくれる魔法ボックスのようです。 たとえば、「リンゴ」という単語があれば、この魔法ボックスはその単語を数字に変えてくれます。

この数字は単語の特徴と意味を含んでいます。 似たような意味を持つ単語同士は似た数字に変わるので、「リンゴ」と「梨」は似た数字を持つことになります。 そのため、コンピュータが理解しやすくなり、単語間の関係や意味を理解するのに役立ちます。

# テスト(検証)データを読み込んで
# 各テキストをトークン化し、各モデルに投入(model.predict(トークン化されたテキスト))
# 出力されたラベルと、以下のテキストを表示

with open('./test.csv', encoding='utf_8_sig') as fh:
    reader = csv.reader(fh, quotechar='"')
    for line in reader:
        line = line[0]  #テキストデータを読んで来ます。
        line = line.replace('\n', "")  # 改行文字を削除します。
        
        # spaCyを使用してテキストをトークン化し、レマの形で抽出します。
        docs = nlp(line)
        tmplist = []
        for sent in docs.sents:
            for token in sent:
                tmplist.append(token.lemma_)
        tmpstr = " ".join(tmplist)  # トークン化されたテキストをスペースで区切られた文字列に変換します。
        
        # FastTextモデルで予測します。 結果はラベルとスコアのリストです。
        # ここでは、最も確率の高いラベルのみを使用します。
        predicted_label = model.predict(tmpstr)[0][0]

        # 予測されたラベルと元のテキストを出力します。
        print(predicted_label, ":", line)

与えられたコードはテストデータを読み込み、各テキストをトークン化した後、FastTextモデルで予測して予測されたラベルと元のテキストを出力する作業を行います。


ソンさん


この記事が気に入ったらサポートをしてみませんか?