Pythonで語学学習教材を作成する方法

基本的には辞書を丸暗記すれば語学は理解できるようにはなる。

しかし、あまりにも非効率的なのではないか?

もっと効率よく、そしてピンポイントに学ぶ方法はないだろうか?

と考えたわけです。

例えば金融ニュースなら金融のニュース、筆者は本職が音楽家ですので、海外のアーティストと交流することがありますが、音楽の制作現場で使う単語と日常会話では違った単語を覚える必要があるわけです。

それらに特化した単語を抽出することができれば、「AIが弾き出したあなたが覚えるべき〇〇(英語などの語学の名前)の単語1000個 / 〇〇(金融などジャンルやカテゴリーの名前)編」という本をシリーズで制作できるのではないか?

と考えたわけです。

簡易紹介:こうたろう

1986年生まれ
音大卒業後日本、スウェーデン、ドイツにて音楽活動
その後金田式DC録音のスタジオに弟子入りし、みっちり音響を学ぶ。
プログラミング(C)を株式会社ジオセンスのCEO小林一英氏よりを学ぶ
現在はヒーリングサウンド専門のピアニスト、またスタジオでは音響エンジニア、フォトグラファーなどマルチメディアクリエーターとして活動中
当記事ではプログラマー、音響エンジニアとして知識とスキルをシェアしていきます

音響の専門サイト

環境の概要

  1. Python環境: データの解析や自動化はやはりPythonに限ります。
  2. 翻訳API: DeepL APIを持っているので利用します。
  3. 著作権問題: 音声そのものではなく、音声から抽出したテキストデータを使用するため、著作権の問題は生じません。
  4. 音声のテキスト化: SpeechRecognitionライブラリを使用して、音声データをテキストに変換します。

Google Speech-to-Text API や IBM Watson Speech to Textなどより詳細な分析が可能なAPIがありますし、翻訳自体もGoogle Translate API や Microsoft Translator Text APIにて代用可能です。

必要なライブラリ

  • pytube: YouTube動画から音声データをダウンロードするために使用します。
  • SpeechRecognition: 音声データをテキストに変換するために使用します。
  • DeepL API: 単語の翻訳に使用します。

他にも標準ライブラリとしてcollections.Counterなどを使います。

実装プロセスの確認

  1. YouTube動画の音声ダウンロード:
    • pytubeを使用してYouTube動画の音声データをダウンロードします。
  2. 音声のテキスト化:
    • SpeechRecognitionライブラリを用いて音声データをテキストに変換します。
  3. 単語の使用頻度分析:
    • テキストデータから単語を抽出し、使用頻度を分析します。
  4. 単語の翻訳:
    • DeepL APIを使用して、単語を日本語に翻訳します。
注意

ダウンロードに関してはあなたのお住まいの地域の法律を遵守し、自己責任で実行してください。
当サイトではサンプルコードを考察しており、実行を推奨しているわけではありません。

コードの例

まずはブロックに分けて制作していきましょう。

最初にYoutubeから音声をダウンロードし、テキストを抽出して出力するするまでみていきましょう。

コメントアウトでも解説、説明しながら、進めていきます。

コマンドライン(ターミナル)でpytube をインストールしてください:

pip install pytube
pip install --upgrade pytube

また、pytubeでダウンロードされた音声ファイルはMP4形式になっている可能性が高いため、speech_recognition ライブラリでサポートされている形式(PCM WAV, AIFF/AIFF-C, Native FLAC)に変換する必要があります。

変換のためのライブラリは

pip install pydub

変換のための詳しい解説は筆者の音響ブログ:Kotaro Studioにて解説しています。

この記事ではエラーがでやすい環境変数のパス変更について記述しています。

特にpydubは内部にffmpeg – ffprobeが含まれており、これらのコンバートを処理するためのパスをPythonが読めずにエラーが出るケースが多いです。

環境変数を変更するかコード内に無理矢理パスを指定して読み込ませるなりデバッグしてください。

from pydub import AudioSegment
import os

# ffmpegとffprobeのパスを指定
ffmpeg_path = "/opt/homebrew/Cellar/ffmpeg/6.0_2/bin/ffmpeg"
ffprobe_path = "/opt/homebrew/Cellar/ffmpeg/6.0_2/bin/ffprobe"

AudioSegment.converter = ffmpeg_path
AudioSegment.ffprobe = ffprobe_path
Pydubでオーディオ変換

Youtubeから音声のみをダウンロード

注意

あなたのお住まいの地域の法律を遵守し、自己責任で実行してください。
当サイトではサンプルコードを考察しており、実行を推奨しているわけではありません。
お住まいの地域の法規制でダウンロードできない場合はGlaspを使った方法に進んでください。
Glaspを使えばダウンロードせずにテキストだけ抽出できます。

from pytube import YouTube
import os

def download_audio_from_youtube(url, output_path=""):
    """
    YouTubeの動画から音声をダウンロードする関数。
    :param url: YouTube動画のURL
    :param output_path: 音声ファイルを保存するパス
    :return: 音声ファイルのパス
    """
    yt = YouTube(url)
    audio_stream = yt.streams.filter(only_audio=True).first()

    # ダウンロードとファイル名の設定
    output_file = audio_stream.download(output_path=output_path)
    base, ext = os.path.splitext(output_file)
    new_file = base + '.mp3'
    os.rename(output_file, new_file)

    return new_file

# YouTube動画のURL
youtube_url = "ここにYouTubeのURLを貼り付けてください"

# 音声ファイルのダウンロードと保存
audio_file = download_audio_from_youtube(youtube_url)

print(f"音声ファイルがダウンロードされ、{audio_file}に保存されました。")

音声からテキストを抽出

次に音声ファイルからテキストを抽出しましょう。

こちらも音響Pythonの講座で発信しています。

Python音声からテキスト抽出
注意点とポイント
MP3ファイルは speech_recognition ライブラリで直接扱えないため、まずWAV形式に変換する必要があります。
from pydub import AudioSegment

def convert_mp3_to_wav(mp3_file_path, wav_file_path):
    """
    MP3ファイルをWAVファイルに変換する関数。
    :param mp3_file_path: MP3ファイルのパス
    :param wav_file_path: 変換後のWAVファイルのパス
    """
    audio = AudioSegment.from_mp3(mp3_file_path)
    audio.export(wav_file_path, format="wav")

# MP3ファイルのパス
mp3_file_path = "/path/to/your/file.mp3"  # ここにMP3ファイルのパスを入力

# WAVファイルのパス
wav_file_path = "/path/to/your/file.wav"  # ここにWAVファイルの保存先パスを入力

# 変換実行
convert_mp3_to_wav(mp3_file_path, wav_file_path)

print(f"変換されたWAVファイルが {wav_file_path} に保存されました。")

テキストの抽出コードはこちらから。

Python音声からテキスト抽出

Glaspを使ってテキストを抽出

お住まいの地域の法規制により、音声データをダウンロードできない場合はGlaspを使ってください。

Glaspはテキスト抽出のほか、Chat GPTと連携して要約もできます。

同様にテキスト化と要約をしてくれるAI系のプラグインはたくさんありますので、是非活用してください。

テキストの抽出が終われば、Glaspの場合はcsvで出力する機能もありますので、Pythonにそのまま読み込ませると楽ですね。

単語の抽出

collectionsを使います。

collectionsはPythonの標準ライブラリなのでインストールする必要はありません。

このコードは、テキスト中の単語の出現頻度をカウントし、最も一般的な単語を表示します。

from collections import Counter
import re

# 提供されたテキスト
text = """
A car is one of the biggest purchases a person will make in their lifetime. But unlike a house, a car starts losing value right away, literally as you drive it off the lot. ...
"""

# テキストを単語に分割する(小文字に変換し、非文字の除去)
words = re.findall(r'\w+', text.lower())

# 各単語の出現回数をカウント
word_counts = Counter(words)

# 最も頻繁に使用される単語の上位を表示
for word, count in word_counts.most_common(10):
    print(f"{word}: {count}")
the: 43
a: 35
and: 26
it: 20
car: 19
is: 19
you: 19
that: 19
of: 17
in: 17
value: 16
to: 16
for: 14
are: 14
on: 11
cars: 10
market: 9
new: 9
about: 8
we: 8

​

most_common メソッドの引数を変更することで、表示する単語の数を調整できます(例えば、most_common(20) は上位20個の単語を表示します)。

例えばとあるニュースの分析をしてみると、いかに日常会話の単語が少ないかがわかります。

most_commonを増やさないと最初の上位はthe,a,andなどになってしまいますので、調整が必要です。

特定の単語(一般的には「ストップワード」と呼ばれる接続詞や助詞など)を除外して単語を抽出するには、これらの単語をフィルタリングするステップを追加します。

以下のPythonコードでは、指定されたストップワードを除外してから単語の出現頻度をカウントします。

from collections import Counter
import re

def extract_words(text, stopwords):
    words = re.findall(r'\w+', text.lower())
    filtered_words = [word for word in words if word not in stopwords]
    return filtered_words

# ストップワードリスト
stopwords = set(["the", "a", "and", "it", "is", "you", "that", "of", "in", "to", "for", "are", "on"])

# テキストのサンプル
text = "Your text here."

# ストップワードを除外して単語の抽出
words = extract_words(text, stopwords)

# 各単語の出現回数をカウント
word_counts = Counter(words)

# 出現頻度が高い単語の表示
for word, count in word_counts.most_common(30):
    print(f"{word}: {count}")

ストップワードの設定をして、カウントを30に変更するとこのようになりました。

car: 19
value: 16
cars: 10
market: 9
new: 9
about: 8
we: 8
s: 8
but: 7
like: 7
there: 7
what: 7
or: 7
as: 6
lot: 6
year: 6
than: 6
10: 6
vehicle: 6
their: 5
lose: 5
which: 5
with: 5
another: 5
price: 5
wholesale: 5
one: 4
drive: 4
off: 4
at: 4

各種言語の調整

英語と同じようにスペースで区切られている言語は同様の処理で抽出できます。

ただし、スペイン語テキストを処理する際、英語との主な違いはアクセント記号と特殊文字の扱いです。

基本的なテキスト処理の手順は英語と似ていますが、スペイン語特有の要素に注意する必要があります。

スペイン語テキスト処理のステップ

  1. 単語分割(トークン化): スペイン語の単語は英語と同様にスペースで区切られます。従って、正規表現を使った単語の抽出方法は英語と同じです。
  2. 小文字化: スペイン語でも大文字と小文字を区別します。一貫性を保つためには、テキストを小文字に変換するのが一般的です。
  3. アクセント記号の扱い: スペイン語にはアクセント記号が含まれることがあります。これらの文字も適切に処理する必要があります。ただし、単語の頻度カウントにおいては、アクセント記号を無視しても問題はない場合が多いです。

以下はスペイン語のテキストを処理するPythonコードの例です。

このコードでは、単語の出現頻度をカウントし、最も一般的な単語を表示します。

from collections import Counter
import re

# スペイン語のサンプルテキスト
text = "El rápido zorro marrón salta sobre el perro perezoso."

# テキストを単語に分割(小文字に変換)
words = re.findall(r'\w+', text.lower())

# 各単語の出現回数をカウント
word_counts = Counter(words)

# 最も頻繁に使用される単語の上位を表示
for word, count in word_counts.most_common(10):
    print(f"{word}: {count}")

日本語の処理方法

日本語テキストの処理は英語やスペイン語とかなり異なります。

日本語には単語間にスペースがないため、トークン化(単語に分割するプロセス)がより複雑で、日本語テキストを処理するためには、専用のトークン化ツールを使用する必要があります。

日本語テキスト処理には、janomemecab などのライブラリがよく使われます。

ここでは janome を使用する方法を紹介しましょう。

pip install janome

日本語テキストのトークン化と頻度カウント

次に、janome を使用して日本語テキストをトークン化し、単語の出現頻度をカウントします。

from janome.tokenizer import Tokenizer
from collections import Counter

# 日本語のサンプルテキスト
text = "猫はとても可愛いです。犬も可愛いですが、猫の方が私には合っています。"

# Tokenizer インスタンスの作成
tokenizer = Tokenizer()

# テキストを単語に分割
words = [token.surface for token in tokenizer.tokenize(text)]

# 各単語の出現回数をカウント
word_counts = Counter(words)

# 最も頻繁に使用される単語の上位を表示
for word, count in word_counts.most_common(10):
    print(f"{word}: {count}")

janome は、日本語テキストの自然言語処理(NLP)に特化したPythonライブラリで、様々な用途に利用できます。

1. トークン化(分かち書き)

日本語テキストを単語単位に分割する基本的なプロセスです。これは日本語の自然言語処理において最も基本的で重要なステップの一つです。

2. 品詞タグ付け

各単語に品詞(名詞、動詞、形容詞など)を割り当てます。これにより、テキスト内の単語の文法的な役割を理解することができます。

3. 意味解析

特定の単語やフレーズが持つ意味を分析します。たとえば、感情分析やトピック分析などに利用できます。

4. カスタム辞書の使用

janome ではユーザー独自の辞書を追加することができます。これにより、特定の専門用語や固有名詞などを正しく処理することが可能になります。

5. テキストマイニング

大量の文書からキーワードを抽出したり、特定のトピックやトレンドを分析する際に使用します。

6. 機械学習モデルのための前処理

テキストデータを機械学習モデルで扱える形式に変換する際に、トークン化や品詞タグ付けが重要な前処理ステップとなります。

7. テキスト生成や要約

特定の文脈に基づいて新しいテキストを生成したり、長い文章を短く要約するための前処理としても利用されます。

これらの応用例は、janome の柔軟性と日本語テキスト処理における強力な機能を示しています。

日本語の自然言語処理を行う際には、janome が非常に役立つツールとなります。

単語を抽出して翻訳

import deepl
from collections import Counter
import re

def translate_text_with_deepl(text, target_language="JA", auth_key="Your-DeepL-Auth-Key"):
    translator = deepl.Translator(auth_key)
    result = translator.translate_text(text, target_lang=target_language)
    return result.text

def extract_words(text):
    words = re.findall(r'\w+', text.lower())
    return words

def main():
    # 翻訳したい英語のテキスト
    english_text = "Your English text here."

    # 単語の抽出
    words = extract_words(english_text)

    # DeepL APIの認証キー
    deepl_auth_key = "Your-DeepL-Auth-Key"  # ここに実際のDeepL APIキーを設定

    # 各単語を日本語に翻訳
    translated_words = [translate_text_with_deepl(word, auth_key=deepl_auth_key) for word in words]

    # 結果の表示
    for word, translated in zip(words, translated_words):
        print(f"{word} -> {translated}")

if __name__ == "__main__":
    main()

ちなみにGoogle翻訳も使えます。

例えばAPI制限を受けてしまったなどの際には利用してください。

pip install googletrans==4.0.0-rc1
from googletrans import Translator

def translate_text_with_google(text, target_language="ja"):
    """
    Google翻訳APIを使用してテキストを翻訳する関数。
    :param text: 翻訳するテキスト
    :param target_language: 目標言語のコード(例: "ja"は日本語)
    :return: 翻訳されたテキスト
    """
    translator = Translator()
    result = translator.translate(text, dest=target_language)
    return result.text

# 翻訳したい英語のテキスト
english_text = "The quick brown fox jumps over the lazy dog."

# テキストを日本語に翻訳
japanese_text = translate_text_with_google(english_text)

print("翻訳されたテキスト:", japanese_text)

pykakasiでカタカナで読み方をつける

英単語を日本語に翻訳し、読み仮名(カタカナ)を表示するには、追加のライブラリが必要になります。

一つの方法として、pykakasi というライブラリを使用して、翻訳された日本語テキストの読み仮名を取得することができます。

pip install pykakasi
import deepl
import pykakasi
from collections import Counter
import re

def translate_text_with_deepl(text, target_language="JA", auth_key="Your-DeepL-Auth-Key"):
    translator = deepl.Translator(auth_key)
    result = translator.translate_text(text, target_lang=target_language)
    return result.text

def extract_words(text):
    words = re.findall(r'\w+', text.lower())
    return words

def get_kana(text):
    kakasi = pykakasi.kakasi()
    kakasi.setMode("J", "K")  # 日本語をカタカナに変換
    converter = kakasi.getConverter()
    return converter.do(text)

def main():
    english_text = "Your English text here."
    words = extract_words(english_text)
    deepl_auth_key = "Your-DeepL-Auth-Key"

    for word in words:
        japanese_text = translate_text_with_deepl(word, auth_key=deepl_auth_key)
        kana = get_kana(japanese_text)
        print(f"{word} -> {japanese_text} ({kana})")

if __name__ == "__main__":
    main()

元の言語、例えば英語の読み仮名をつけるにはライブラリがないので、マッピングして手動でつける必要があります。

import deepl
import pykakasi
from collections import Counter
import re

def translate_text_with_deepl(text, target_language="JA", auth_key="Your-DeepL-Auth-Key"):
    translator = deepl.Translator(auth_key)
    result = translator.translate_text(text, target_lang=target_language)
    return result.text

def extract_words(text):
    words = re.findall(r'\w+', text.lower())
    return words

def get_kana(text):
    kakasi = pykakasi.kakasi()
    kakasi.setMode("J", "K")  # 日本語をカタカナに変換
    converter = kakasi.getConverter()
    return converter.do(text)

def main():
    english_text = "Your English text here."
    words = extract_words(english_text)
    deepl_auth_key = "Your-DeepL-Auth-Key"

    for word in words:
        japanese_text = translate_text_with_deepl(word, auth_key=deepl_auth_key)
        kana = get_kana(japanese_text)
        print(f"{word} -> {japanese_text} ({kana})")

if __name__ == "__main__":
    main()

構文解析(Syntactic Parsing)

文法を抽出するためには、より高度な自然言語処理(NLP)技術が必要になります。

文法の構造を理解し、分析するためには、特に「構文解析(Syntactic Parsing)」という技術が用いられます。

spaCyを使う

spaCy は高度なNLPタスクに使用できる人気のPythonライブラリで、構文解析を含む幅広い機能を提供します。

pip install spacy
import spacy

# 英語モデルのロード
nlp = spacy.load("en_core_web_sm")

# 解析したいテキスト
text = "The quick brown fox jumps over the lazy dog."

# テキストを処理
doc = nlp(text)

# 単語とその文法的役割を表示
for token in doc:
    print(f"{token.text} -> {token.pos_}")

NLTKを使う

Natural Language Toolkit(NLTK)は、言語処理のための別の強力なPythonライブラリです。

構文解析を含む多くのNLPタスクに対応しています。

pip install nltk
import nltk

# テキスト
text = "The quick brown fox jumps over the lazy dog."

# トークン化
words = nltk.word_tokenize(text)

# 品詞タグ付け
tagged = nltk.pos_tag(words)

# 結果の表示
print(tagged)

機械学習の要素を追加

機械学習の要素を追加するアイディアを考えてみましょう。

今回はニュースサイトや特定のジャンルの選定を裁量で行っており、人間の裁量は機械学習を凌駕すると思いますので割愛します。

1. テキスト分類の学習

ニュース記事のテキストを用いて、特定のカテゴリ(政治、経済、スポーツなど)に分類する機械学習モデルを構築します。これには教師あり学習手法が使用できます。

2. 感情分析

ニュース記事やコメントのテキストから感情を分析するモデルを構築します。例えば、ポジティブ、ネガティブ、ニュートラルといった感情ラベルを予測することができます。

3. 自動翻訳の改善

機械翻訳の品質を向上させるために、特定の分野に特化した翻訳モデルをトレーニングします。これには、特定の専門用語や表現が含まれた大量のバイリンガルデータが必要です。

4. 言語生成モデルの使用

ニュース記事の要約や、特定のトピックに基づいた新しい記事の生成に、言語生成モデル(例えばGPT系のモデル)を使用します。

5. キーワード抽出とトピックモデリング

教材に含まれるテキストからキーワードを抽出し、トピックモデリングを行います。これにより、テキスト内の主要な話題やトレンドを特定することができます。

6. クラウドソーシングと機械学習の組み合わせ

ユーザーからのフィードバックを活用して、機械学習モデルを継続的に改善します。例えば、翻訳の質を評価してもらい、そのデータを使用してモデルをファインチューニングします。

kotaro
本業は芸術家をしています。
トレードが大好きで、トレードを愛しています。
もっぱらテクニカル分析派で、ファンダメンタルはテクニカル指標に合わせてついてくると確信しています。
芸術家だった祖母と、銀行家だった祖父に育てられ、10代に差し掛かる前から株式投資の本や哲学書を読んでいます。
要介護5だった祖母の介護をきっかけにプログラミングに興味をもち、株式会社ジオセンスのCEO:小林一英氏に弟子入り。
先生の指導のお陰で初心者から約1ヶ月でCを使った温度と湿度を計測して寝返りのタイミングをLEDランプで知らせるデバイスを開発。
現在は金融トレードのためにPythonを中心に知識を増やしています。
上部へスクロール