生物屋さんのためのゼロからのプログラミング

―忘れないための覚書 (たま~に更新)―

少し余談:Javaで英語用のディクテーション用紙を作成する。

英語のリスニングの勉強においてディクテーションは非常に有効だと思うのだが、なかなか良い教材がないと思う。
無料 英語・英会話 無料 リスニングプラザ(ディクテーション勉強法)ヒアリング/listening/hearingのようなサイトはかなり有用であるが、リスニング教材数が少なく感じられるし、また、英語リスニング無料学習館は教材数は多いものの、各センテンスが短い。
長文を聴くとしても、やはりリスニングプラザのような単語を括弧で表記してくれた方が何かとやり易く感じる。


上記のような「リスニングプラザのような形式と分量で、多くのディクテーションをこなしたい」という個人的な需要から、自分でディクテーション用紙を作ることにした。

まずは、コードを記す。

import java.awt.FileDialog;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.filechooser.FileNameExtensionFilter;

import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;

public class DictKun extends JFrame implements ActionListener {

	String tx;

	public void Open () {
		JFileChooser fc = new JFileChooser();
		fc.setAcceptAllFileFilterUsed(false);
		FileNameExtensionFilter filter = new FileNameExtensionFilter("Wordファイル", "docx");
		fc.addChoosableFileFilter(filter);
		int selected = fc.showOpenDialog(this);
		if (selected == JFileChooser.APPROVE_OPTION) {
			File file = fc.getSelectedFile();

			try {
				FileInputStream infile = new FileInputStream(file);
				XWPFDocument doc = new XWPFDocument (infile);
				XWPFWordExtractor ex = new XWPFWordExtractor(doc);
				XWPFDocument exDoc = new XWPFDocument ();
				XWPFParagraph para = exDoc.createParagraph();

				XWPFRun run = para.createRun();
				tx = ex.getText();

				//文字の置換
				tx = tx.toUpperCase();
				tx = tx.replace (" ", " )  ( ");
				tx = tx.replaceAll ("[A-Z]", "  ");
				tx = tx.replaceAll(", \\)" ,  " ),"); //コンマを括弧の外に出す。
				tx = tx.replaceAll("\\?", " ) ?");
				tx = tx.replace(".", " )."); //ピリオドを括弧の外に出す。
				tx = tx.replace(". )" , ".");  //ピリオドが最後ではない場合の置き換え

				//改行部分で番号を付けて分ける
				String [] txs = tx.split("\n");
				StringBuilder sb = new StringBuilder();
				for ( int i = 0; i < txs.length; i++) {
					sb = new StringBuilder();
					sb.append((i + 1) + " : (" + txs[i]  );
					run.setText(new String(sb));
					run.addCarriageReturn();
				}

				FileOutputStream fo = new FileOutputStream(this.writeFile());
				exDoc.write(fo);

			} catch (IOException e) {
				System.out.println("Open Miss");
			}
		}
	}

	//保存用の名前を付ける
	String writeFile() {
		FileDialog fd = new FileDialog(new Frame(), "保存 (末尾に.docxを付けてください)", FileDialog.SAVE);
		fd.setVisible(true);
		String path = fd.getDirectory() + fd.getFile();
		fd.dispose();
		return path;
	}

	public void actionPerformed (ActionEvent e) {
		String cmd = e.getActionCommand();

		if (cmd.equals("open")) {
			Open();
		}
	}

	DictKun () {
		JButton button = new JButton ("Open & Create");
		button.addActionListener(this);
		button.setActionCommand("open");
		button.setBounds(30, 15, 120, 30);
		JPanel pane = new JPanel ();
		pane.setLayout(null);
		pane.add(button);
		getContentPane().add(pane);
	}

	public static void main(String[] args) {
		DictKun frame = new DictKun();
		frame.setTitle("DictKun");
		frame.setBounds (100, 100, 200, 100);
		frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}

例として、下記のコナンドイルの「赤毛連盟」の冒頭 (Wordファイル)を、
f:id:Aki-Miya:20150520204027p:plain

本コードで、ディクテーション用紙に変換した結果が次である。
f:id:Aki-Miya:20150520204202p:plain

このコードでは、改行ごとに番号を振り段落を分けることで、ディクテーションし易くした。

会話部分の「“」がカギ括弧内に入っているため若干見栄えが悪いが、リスニングプラザのように、カギ括弧の大きさが単語の文字数を反映しており、使用する上では問題無いと思う。

本コードによって、洋書の音読サイトやリスニングCDをディクテーションの教材にすることができる。(ただし、原文のWordファイルを準備する必要があるが。)


英語の原文をディクテーション用紙にするために、下記の部分で

//文字の置換
    tx = tx.toUpperCase();
    tx = tx.replace (" ", " )  ( ");
    tx = tx.replaceAll ("[A-Z]", "  ");
    tx = tx.replaceAll(", \\)" ,  " ),"); //コンマを括弧の外に出す。
    tx = tx.replaceAll("\\?", " ) ?");
    tx = tx.replace(".", " )."); //ピリオドを括弧の外に出す。
    tx = tx.replace(". )" , ".");  //ピリオドが最後ではない場合の置き換え

アルファベットを空欄にし、その前後に括弧を書くようにした。