cl-tohoku/bert-base-japaneseを使って文章の自然さを判定する

開発環境

ライブラリのインストール

pip install torch transformers
pip install fugashi ipadic

データの準備

以下のようなデータを準備します

それと僕が材料をお伝えした時にバニラエッセンスを入れたじゃないですか
1弦の5フレット、2弦の5フレット、 3弦の5フレット、2弦の7フレット、
けどもこれでえっと木スキル使うとさらに カウンターが1個貯まる
長い年月をかけて韓国人朝鮮人 と向き合ってきた中国人は韓国人
ごいハマり始めて
50話 いらっしゃいませ♪ ヘラのグランプリ!
オムニテクでは人々を助けを上がっている。

文章の自然さの判定

from transformers import BertForMaskedLM, BertJapaneseTokenizer
import torch
import csv
import json

model_name = "cl-tohoku/bert-base-japanese"
tokenizer = BertJapaneseTokenizer.from_pretrained(model_name)
model = BertForMaskedLM.from_pretrained(model_name)

def tokenize_with_mask(text, tokenizer):
    tokens = tokenizer.tokenize(text)
    masked_tokens = []
    for i in range(len(tokens)):
        if tokens[i] not in ['[CLS]', '[SEP]']:
            masked_tokens.append(tokens[:i] + ['[MASK]'] + tokens[i+1:])
    return masked_tokens

def calculate_score(masked_tokens, tokenizer, model):
    scores = []
    for tokens in masked_tokens:
        input_ids = tokenizer.convert_tokens_to_ids(tokens)
        tensor_input = torch.tensor([input_ids])
        with torch.no_grad():
            outputs = model(tensor_input, labels=tensor_input)
            loss = outputs[0]
            scores.append(loss.item())
    return sum(scores) / len(scores)

with open('testData.txt', 'r', encoding='utf-8') as file:
    texts = file.readlines()

results = []
for text in texts[:100]: 
    text = text.strip()
    masked_tokens = tokenize_with_mask(text, tokenizer)
    score = calculate_score(masked_tokens, tokenizer, model)
    results.append({'text': text, 'score': score})

# CSVファイルに保存
with open('results.csv', 'w', encoding='utf-8', newline='') as csv_file:
    fieldnames = ['text', 'score']
    writer = csv.DictWriter(csv_file, fieldnames=fieldnames)
    writer.writeheader()
    for result in results:
        writer.writerow(result)

# JSONファイルに保存
with open('results.json', 'w', encoding='utf-8') as json_file:
    json.dump(results, json_file, ensure_ascii=False, indent=4)

結果は以下のようになります