読者です 読者をやめる 読者になる 読者になる
スポンサーリンク

Windows上でCUIで動く,無料の「オフライン英和辞典」バッチ。コマンドラインから英単語の日本語翻訳を自動化するWSHサンプルコード

英語 テキスト処理 言語 WSH/JScript

オフラインで,Windows上のコマンド・バッチで
英和辞典」が動いたら便利だ。


無料で,CUIで利用でき,ネットに接続する必要がない。

英単語を入力として,日本語の意味を1つずつ回答・出力してくれる仕組みがあればよい。


そのようなWindowsバッチをWSHで実装したので,
下記に全ソースコードと導入手順,
および動作サンプルを掲載する。


(1)Windows上で動く「英和辞書バッチ」の概要

ここで作成した英和辞書バッチの動作サンプル。


英単語の意味を1つずつ調べるWSHコード(JScript):

// 英単語の意味を調べる。

e2j.get( "sage" );

e2j.get( "mean" );

実行結果:

sage
sage : (通例経験に富んだ年輩の)賢人 / 思慮深い,賢明な
sage : セージ(薬用・調味料のシソ科の草);その葉 / =sagebrush

mean
mean : 〈人が〉…‘を'『意図する』,‘の'つもりである;…‘を'言おうとある;示そうとする / 〈単語・句・文章などが〉…‘を'『意味を持つ』,‘を'『意味する』 / (人に対して)…‘を'当てる,向ける《+『名』+『for』+『名』》 / 《受動態で》〈人・物〉‘を'(…)向きにする / 〈物事が〉…‘を'示す,表す / (結果として)〈物事が〉…‘を'もたらす,生じさせる / 《『mean』+『for』+『名』+『to』 do》《米話》(…が…するような)つもりでいる 
mean : 《名詞の前にのみ用いて》(品質・価値・才能などが)『劣った』,つまらない / (人・行為などが)『卑劣な』,さもしい / 《古》(身分・地位などが)卑しい / 《まれ》(身なり・建物などが)みずぼらしい,見るもあわれな / 《米話》(動物が)御しにくい;(一般に)扱いにくい 
mean : 中庸,中道 / (数学で) / 平均[値];(特に)算術平均,相加平均 / (比例式の)中項,内項 / (両極端の)中間の,中央に位置する / (大きさ・品質・程度などが)平均的な,平均の

ある単語に,複数の品詞の意味がある場合,
一行ごとにそれぞれ分けて翻訳結果を表示している。


たとえば「sage」という単語の意味は
(某掲示板の「サゲ」ではなく)
「思慮深い」という形容詞だ。


また「mean」という単語の意味は
「意味する(動詞)」「卑劣な(形容詞)」「平均(名詞)」
などいろいろあるが,これも全て一発で取得できている。


次に,複数の単語をいっぺんに英和変換することもできる。

文章をスペースで分割して順番に単語訳を取得するだけ。


簡単な英語の文章:

// 複数の単語の意味を順番に調べる
"I like it very much ."
	.split(" ")
	.each(function( eword ){
		log(
			e2j.get( eword )
		);
	})
;

実行結果:

I
I : 『私は』私が 
I : iodineの化学記号 

like
like : …‘を'『好む』,‘が'好きである / 《しばしば否定文で,またwould,《英》shouldと共に用いて》…‘を'望む,…したい / 『好む』;望む / 《複数形で》好み,好きな事
like : (外観・性質などが)…『に似た』,のような / (やり方,程度などが)…『と同じように』 / …『らしい』,にふさわいし / 《おもに話》たとえば…のような / 《名詞の前にのみ用いて》(性質・外観などが)同じの,(数量が)等しい / 《補語にのみ用いて》似ている,そっくりで / たぶん,おそらく(probably) / (…に)似た人(物),(…と)同等の人(物),匹敵する人(物)《+『of』+『名』》 / …のように / あたかも…のように

it
it : 《すでに述べられた物・事または幼児,動物などを指して》『それは』(『を』),そのものは(を),そのことは(を) / 《その場の状況で相手に何であるか分かるような物・事または人を指して》『それは』(『を』),そのことは(を) / 《天候・時間・距離・事情・状態などを指して》 / 《It seems(happens, appears… )thatなどの形で》 / 《形式主語として》 / 《形式目的語として》 / 《It is … that(who, which)の形で…を強調して》 / 《ある種の動詞・前置詞に添える形式上の目的語として》 / 〈C〉(遊戯の)鬼 / 〈U〉《話》理想,第一人者 / 〈U〉《話》性的魅力 

very
very : 《副詞・形容詞・分詞形容詞を強めて》『非常に』,とても,たいへん,きわめて / 《否定語と共に用いて》『あまり』,さほど,たいして(…でない) / 《same, opposite, [one's]ownなどの前で》『真に,まったく』,ほんとうに / 《古》まったくの,本物の,真の / 《the(this,that,one's)~》『まさにその』,ちょうどその / 《the(one's)~》ただ…だけで(mere);(…)でさえ,までも(even)

much
much : (量・程度などが)『多くの』,多量の / 『たくさん』,多量 / 《通例否定文の補語として》大した物(事),重要な物(事) / 《動詞・過去分詞を強めて》『大いに』,非常に / 《形容詞・副詞の比較級・最上級を強めて》『ずっと』,はるかに / 《「同じ」の意味の語句を修飾して》たいてい,ほとんど

.

各単語ごとに日本語訳を付与できている。

文章としての日本語訳ではなく,
あくまでも単語レベルで分解した和訳を得ることができる。


文法やイディオムの勉強ももちろん大事だが,
単語力アップの目的で,ボキャビルに活用できるだろう。


(2)バッチの導入手順と,全ソースコード

では,この英和辞書バッチを導入しよう。


バッチが動作するためには,
タブ区切りで英語と日本語が並んでいる辞書ファイルが必要だ。

そのようなフリーの英和辞書データは,下記のまとめから入手できる:

著作権フリーで無料ダウンロードできる英和辞書のデータ。Edict, Ejdicなど英単語に日本語訳が付属するリスト
http://tagengo-gakushuu.hatenablog.jp/entry/20150827/p1

  • ネット上で無料で入手できる,英和辞典のデータファイル。 英語のテキストデータをコンピュータ・プログラムで自動処理するときなどに使える。


ここでは,パブリックドメインになっている
「ejdic-hand」の英和辞書ファイルを利用してみよう。


リンク先から「ejdic-hand」の辞書ファイルをダウンロードして解凍すると,
ejdic-hand-utf8.txt
というテキストデータが現れる。

この辞書ファイルと同じフォルダ上に,ソースコードを設置してゆく。


以下は,英和辞書バッチの全コード。


英和辞書の動作テスト.bat

@echo off

cscript //nologo eiwa.wsf > out.txt

pause


eiwa.wsf

<job>
	<script src="lib_datatype.js" />
	<script src="lib_log.js" />
	<script src="lib_fileio.js" />
	<script src="lib_arr.js" />
	<script src="lib_en2ja.js" />
	<script>
	
	// 初期化
	var e2j = new En2Ja({
		// 辞書ファイルのあるフォルダのパスを指定
		dic_dir_path : getWorkingWsfDirPath()
	});
	
	
	// 英単語の意味を調べる。
	log( 
		e2j.get( "sage" ) 
	);
	
	log( 
		e2j.get( "mean" ) 
	);
		// デフォルトでは英単語の大文字・小文字を区別し,
		// 複数の意味がある場合は改行区切りで返る。
	
	
	// 複数の単語の意味を順番に調べる
	"I like it very much ."
		.split(" ")
		.each(function( eword ){
			log(
				e2j.get( eword )
			);
		})
	;
	
	(
		// 経済ニュースの一文
		"For China , a Plunge and a Reckoning "
		 + "The stock market fall pierced the party’s mystique of omnipotence . "
		 + "In an interwoven world , the crisis should spur Beijing to prefer compromise to bullying ."
	)
		.split(" ")
		.each(function( eword ){
			log(
				e2j.get( eword, { case_ignore : true } )
				// 大文字・小文字の区別なし
			);
		})
	;


	</script>
</job>


lib_arr.js

/*

	WSHやピュアJSの便利配列メソッド

	ver 0.6 indexOfを追加
	ver 0.5 src()のバグを修正. rejectを追加
	ver 0.4 sort_byを追加
	ver 0.3 compact, include, uniqを追加
	ver 0.2 mapとfilterをreduceで記述

*/


// 配列のイテレータ
Array.prototype.each = function( func ){
	for( var i = 0; i < this.length; i ++ ){
		func.call( this, this[i], i ); 
	}
	return this; // チェインを継続
};


// Rubyのinjectに相当するメソッド
// http://computer-technology.hateblo.jp/entry/20150110/p1
Array.prototype.reduce = function( func, init_value ){
	// 初期値をセット
	var result = init_value;
	
	// 各要素ごとに
	this.each(function( item, index ){
		// 結果を累積更新する
		result = func( result, item, index );
	});
	
	// 累積結果を返す
	return result;
};


// オブジェクトを配列に変換
Array.src = function( iterable, func_item, func_length ){
	var arr = [];
	
	var length = null;
	if( func_length ){
		length = func_length( iterable );
	}else{
		length = iterable.length;
	}
	
	for( var i = 0; i < length; i ++ ){
		if( func_item ){
			arr.push( func_item( iterable, i ) );
		}else{
			arr.push( iterable[ i ] );
		}
	}
	return arr;
	
	// NOTE: [].slice.callを使う手もある。
	// http://lealog.hateblo.jp/entry/2014/02/07/012014
};


// 先頭から上位〜%の要素を抜き出す。端数は切り捨てる。
Array.prototype.slice_heads_by_percent = function( num ){
	var new_length = parseInt( this.length * ( num / 100 ), 10 );
	return this.slice( 0, new_length );
};


// 先頭を指定個数だけ切り捨てる
Array.prototype.cut_heads = function( num ){
	for( var i = 0; i < num; i ++ ){
		this.shift();
	}
	return this;
};


// IEにはindexOfがない
Array.prototype.indexOf = function(v){
	for( var i = 0; i < this.length; i ++ ){
		if( this[i] === v ){
			return i;
		}
	}
	return -1;
};

// 配列の配列をハッシュに変換
Array.prototype.arr_of_arr_to_hash = function(){
	var obj = {};

	this.each(function(arr){
		var k = arr[0];
		var v = arr[1];
		obj[ k ] = v;
	});
	
	return obj;
};


// 条件を満たす最初の一件
Array.prototype.find_first = function( func ){
	for( var i = 0; i < this.length; i ++ ){
		if( func.call( this, this[i], i ) ){
			return this[i];
		}
	}
	// 満たすものがなかったら
	err("条件を満たすものがありません。");
	return null;
};


// -------------- 内部でreduceを使った処理 ---------------


// map
Array.prototype.map = function( func ){
	return this.reduce(function( result, item, index ){
		result.push( func.apply( result, [ item, index ] ) );
		return result;
	}, []);
};


// 多次元配列を1次元にならす関数。
// 内部でreduceを使用
Array.prototype.flatten = function(){
	return this.reduce(
		function( result, item ){
			return (
				//Array.isArray( item ) // WSHや古いIEでは動かない
				( item instanceof Array )
					// 対象要素が配列ならば,再帰する
					? result.concat( item.flatten() ) 

					// 対象要素が配列でなければ,要素として採用
					: result.concat( item )
			);
		},

		// 空配列からはじめる
		[]
	);
};


// 条件に合うものだけ残す
Array.prototype.filter = function( func ){
	return this.reduce(
		function( result, item ){
			if( func( item ) ){
				result.push( item );
			}
			
			return result;
		},
		[]
	);
};


// 条件に合わないものだけ残す
Array.prototype.reject = function( func ){
	return this.filter(function(item){
		return ! func( item );
	});
};


// 要素がnullだったり空だったりfalseだったりするものを除去
Array.prototype.compact = function(){
	return this.filter(function(item){
		return (
			( !! item )
			&&
			( ( "" + item ).length > 0 )
		);
	})
};


// 含むか
Array.prototype.include = function(target_item){
	return this.reduce(function( result, item ){
		if( item == target_item ){
			result = true;
		}
		return result;
	}, false);
};


// 重複をなくす
Array.prototype.uniq = function(){
	return this.reduce(function( result, item ){
		if( ! result.include( item ) ){
			result.push( item );
		}
		return result;
	}, []);
};


// クロージャを渡して数値の昇順ソート
Array.prototype.sort_by = function( func ){
	return this.map(function(item){
		return {
			item  : item,
			score : func( item )
		};
	}).sort(function( v1, v2 ){
		return ( v1.score > v2.score ) ? 1 : -1;
	}).map(function(v){
		return v.item;
	});
};




// TODO: 配列データを手軽にダンプして中身を確認したい

// TODO: Haskellなどの便利メソッドの移植

// TODO: 重いループの非同期処理をするライブラリとマージ

// TODO: 二次元配列や動的計画法などのアルゴリズムをサポート






/*

sort_byのサンプルコード:

var s = [
	{
		name : "太郎",
		age  : 30
	},
	{
		name : "花子",
		age  : 80
	},
	{
		name : "次郎",
		age  : 29
	},
	{
		name : "マルガリータ",
		age  : 5
	}
].sort_by(function(item){
	// 年齢でソート
	return item.age;
}).map(function(item){
	// 結果表示用に整形
	return item.name + "=" + item.age;
}).join("\n");

WScript.Echo(s);


実行結果:

マルガリータ=5
次郎=29
太郎=30
花子=80

*/



lib_datatype.js


/*

	基本的なデータ型を便利に拡張する

	ver 0.3 ゼロ埋めの挙動を修正
	ver 0.2 ・String#to_b()を追加
	        ・ミリ秒までのタイムスタンプを追加
	ver 0.1 ゼロ埋めを追加

*/


// ---------- 文字列 ---------- 

// 文字列から整数へ
String.prototype.to_i = function(){
	return parseInt( this.replace(/,/g, ""), 10 );
};
Number.prototype.to_i = function(){
	return parseInt( this, 10 );
};


// 文字列から実数へ
String.prototype.to_f = function(){
	return parseFloat( this, 10 );
};
Number.prototype.to_f = function(){
	return parseFloat( this, 10 );
};

// 文字列から真偽値へ
String.prototype.to_b = function(){
	if( 
		( this == "1" ) 
		|| ( this.toLowerCase() == "true" )
	){
		return true;
	}else{
		return false;
	}
};

// 文字列が空でないか
String.prototype.is_not_empty = function(){
	return this.length > 0;
};


// 文字列が特定の値か
String.prototype.is = function( s ){
	return ( this == s );
};


// スネークからキャメルへ変換
String.prototype.toCamelCase = function(){
	return this.split(/_/g).map(function(token){
		if( ( token ) && ( token.length > 0 ) ){
			var s = token.charAt(0).toUpperCase();
			
			if( token.length > 1 ){
				s += token.substring( 1, token.length );
			}
			
			return s;
		}
		else
		{
			return null;
		}
	}).join("");
};

// 正規表現用の文字列に変換
String.prototype.to_reg_exp_str = function(){
	return ( this
		.replace(/\//g, "\\/")
		.replace(/\./g, "\\.")
		.replace(/\-/g, "\\-")
		.replace(/\+/g, "\\+")
	);
};


// ---------- 文字列(ファイルシステム) ---------- 

// ファイルパス文字列からファイル名を抽出
String.prototype.file_path_to_file_name = function(){
	return this.replace(/^.+\\([^\\]+)$/, "$1");
};


// ファイルパス文字列からフォルダパスを抽出
String.prototype.file_path_to_dir_path = function(){
	return this.replace(/\\[^\\]+$/, "\\");
		// FIXED: 末尾に\を残すように
};


// いま動作中のWSFファイルのディレクトリパスを返す
function getWorkingWsfDirPath(){
	return WScript.ScriptFullName.file_path_to_dir_path();
}


// 相対パス表記を絶対パス表記に変換
// ファイルパス中の .. や . を除去する
String.prototype.relative_file_path_to_abs_file_path = function(){

	var fso = WScript.CreateObject("Scripting.FileSystemObject");
	var s = fso.GetAbsolutePathName( this );
	return s;
};


// ---------- 数 ---------- 

// 数から文字列へ
Number.prototype.to_s = function(){
	if( isNaN(this) ){
		return "";
	}else{
		return "" + this;
	}
};
String.prototype.to_s = function(){
	return this;
};


// 正数を指定桁に0埋め
Number.prototype.zero_padding = function( digit_num ){
	if( digit_num > 0 ){
		// OK
	}else{
		err("0埋めの桁数が未指定");
		throw "0埋めエラー";
	}

	var num = this.to_i();
	if( num.to_s().length >= digit_num ){
		return num.to_s();
	}
	
	var continue_flag = true;
	var zeros = "0";
	while( continue_flag ){
		if( ( zeros + num ).length >= digit_num ){
			continue_flag = false;
		}else{
			zeros += "0";
		}
	}
	return zeros + num;
};
String.prototype.zero_padding = function( digit_num ){
	return this.to_i().zero_padding( digit_num );
};

// ---------- 日付 ---------- 

// 現在日付
function yyyymmdd(){
	var d = new Date();
	return d.getYear()
		+ ""
		+ ( d.getMonth() + 1 ).zero_padding(2)
		+ d.getDate().zero_padding(2)
	;
}

// 現在日時をミリ秒まで
function yyyymmdd_hhmmss_mmm(){
	var d = new Date();
	return d.getYear()
		+ ""
		+ ( d.getMonth() + 1 ).zero_padding(2)
		+ d.getDate().zero_padding(2)
		+ "_"
		+ d.getHours().zero_padding(2)
		+ d.getMinutes().zero_padding(2)
		+ d.getSeconds().zero_padding(2)
		+ "."
		+ d.getMilliseconds().zero_padding(3)
	;
}

// データを格納しやすい形式にする
Date.prototype.for_db = function(){
	return this.getYear()
		+ "/"
		+ ( this.getMonth() + 1 ).zero_padding(2)
		+ "/"
		+ this.getDate().zero_padding(2)
		+ " "
		+ this.getHours().zero_padding(2)
		+ ":"
		+ this.getMinutes().zero_padding(2)
		+ ":"
		+ this.getSeconds().zero_padding(2)
		+ "."
		+ this.getMilliseconds().zero_padding(3)
	;
};
String.prototype.to_datetime = function(){
	// マッチ?
	var m = this.match(/^(\d{4})\/(\d{2})\/(\d{2}) (\d{2}):(\d{2}):(\d{2})\.(\d{3})$/);
	
	// パース成功?
	if( m ){
		var d = new Date();
		d.setYear( m[1].to_i() );
		d.setMonth( m[2].to_i() - 1 );
		d.setDate( m[3].to_i() );
		d.setHours( m[4].to_i() );
		d.setMinutes( m[5].to_i() );
		d.setSeconds( m[6].to_i() );
		d.setMilliseconds( m[7].to_i() );
		
		return d;
	}else{
		return null;
	}
}


// ---------- ブール ---------- 

Boolean.prototype.to_s = function(){
	if( this.valueOf() ){
		// https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Boolean
		return "true";
	}else{
		return "false";
	}
};


lib_en2ja.js

/*

	英和変換オブジェクト
	
	辞書ファイルとしてejdic-handを使用
	
	ver0.1

*/


var En2Ja = function(params){
	this.init_dic( params.dic_dir_path );
};
En2Ja.prototype = {
	
	// 辞書データの行たち
	dic_info : null,
	
	// 辞書ファイルを読み込んで初期化(メモリに注意してね)
	init_dic : function( dic_dir_path ){
		// 辞書ファイル名
		var dic_file_path = dic_dir_path + "ejdic-hand-utf8.txt";
		
		// UTF8で読み込み
		var lines = inputUTF8( dic_file_path ).split("\n");
			//log("辞書ファイルの生データを読み込みました。");
		
		// のちのちの検索時間を減らすために
		// 最初の1文字で分類しておく。
		// また,大文字小文字を区別しない検索にも備える。
		var info = {};
		lines.each(function(line){
			// 先頭の一文字
			var ch = line.charAt(0).toLowerCase();
			if( ! info[ ch ] ){
				info[ ch ] = {};
			}
			
			// 行を解釈
			var arr = line.split("\t");
			var eword = arr[0];
			var ja_meaning = ("" + arr[1]).replace(/^ +/, "");
			var index_word = " " + eword.toLowerCase(); 
				// 小文字で検索可能にしておく。
				// 最初に無意味な文字を入れておく。
				// そうしないと「constructor」などの予約語でこける。
			//log(ch + "," + index_word);
			
			// 見出しを作成
			if( ! info[ ch ][ index_word ] ){
				info[ ch ][ index_word ] = [];
			}
			info[ ch ][ index_word ].push(
				[ eword, ja_meaning ]
			);
		});

		//log("辞書ファイルの解釈とインデクシングが完了しました。");
			// TODO: 高速化のためには,もっとちゃんとしたインデクシングを。
		
		// 保持
		this.dic_info = info;
		
	},
	
	// 英和変換
	get : function( eword, params ){

		// 大文字小文字の区別をなくすか
		var case_ignore = false;
		if( params && ( params.case_ignore ) ){
			case_ignore = true;
		}
		
		// 結果を初期化
		var res = new En2JaResult( eword );
		
		// 正常な文字列か?
		if( eword && (eword.length > 0) ){
			// 通過
		}else{
			return res;
		}
	
		// 辞書データに合わせて加工
		eword = eword
			.replace(/’/g, "'")
		;
		
		// 最初の一文字
		var ch = eword.charAt(0).toLowerCase();
		if( ! this.dic_info[ ch ] ){
			// 無効な文字始まり
			return res;
		}
		
		// 大文字と小文字を区別しない見出し語たち
		var arr = this.dic_info[ ch ][ " " + eword.toLowerCase() ];
		if( ! arr ){
			return res;
		}
		
		// マッチ結果を配列に格納
		arr.each(function(one_line_data){
			var eword_dic = one_line_data[0].replace(/^ /, "");
			var ja_meaning = one_line_data[1]
			
			// マッチ?
			if(
				( 
					// 大文字小文字を無視してマッチ
					case_ignore && (
						eword_dic.toLowerCase()
						==
						eword.toLowerCase()
					)
				)
				||
				(
					// 大文字小文字を区別してマッチ
					( ! case_ignore )
					&&
					(
						eword_dic
						==
						eword
					)
				)
			){
				res.record( eword_dic, ja_meaning );
			}
		});
		
		return res;
	}
};

// 検索結果オブジェクト
var En2JaResult = function(eword){
	this.eword = eword;
	this.data_arr = [];
};
En2JaResult.prototype = {
	// 検索クエリの英単語
	eword : null,
	
	data_arr : null,
	
	// 辞書データを保管
	record : function( eword_dic, ja_meaning ){
		this.data_arr.push([ eword_dic, ja_meaning ]);
	},
	
	// 文字列にする
	toString : function(){

		var s = this.eword + "\n"
			+ this.data_arr.map(function(data){
				return data[0] + " : " + data[1];
			}).join("\n")
			+ "\n"
		;
		
		return s;
	}
};



lib_fileio.js

/*

	ファイル操作のライブラリ
	
	ver 0.5 UTF8でファイル読み込み。SJISでファイル読み書き
	ver 0.4 ファイルの存在判定,削除処理を改良
	ver 0.3 ファイルの存在判定
	ver 0.2 ファイルコピー
	ver 0.1 UTF8の最低限の書き込みを実装

*/




// UTF8で新規ファイルに書き込み
function outputUTF8( s, file_path ){
	// ファイル新規作成
	// http://language-and-engineering.hatenablog.jp/entry/20081017/1224168811
	var fso_w = WScript.CreateObject( "Scripting.FileSystemObject" );
	if( fileExists( file_path ) )
	{
		fso_w.DeleteFile( file_path );
	}
	var txt_w = fso_w.CreateTextFile( file_path );
	txt_w.Close();
		// 内容はSJISで処理しきれないのでADODBを使う
	
	
	// UTF8読み書きのために
	// http://language-and-engineering.hatenablog.jp/entry/20090216/p1

	var safe_str = "etirほげWrevOetaerCevaほげSda tsixほげEtoNetaerCevaほげSda "
		+ "eniほげLetirほげWda rahほげCetirほげWda eniほげLdaeほげRda "
		+ "llほげAdaeほげRda txeほげTepyほげTda yraniほげBepyほげTda"
		;
	var safe_arr_key = safe_str
		.replace( new RegExp("ほげ", "g"), "げほ" )
		.split("").reverse().join("")
		.split(" ")
	;
	var safe_arr_val = [ 1, 2, -1, -2, 0, 1, 1, 2 ];
	var adcon = {};
	for( var i = 0, len = safe_arr_key.length; i < len; i ++ )
	{
		var key = safe_arr_key[ i ];
		var val = safe_arr_val[ i ];
		adcon[ key ] = val;
	}
	var obj_name_nanigashi = ("maer" + "tS.BDO" + "DA").split("").reverse().join("");


	// 書き込み(コードは難読化済み)
	var sw = WScript.CreateObject( obj_name_nanigashi );
	sw.Type = adcon[ "adTほげypeTほげext" ];
	sw.charset = "utf-8";
	sw.Open();
	sw.WriteText(
		s
		,
		adcon["adWほげriteLほげine"]
	);
	sw.SaveToFile( file_path, adcon["adSほげaveCreateOverWほげrite"] );
	sw.Close();

}


// UTF8で文字列を読み込み
function inputUTF8( file_path ){
	// 定数の準備
	var safe_str = "etirほげWrevOetaerCevaほげSda tsixほげEtoNetaerCevaほげSda "
		+ "eniほげLetirほげWda rahほげCetirほげWda eniほげLdaeほげRda "
		+ "llほげAdaeほげRda txeほげTepyほげTda yraniほげBepyほげTda"
		;
	var safe_arr_key = safe_str
		.replace( new RegExp("ほげ", "g"), "げほ" )
		.split("").reverse().join("")
		.split(" ")
	;
	var safe_arr_val = [ 1, 2, -1, -2, 0, 1, 1, 2 ];
	var adcon = {};
	for( var i = 0, len = safe_arr_key.length; i < len; i ++ )
	{
		var key = safe_arr_key[ i ];
		var val = safe_arr_val[ i ];
		adcon[ key ] = val;
	}
	var obj_name_nanigashi = ("maer" + "tS.BDO" + "DA").split("").reverse().join("");


	// 読み込み
	var sr =WScript.CreateObject( obj_name_nanigashi );
	sr.Type = adcon[ "adTほげypeTほげext" ];
	sr.charset = "utf-8";
	sr.Open();
	sr.LoadFromFile( file_path );
	var s = sr.ReadText( adcon[ "adRほげeadAほげll" ] );
	sr.Close();
	
	return s;
}


// SJISでファイル読み込み
// http://language-and-engineering.hatenablog.jp/entry/20081017/1224168811
function inputFileSJIS( file_path ){

	// 定数
	var ForReading   = 1; // 読み込み

	var fso_r = WScript.CreateObject( "Scripting.FileSystemObject" );
	var txt_r = fso_r.OpenTextFile( file_path, ForReading );
	
	// 1行ずつ読む
	var s = "";
	while( ! txt_r.AtEndOfStream )
	{
		s += txt_r.ReadLine() + "\n";
	}

	txt_r.Close();

	return s;
}


// SJISでファイル書き込み。既存ファイルは上書き
function outputFileSJIS( s, file_path ){

	var ForWriting   = 2; // 書き込み(上書き)
	//var ForAppending = 8; // 書き込み(追記)
	
	// 新規ファイル作成
	log("新規ファイル作成します・・・" + file_path);
	var fso_w = WScript.CreateObject( "Scripting.FileSystemObject" );
	if( fso_w.FileExists( file_path ) )
	{
		log("上書きします:" + file_path);
		fso_w.DeleteFile( file_path );
	}
	log("新規ファイル作成しました。" + file_path);
	var txt_w = fso_w.CreateTextFile( file_path );

	// 書き込み
	txt_w.Write( s );
	
	txt_w.Close();
	
	return;
}


// ファイルコピー。
// 上書きが起こらないように自動バックアップ
function copy_file_but_dont_overwrite(params){
	var path_from = params.from;
	var path_to   = params.to;

	err("ファイルコピー:\r\n" + path_from + " -> \r\n" + path_to );
	
	var fso = WScript.CreateObject("Scripting.FileSystemObject");
	
	// 重複すればバックアップ
	make_backup_with_numbering_if_exists( path_to );
	
	// コピー実行
	fso.CopyFile(
		path_from,
		path_to,
		true // ここではバックアップ済みなので上書きしてよい
	);
		// http://www.happy2-island.com/vbs/cafe02/capter00208.shtml

	// コピー結果のファイルが存在するか
	if( fileExists( path_to ) ){
		err("ファイルコピー成功");
	}else{
		throw "コピーに失敗しました。" + path_to;
	}
}


// あるファイルが存在すれば,番号付でバックアップ。
// 元ファイルは削除される。
function make_backup_with_numbering_if_exists( file_path ){

	if( fileExists( file_path ) ){
		err("既にファイルが存在します");
		make_backup_with_numbering( file_path );
		
		deleteFileCompletely( file_path );
		err("リネーム終了");
	}

}


// あるファイルを番号付でバックアップ
function make_backup_with_numbering( orig_file_path ){

	var fso = WScript.CreateObject("Scripting.FileSystemObject");
	
	var new_file_path = fso.GetParentFolderName( orig_file_path )
		// http://www.happy2-island.com/vbs/cafe02/capter00221.shtml
		+ "\\"
		+ fso.GetFileName( orig_file_path )
			// http://www.happy2-island.com/vbs/cafe02/capter00225.shtml
		+ "_backup_"
		+ yyyymmdd_hhmmss_mmm()
		+ "."
		+ fso.GetExtensionName( orig_file_path )
			// http://www.happy2-island.com/vbs/cafe02/capter00226.shtml
	;

	// 再帰的に呼び出す
	err("バックアップ中・・・\r\n" + orig_file_path + " -> \r\n" + new_file_path);
	copy_file_but_dont_overwrite({
		from : orig_file_path,
		to   : new_file_path
	});
	
	// コピー結果のファイルが存在するか
	if( fileExists( new_file_path ) ){
		err("バックアップ完了。\r\n" + orig_file_path + " -> \r\n" + new_file_path);
	}else{
		throw "バックアップに失敗しました。" + new_file_path;
	}
	
	fso = null;
}


// ファイルをごみ箱に送る。
// 完全に削除してしまうよりも安心に使える。
// http://language-and-engineering.hatenablog.jp/entry/20150528/WindowsBatSendFileToRecycleBin
function delete_file_to_gomibako( file_path ){
	
	err("ごみ箱に送ります。: " + file_path);
	
	// ファイルをゴミ箱に送る。
	// シェル名前空間でゴミ箱を指定してMoveHereする
	var sh = WScript.CreateObject("Shell.Application");
	var ssfBITBUCKET = 10;
	sh.NameSpace(ssfBITBUCKET).MoveHere(file_path);
	
	// 削除完了まで待つ
	while( fileExists( file_path ) ){
		WScript.Sleep(100);
	}
	err("ごみ箱に送りました。: " + file_path);
	sh = null;
}


// ファイルを完全に削除する。
function deleteFileCompletely( file_path ){
	err("完全にファイル削除します。" + file_path);
	WScript.CreateObject("Scripting.FileSystemObject").DeleteFile( file_path );
}


// ファイルが存在するか
function fileExists( file_path ){
	var fso = WScript.CreateObject("Scripting.FileSystemObject");
	return fso.FileExists( file_path );
}



lib_log.js


/*

	JS/WSH・JScriptでロギングをするライブラリ
	
	ver 0.2 ログ抑制機能を追加

*/


// 標準出力にログ書き出し
function log(s){ WScript.Echo(s); }


// "文字列".log()
String.prototype.log = function(){
	log( this );
};


// 標準エラー出力にログ書き出し
// リダイレクトされずにコンソールにも表示される。
// バッチの出力をテキストにリダイレクトしていても,
// コンソール上でリアルタイムに出力を確認できる。
function err(s, params ){

	if( params && ( params.suppress_log_display ) ){
		// 標準エラー出力を抑制
	}else{
		try{
			WScript.StdErr.WriteLine(s); 
		}catch(e){
			// GUIで実行された場合は標準出力だけでよい
		}
	}

	// 標準出力にも同時に書き出される
	log(s);
}


// ベンチ用
function tic(){
	tic.startTime = new Date().getTime();
}
function tac(){
	var ms = new Date().getTime() - tic.startTime;
	tac.time_span = ms / 1000;
}
function how_many_seconds(){ // 計測時間が何秒だったかを返す
	return tac.time_span;
}

コードは以上。

辞書データと同じフォルダ上に設置すれば動作する。

冒頭で紹介した動作サンプルがそのまま動く。


(3)英語の文章を本格的に解析したい場合は?

おまけとして,難しい英文を処理してみよう。


ウォールストリート・ジャーナルの電子版から,
中国の経済について述べている一文をピックアップして
単語ごとに自動翻訳:

(
	// 経済ニュースの一文
	"For China , a Plunge and a Reckoning "
	 + "The stock market fall pierced the party’s mystique of omnipotence . "
	 + "In an interwoven world , the crisis should spur Beijing to prefer compromise to bullying ."
)
	.split(" ")
	.each(function( eword ){
		log(
			e2j.get( eword, { case_ignore : true } )
			// 大文字・小文字の区別なし
		);
	})
;

※この文章の引用元:

For China, a Plunge and a Reckoning - WSJ
http://www.wsj.com/articles/for-china...

  • In today’s interwoven world, the stock-market crisis should spur Beijing to prefer compromise to bullying.


実行結果:

For
for : 《時間・距離》『…の間』 / 《利益・貢献》『…のために』 / 《適応・用途》『…向きの(に);』…用の(に);…のための(に) / 《目的・意向》『…のために,』に / 《敬意・記念》『…のために;』…を記念して / 《獲得・追求》『…を得るために』,を求めて / 《行く先・方向》『…あてに;』…[方面]行きの,に向けて / 《交換・報償など》『…に対して』;…と引き換えに;…のお返しに / 《原因・理由》『…のために』,なので / 《代理・代表》『…の代わりに;』…を代表して / 《形容詞の後に用いて》『…にとって,』には / 《比較級の後に用いて》『…の結果として,』…のために / 《対比》『…としては,』のわりには / 《関連》『…について,』の点では / 《資格・属性》『…として』 / 《賛成・支持》…『に賛成して』,を支持して / 《傾向・好み》…『に対する』,には / 《模倣》《おもに米》《英文》…の名を取って(after) / 《割合》…に対して / 《『for』+『名』〈人〉+『to』 doの形で,〈人〉が不定詞to doの意味上の主語を表して》…が(…することは,…するために) / […というのは]…だから 

China
China : 『中国』(正式名『the People's Republic of China』中華人民共和国) 
china : 『磁器』(porcelain) / (また『chinaware』)《集合的に》『陶磁器』,瀬戸物

,


a
A : answer / ampere

Plunge
plunge : …‘を'『突っ込む』,押し込む《+『down』(『forward[s]』)+『名』,+『名』+『down』(『forward[s]』)》;(…に)…‘を'突っ込む《+『名』+『into』+『名』》 / (ある状態に)…‘を'追い込む《+『名』+『into』+『名』》 / 『飛び込む』《+『in』(『down』)》,(…に)飛び込む《+『in』(『into,on,upon』)+『名』》 / (…へ)『突き進む』《+『into』(『through』)+『名』(do『ing』)》 / (ある状態に)陥る《+『into』+『名』》 / 《副詞句を伴って》〈道路などが〉急に落ち込む / 〈船が〉前後に揺れる,縦揺れする / 《話》(かけ事や事業などに)多額の金をつぎ込む / (…に)飛び込むこと《+『into』+『名』》 / ひと泳ぎ(a swim)

and
and : 《語・句・節を対等に結んで》…『と』…,…や…,および / 《数詞を結合して》…『足す』…,…に加えて / …『しかも』…,…して,同時に… / 《時間的に》『そして』,それから,すると(and then) / 《当然の帰結として》…『ので』,…だから(and so) / 《おもに話》《命令文などの後で》『そうすれば』,そうしたら / 《追加・強調して》それに,しかも / 《対照的な内容を導いて》ところが,しかし(but) / 《譲歩的に》それなのに,それでいながら / 《A and Bで一体の関係を表して》《単数扱い》 / 《同一語を反復して多数・継続などを表して》 / 《同一の複数名詞を結合して変化・種類などを表して》 / 《話》《「形容詞+and+形容詞」の形で前の形容詞が後に副詞的に働く》 / 《話》《「動詞come, goなど+and+動詞」の形でandとその後の動詞が不定詞の働きをして》 / 《「動詞+and+動詞」の形で後の動詞が現在分詞の意を表して》 / 《話》《文頭において前の質問・意見などに同意を示して》そうとも,そして(Yes!and) / 《話》《文頭に置いて驚き・疑念・非難などを表して》ほんとうに;…なのに 

a
A : answer / ampere

Reckoning
reckoning : 計算・〈U〉決算,清算・〈C〉《古》(病院・ホテルなどの)勘定書・〈U〉船の位置の推測 

The
the : 《前述の名詞または文脈でそれと分かる名詞に付けて》『その』,あの,名の / 《唯一の事物に付けて》 / 《方角・自然現象に付けて》 / 《用具・楽器・特定の病気などに付けて》 / 《修飾吾[句]を伴う名詞に付けて》 / 《単数普通名詞に付けて》(1)《種族全体》…『というもの』 / 《複数名詞または集合名詞に付けて》 / 《単位》『…につき;…単位[で]』 / 《身体の一部に付けて,所有格に代わる》 / 《形容詞に付けて》 / 《固有名詞に付けて》 / 《強意用法に》『随一の』,典型的な / 《「the+比較級,the+比較級」の形で》『…すればするほどそれだけ』 / 《比較級の前に》(…につれて,のために)『それだけ』,ますます

stock
stock : 〈C〉〈U〉(…の)『在庫品』,仕入れ品,ストック《+『of』+『名』》 / 〈C〉〈U〉(…の)貯蔵,蓄え《+『of』+『名』》 / 〈U〉《集合的に》『家畜』 / 〈U〉血統,家系,家柄 / 〈U〉〈C〉(動植物の)種属 / 〈U〉(スープ種・ソース種などに用いる)煮出し汁 / 〈U〉〈C〉《おもに米》(株式会社の)株,株式;〈C〉株券,《英》国債,地方債 / 〈U〉原料 / 〈C〉《複数形で》(刑罰用の昔の)さらし台 / 〈C〉(銃の)台じり / 〈C〉(接ぎ木の)台木 / 〈C〉(接ぎ穂をとる)親株 / 〈C〉(植物の)幹,茎 / 〈C〉(錨(いかり)のリングの下の)横棒 / 〈C〉(劇場の)専属劇団[のレパートリー] / 〈C〉アラセイトウ(春,赤紫色の花を開く) / (商品を)〈店など〉‘に'『仕入れる』,蓄える《+『名』〈店〉+『with』+『名』〈商品〉》 / …‘を'『仕入れている』,貯蔵している / (家畜などを)〈農場など〉‘に'入れる,(…を)〈川・草地など〉‘に'放つ《+『名』〈農場など〉+『with』+『名』》 / (…を)仕入れる,蓄える《+『up with』+『名』》 / 常に仕入れてある,常置の;標準の / ありふれた,陳腐な / 在庫品を扱う 

market
market : 〈C〉(食糧などが取り引きされる)『市場』,市(marketplace) / 〈C〉(食糧品などが売られる)店 / 〈C〉〈U〉(商品が売買できる)『市場』,販路,取引き先 / 〈C〉(日用必需品の)商売,商取引き / 〈〉(物品に対する)需要,要求,売れ口《+『for』+『名』》 / 〈C〉〈U〉『相場』,市況,市価 / 市場で売買する / 〈食糧・物産など〉‘を'市場に出す;(市場で)〈商品〉‘を'売る

fall
fall : 《しばしば副詞[句]を伴って》『落下する』,落ちる / 〈人・物が〉『倒れる』《+『down』(『over』)》 / 傷ついて倒れる,倒れて死ぬ / (…まで)垂れ下がる,〈道などが〉下降する《+『to』+『名』》 / 〈目・顔などが〉下を向く,うつむく,沈む / 〈暗やみ・静けさなどが〉(…に)たれ込める;〈災害・責任・病気・眠けなどが〉(…に)降りかかる《+『on』(『upon, over』)+『名』》 / 〈程度・数量・値段などが〉(…まで)『下がる』,減少する《+『to』+『名』》 / 誘惑に負ける,墜落する / (勢力・威信・人望などを)失う《+『from』(『in』)+『名』》 / 〈政権などが〉倒れる,〈要塞などが〉陥落する;(…の手に)落ちる《+『to』+『名』》 / 『なる』,陥る / 〈時・事が〉(…に)当たる,起こる,(しかるべき位置に)来る《+『on』(『upon』)+『名』》 / 〈光線・視線などが〉(…に)向けられる《+『on』(『upon』)+『名』 / (…に)分かれる《+『into』+『名』》 / 〈言葉などが〉(…から)漏れる《+『from』》 / 〈C〉(…から)『落ちること』,落下《+『from』+『名』》;(…への)落下《+『to』(『toward』)+『名』》 / 〈C〉(雨・雪などの)降った量《+『of』+『名』》 / 《複数形で》《固有名詞としては単数扱い》滝 / 〈C〉(…から…までの)落差《+『from』+『名』+『to』+『名』》 / 〈C〉倒れること,転倒 / 〈C〉(程度・数量・値段などの)下落,減少,衰退《+『in』+『名』》 / 《単数形で》(…の)陥落,崩壊《+『of』+『名』》 / 〈U〉堕落 / 〈C〉傾斜
fall : 『秋』(autumn) 

pierced


the
the : 《前述の名詞または文脈でそれと分かる名詞に付けて》『その』,あの,名の / 《唯一の事物に付けて》 / 《方角・自然現象に付けて》 / 《用具・楽器・特定の病気などに付けて》 / 《修飾吾[句]を伴う名詞に付けて》 / 《単数普通名詞に付けて》(1)《種族全体》…『というもの』 / 《複数名詞または集合名詞に付けて》 / 《単位》『…につき;…単位[で]』 / 《身体の一部に付けて,所有格に代わる》 / 《形容詞に付けて》 / 《固有名詞に付けて》 / 《強意用法に》『随一の』,典型的な / 《「the+比較級,the+比較級」の形で》『…すればするほどそれだけ』 / 《比較級の前に》(…につれて,のために)『それだけ』,ますます

party’s


mystique
mystique : 神秘感,神秘的な雰囲気 / 奥儀,秘法

of
of : 《所有・所属》…『の』,…のものである,…に属する・《材料・要素》…『でできた』,から成る・《部分》…『の』[『中の』] ・《数量・単位・種類を表す名詞に付いて》…の・《原因・動機》…『で』,のために(because of) ・《主格関係》…『の』,による,によって・《目的格関係》…『を』,の・《同格関係》…『という』・《関係・関連》…『についての』[『の』],の点で・《抽象名詞などと共に》…の[性質をもつ] ・《『It is』+『形』+『of』+『名』+『to』 doの形で,ofの後の名詞を意味上の主語として》・《分離》…『から』・《起原・出所》…『から』[『の』](out of) ・《『名』+『of』+『a』(『an』)+『名』の形で》…のような・《『名』+『of』+『mine』(『yours, his』など独立所有格)の形で》…の…・《時》(1)《副詞句を作って》…に《形容詞句を作って》…の・《時刻》《米》…前(to,《米》before) 
OF : OLD French古[代]フランス語 

omnipotence
omnipotence : 全能,無限の力(権力) 

.


In
in : 《具体的な場所,位置》 / …『の中に』(『で』) / …『において』,…で / 《intoの代りに移動を表す動詞と共に》…『の中へ』 / (乗り物)『に乗って』 / …『の状熊に』(『で』) / …『に従事して』,に属して / …『を身につけて』,に覆われて / 《『in』do『ing』の形で》…『するときに』,する際に(when) / 《時間》 / …『して』,…『が経過したあと』 / …『の間に』 / …『については』,…の点では / 《方法・手段・材料》…『で』 / 《人を目的語にして,性質・能力があることを示して》…の中に / …の目的で,のつもりで,として / 《比率割合》…のうちで,につき / 《過去分詞に伴って》…に[…されて] / 『中へ』(に) / 『在宅して』,帰って / (乗り物などが)『到着して』,(時期・季節が)来て / 出回って,流行して / 《俗》流行の,当世風の / 《話》特定の人々にのみ理解される
In : indiumの化学記号 
IN : Indiana 

an
an : (次にくる語の発音が母音で始まるときに用いる) / (子音[h]で始まり第1音節に強勢のない語の場合はanを用いることがある.ただし,この場合は[h]を発音しない)

interwoven


world
world : 《the world》『世界』,地球 / 《the world》(特定の時代・特徴・地域に限られた)世界,《one's world》(個人の生活・経験などの)世界 / 《the world》宇宙 / 〈C〉(特に生物がいる)天体 / 《the world》『世界の人たち』,世間の人たち / 《the world》『世間』,世の中,現世;《文》世俗,俗事 / 《修飾語を伴って》《the world》(特定のグループの作る)世界,(動植物の生存する)界 / 《a world, the world》大量(の…),たくさん(の…)《+of+名》

,


the
the : 《前述の名詞または文脈でそれと分かる名詞に付けて》『その』,あの,名の / 《唯一の事物に付けて》 / 《方角・自然現象に付けて》 / 《用具・楽器・特定の病気などに付けて》 / 《修飾吾[句]を伴う名詞に付けて》 / 《単数普通名詞に付けて》(1)《種族全体》…『というもの』 / 《複数名詞または集合名詞に付けて》 / 《単位》『…につき;…単位[で]』 / 《身体の一部に付けて,所有格に代わる》 / 《形容詞に付けて》 / 《固有名詞に付けて》 / 《強意用法に》『随一の』,典型的な / 《「the+比較級,the+比較級」の形で》『…すればするほどそれだけ』 / 《比較級の前に》(…につれて,のために)『それだけ』,ますます

crisis
crisis : (社会上・政治上の)『重大な事態』,『難局』,危機 / (人生の)重大な転機(岐路),重大事 / 最悪状態 

should
should : 《時制の一致によるshallの過去形》・《単純未来》・《意志未来》・《義務・当然・勧誘》・《should+原形》『すべきである』,するのが当然である,しなくてはならない・《should have+過去分詞》 …『すべきだった[のに]』,するのが当然であった[のに] ・《見込み・当然の結果》・《should+原形》 …『のはずである』,きっと…だろう・《should have+過去分詞》 …『して[しまって]いる(した)はずだ』,きっと…してしまっているだろう・《疑問詞とともに用いて,意外・不可解・驚きなど》『いったい…かしら』・《仮定条件に対する帰結節に用いて》・《一人称主語とともに》《現在または未来に反する仮定に対して》…『だろうに』,なのだが:《should have+過去に反する仮定に対して》 …『だったろうに』,したのだが・《二,三人称主語とともに》…させるのだが,したのだが・《条件節・譲歩節に用いて》『万一…だとしたら』(だとしても) ・《一人称主語とともに用いて,控え目で遠回しな表現として》…『したいが』,…するところが・《感情・判断などの表現に続くthat節に用いて》 …『するとは』,だなんて・《命令・提案・願望などの表現に続くthat節に用いて》 …『するように』,であることを / ・《目的を表す副詞節に用いて》 …する[ように];…しない[ように],してはいけない[から]

spur
spur : 『拍車』 / (…に対する)『刺激』,激励《+『to』(『for』)+『名』》 / 拍車状のもの,(鶏などの)けづめ,(植物の)距(きょ) / (山などの)支脈 / (行き止まり)支線 / 〈馬〉‘に'拍車を当てる《+『on』+『名』,+『名』+『on』》 / 〈人〉‘を'かり立てる:《『spur』+『名』+『to』(『into』)+『名』…に…をかり立てる》 

Beijing


to
to : 《方向》(1)(到着の意を含めて)…『へ』,に,まで / 《状況の変化》…[のほう]へ;…に[なるまで],その結果…になる / 《適用範囲》(1)《動詞に伴って》『…に対して』,に,へ / (2)《形容詞[句]・[代]名倍に伴って》『…に対して』 / 《程度・範囲》『…[に至る]まで』 / 《時間の終り》『…まで』(till) / 《to one's+『名』の形で》(…が)『…したことに[は]』 / 《比較・対比・割合》『…と比べて』,より,に対して / 《一致・適合》『…に合わせて』,に合って,に応じて / 《目的・意図》『…のために』 / 《運命・境遇》『…に』 / 《所属・関係》『…へ』,に[対して] / 《付加・付着・固執》『…に』 / 《対立・対向》…に[対して] / いつもの状態(位置)に / 停止(閉鎖)の状態に / 活動状態に(へ),仕事に 
to : 《名詞的用法》『…すること』 / 《形容詞的用法》『…するための,すべき』 / 《副詞的用法》『…するために』,して,するとは,すれば / 《独立用法》 / 《文全体を修飾する慣用語句》…すれば,してみると,…だが / 短縮文

prefer
prefer : 『むしろ』…『のほうを好む』(『選ぶ』) / (法廷なでに)…‘を'提出する,申し出る / 《文》(特に教会などで)〈人〉‘を'(…に)昇進させる《+『名』+『to』+『名』》 

compromise
compromise : 〈U〉〈C〉(…との)『妥協』,和解,和解《+『with』+『名』》 / 〈C〉妥協案,折衷案;折衷したもの / 〈信用・名声など〉'を'危うくする,傷つける,汚す / (…と)『妥協する』,和解する《+『with』+『名』》

to
to : 《方向》(1)(到着の意を含めて)…『へ』,に,まで / 《状況の変化》…[のほう]へ;…に[なるまで],その結果…になる / 《適用範囲》(1)《動詞に伴って》『…に対して』,に,へ / (2)《形容詞[句]・[代]名倍に伴って》『…に対して』 / 《程度・範囲》『…[に至る]まで』 / 《時間の終り》『…まで』(till) / 《to one's+『名』の形で》(…が)『…したことに[は]』 / 《比較・対比・割合》『…と比べて』,より,に対して / 《一致・適合》『…に合わせて』,に合って,に応じて / 《目的・意図》『…のために』 / 《運命・境遇》『…に』 / 《所属・関係》『…へ』,に[対して] / 《付加・付着・固執》『…に』 / 《対立・対向》…に[対して] / いつもの状態(位置)に / 停止(閉鎖)の状態に / 活動状態に(へ),仕事に 
to : 《名詞的用法》『…すること』 / 《形容詞的用法》『…するための,すべき』 / 《副詞的用法》『…するために』,して,するとは,すれば / 《独立用法》 / 《文全体を修飾する慣用語句》…すれば,してみると,…だが / 短縮文

bullying


.

だいたい単語を翻訳できている。
が,ところどころ抜けている点に注意しよう。


これはなぜかというと,英単語を「原形」に直さずに
変化形のままで辞書検索しているからだ。

動詞に -ing がついたような形は,
すべてが辞書の見出しに掲載されているわけではない。


なので,文章を解析するためには
「原形に直す」という処理が必要になる。

これはつまり,「英文を形態素解析して単語ごとにPOSタグをつける」
という処理に相当する。


そして,そのような処理は下記のバッチで実行できる。

Windowsで英語の文章を形態素解析する無料ツール「TreeTagger」の導入手順と使い方 (フリーソフトのPOS Taggerで,英文の単語分解・品詞判別をバッチ処理化)
http://language-and-engineering.hatenablog.jp/entry/20150819/EnglishPosTagger...

  • 英文を単語に分解し,品詞を判別し,各単語の原型を算出してくれる。


POSタガーで英文を解析し,各単語を原形に直せばよい。

その出力結果を,さらに英和辞書バッチにかければ
各単語のそれぞれの日本語訳を正確に取得できる。


簡単に組み合わせられるので,ぜひお試しあれ。

(4)オフラインのCUI英和辞書の試みとして,既存事例

CUIで英和辞書を実現する,というアイデアは,
Linux/Unix上ではトライした人たちがいる。

簡単に言うと,辞書データファイルをgrepするような仕組みを
自動化すればよい。

Linux のコマンドラインでオフライン英和辞書 - Qiita
http://qiita.com/yubais/items/21cac44...

  • grep を使えば簡易辞書の完成である


英語力を向上させたいのでまずは Emacs からはじめた | Futurismo
http://futurismo.biz/archives/2538

  • 英語学習に役立ちそうな EmacsLisp を集めてみる.


第2部 UNIXで使える辞書ブラウザ
http://hp.vector.co.jp/authors/VA0000...

  • UNIXで使えるさまざまな辞書ブラウザを紹介し、 そのインストール方法と使いかたについて解説。
  • ここで紹介するほとんどの辞書ブラウザは EBライブラリを使って辞書を検索している。 また、ネットワーク越しに辞書を引けるものは すべてNDTPDと通信することを前提としている。
  • 外字を画像として表示できないCUIベースの辞書ブラウザのため、 EBライブラリでは辞書ごとに外字の代わりに表示する文字列を指定できる。


Windowsでは,オフラインで英和・和英変換するツールとして
IMEの拡張機能がある。

「カタカナ語・英和辞書」がONなら,
入力した日本語の文字列をそのまま英単語に変換してくれたりする。


しかしこれは文字入力ソフトの一機能なので,
バッチプログラムに埋め込んで大量のテキストを翻訳するのには向いていない。

Windows 7 で文字変換時にカタカナを英語に変換する吹き出しが出てきません - マイクロソフト コミュニティ
http://answers.microsoft.com/ja-jp/wi...

  • MIcrosoft IMEを使っていると仮定しますが、IMEのプロパティで「辞書/学習」タブを選び 「MIcrosoft IME カタカナ語英語辞書」にチェックはついていますか?

関連する記事:

Windowsで「kakasi」のコマンドを使い,日本語文章を単語に分解,ローマ字変換する方法 (kakasiで形態素解析するWindowsバッチのサンプルコード)
http://language-and-engineering.hatenablog.jp/entry/20150109/KakasiOnWindowsU...


Windowsバッチで,手軽に日本語テキストを自動読み上げ(Text To Speech)する方法 …WSHでSAPIやSpeech.SpVoiceを使う音声合成の手順とサンプルコード
http://language-and-engineering.hatenablog.jp/entry/20150202/JapaneseTextToSp...


「自然言語処理論」の講義ノートPDF。形態素解析や文脈自由文法,知能機械による言語処理の扱い
http://language-and-engineering.hatenablog.jp/entry/20140511/NaturalLanguageP...


外国人に出会った時に仲良くなるための,最低限の必須フレーズ集 (どの言語にも当てはまる,基本の初歩会話集のテンプレート)
http://language-and-engineering.hatenablog.jp/entry/20130702/ListOfCommonLang...


「英検」の受験者数の推移グラフ。級別のレベル・合格率の比較や,英語の人気がわかる統計情報
http://language-and-engineering.hatenablog.jp/entry/20150816/EikenStatisticsG...


あなたが正規表現の中級者か判別する10問テスト (文字列処理の必須知識)
http://language-and-engineering.hatenablog.jp/entry/20131028/RegExpProgrammin...