LaTex文章をGoogle翻訳する方法

Google翻訳ですが、ファイルをアップロードして翻訳してくれる機能があって、とても便利です。むかし日本語で書いたLaTex文章があったのですが、手っ取り早く英語に翻訳したくてGoogle翻訳を使うことにしました。

f:id:etopirika5:20180202040948p:plain

Google翻訳、テキストファイルなんでも受け取ってくれるのですが、LaTexのコマンドが認識されずに崩れてしまいます。たとえば\begin{figure}などのコマンドは"\ begin {figure}"となってしまったりバックスラッシュに変なスペースが入ってしまいます。また\begin{document}などのLaTexのコマンドを検出するとエラーがでて翻訳が中断されてしまします。


そこでGoogle翻訳をうまく騙すためには、LaTexのコマンドを別の言葉に変換する必要があります。Latexのコマンドを意味のないアルファベットから成る言葉(zzzsadfgなど)に置き換えれば、そのまま出力されるのでOKです。翻訳が終わればあとはその記号をもういちどLaTexに変換しなおせばOKです。

Pythonを使って簡単な変換プログラムを書きました。

Latex→Text変換プログラム

import random 
import string

# compute nine key character starting from zzz
def getKey(): 
	s = 'zzz'
	for i in xrange(6):
		s = s+random.choice(string.ascii_lowercase)
	return s

# detect starting command 
def beginCode(u0):
	if u0.find("\\begin{equation}")==0: return 0
	if u0.find("\\begin{figure}")==0 : return 1
	if u0.find("\\begin{eqnarray}")==0: return 2
	if u0.find("\\begin{tcolorbox}")==0: return 3
	return -1

# detect ending command 
def endCode(u0):
	if u0.find("\\end{equation}")==0: return 0
	if u0.find("\\end{figure}")==0 : return 1
	if u0.find("\\end{eqnarray}")==0: return 2
	if u0.find("\\end{tcolorbox}")==0: return 3
	return -1

def convert(fname):
	list_line = []
	for l0 in open(fname, 'r'):
		l0 = l0.rstrip()		
		u0 = l0.decode('utf-8')
		list_line.append(u0)
	icode = -1;
	list_Out = []
	list_Tmp = []
	list_Map = []
	for i in xrange(len(list_line)):
		u0 = list_line[i]
		if beginCode(u0) != -1 and icode == -1:
			icode = beginCode(u0)
		if endCode(u0) == icode and icode != -1:
			icode = -1
			list_Tmp.append(u0)
			key = getKey()
			list_Tmp.insert(0,str(len(list_Tmp)))	
			list_Tmp.insert(0,key)
			list_Map.append(list_Tmp)
			list_Tmp = []
			list_Out.append(key)
			continue
		if icode != -1:
			list_Tmp.append(u0)
			continue
		while 1:
			ibeg = u0.find("$")
			if ibeg == -1:
				break;
			else:	
				iend = u0.find("$",ibeg+1)		
				if iend == -1:
					print(u0)
				assert iend != -1
				u1 = u0[0:ibeg]
				u2 = u0[iend+1:]
				eqn = u0[ibeg:iend+1]
				key = getKey()
				list_Map.append([key,"1",eqn])
				u0 = u1+key+u2
		if u0.find("\\usepackage")==0 or \
		 u0.find("\\geometry")==0 or \
		 u0.find("\\newcommand")==0 or \
		 u0.find("\\begin{document}")==0 or\
		 u0.find("\\tableofcontents")==0 or\
		 u0.find("\\maketitle")==0 or\
		 u0.find("\\documentclass")==0 or\
		 u0.find("\\end{document}")==0:
			key = getKey()
			list_Out.append(key)
			list_Map.append([key,"1",u0])
			continue
		list_Out.append(u0)

	f = open('toGoogleTrans.txt', 'w')
	for u0 in list_Out:
		s0 = u0.encode('utf-8')
		f.write(s0+"\n")
	f.close()

	f = open("keyMap.txt", "w")
	for imap in xrange(len(list_Map)):
		list0 = list_Map[imap]
		for l0 in list0:
			print(l0)
			f.write(l0+"\n")

if __name__ == "__main__":
	convert("main_ja.tex")

このプグラムを使うと"main_ja.tex"という日本語のLaTexファイルが、"toGoogleTrans.txt"というLaTexコマンドが全てキーに置き換わったファイルと、"keyMap.txt"というキーの一覧のファイルが生成されます。"toGoogleTrans.txt"をGoogle翻訳して、"fromGoogleTrans.txt"という名前で保存します(APIはないみたいなので、手動でやります)。こんどはkeyMap.txtと"fromGoogleTrans.txt"というファイルから英語のLaTexを生成します。

Text→Latex変換プログラム

def getDict(fname_keyMap):
	list0 = []
	for l0 in open(fname_keyMap,"r"):
		l0 = l0.rstrip()
		list0.append(l0)
	dic0 = {} 
	il = 0
	while(1):
		if il >= len(list0):
			break;
		key = list0[il]
		num = int(list0[il+1])
		print("key:",key,"num:",num)
		list2 = list0[il+2:il+2+num]
		il += num+2
		dic0[key] = list2
	print(dic0)
	return dic0

def convLatex(fname_txt, dic0):
	list0 = []
	for l0 in open(fname_txt,"r"):
		l0 = l0.rstrip()
		if l0.find("\\ section {")==0:
			list0.append("\\section{"+l0[11:])
			continue
		if l0.find("\\ subsection {")==0:
			list0.append("\\subsection{"+l0[14:])
			continue
		if l0.find("\\ subsubsection {")==0:
			list0.append("\\subsubsection{"+l0[17:])
			continue
		if l0.find("\\ title {")==0:
			list0.append("\\title{"+l0[9:])
			continue
		if l0.find("\\ author {")==0:
			list0.append("\\author{"+l0[10:])
			continue
		while(1):			
			is_Cap = False
			ibeg = l0.find("zzz")
			if ibeg == -1:
				ibeg = l0.find("Zzz")
				is_Cap = True
			if ibeg == -1:
				list0.append(l0)
				break;
			key = l0[ibeg:ibeg+9]
			if is_Cap: 
				key = "z" + key[1:9]
			val = dic0[key]
			if len(val)==1 :
				l0 = l0[0:ibeg]+val[0]+l0[ibeg+9:]
			else:
				for lv in val:
					list0.append(lv)
				break

	f = open('main_en.tex', 'w')
	for l0 in list0:
		f.write(l0+"\n")
	f.close()

if __name__ == "__main__":
	dic0 = getDict("keyMap.txt")	
	convLatex("fromGoogleTrans.txt", dic0)


以上で無事に、翻訳されたLaTexドキュメント"main_en.tex"を得ることができます。

中国では小中学校からAI人材を育成する?

今日、中国のWebサイトで、こういった記事を見かけました。

国务院:中小学应设置人工智能课程,推广编程教育_教育_腾讯网


人工智能(rén gōng zhì néng)は人工知能つまりAIのことです。最近、色々と話題になっていますね。深度学习(shēn dù xué xí)=ディープラーニングなどの機械学習の技術が発達したことで、人間に匹敵する画像や音声の認識が可能になり、注目を集めています。この先、自動運転などの技術が開発されれば、運転手などの職業が機械に取って代わり、大きな社会的影響があると考えられます。

国务院(guó wù yuàn)とは中国の行政機関、日本で言うところの内閣、つまり霞ヶ関にある省庁の集まりみたいなものらしいです。
中華人民共和国国務院 - Wikipedia

その国务院が発表したところによると、小中学校で人工知能に関する課程を段階的に増やしていくとのことです。また、高校教育ではさらに、数学、物理、生物、計算幾何学、心理学、社会科学など、人工知能の知識にプラスアルファされるような複合的課程を増やして、高度なAI人材を育成するとのこと。

交互式学习(jiāo hù shì xué xí)=コンピュータを使ったインタラクティブな教育の平台(píng tái)=プラットフォームも作るようです。

中国はかなり人工知能技術を高めることに本気みたいですね。国が主導になってトップダウンで戦略的に教育を改革しています。日本やカナダでも人工知能は世界を変えると騒がれていますが、さすがに小中学校の教育を変えるという話は聞きません。小中学校では、せいぜい2次方程式の解法レベルの数学しか教えることはできないと思うので、どのぐらい踏み込んで人工知能の技術を教えられるかは疑問ですが、小さい頃から計算機に馴染んでおくことは大切だと思います。

日本の小中高の理数系の試験問題というと、かなりの確率で単純な算数(筆算とか)をミスなく正確に行うことが要求されます。特に化学や物理の試験は、モル数の計算とかかなりヘビーな筆算が登場したと思います。しかしながら、今の生活は、スマホやラップトップなどの計算機が身近にあることが当たり前なので、計算機ができるような単純な計算を、人間が正確に行う技術よりも、そういった単純な問題を計算機に解かせるためのプログラム能力のほうが必要になることは間違いありません。小中からAI教育というのは早すぎる気がしますが、退屈な手計算はできるだけ計算機にさせて、問題の本質に集中して教えるということなら、僕は間違っていないと思います。

しかしながら、人工知能の技術というのは、計算幾何学の中でも応用に近い分野で、実際の問題に応用しようとすると、かなりその分野に詳しくないといけません。やはり、人工知能だけを教えるのではなくて、それとは別の専門分野も(人工知能に負けないぐらい)教育しなければなりませんね。

こういった人工知能の開発に重要なのは、どれだけ大量で質の高いデータが集められるかです。金盾工程(jīn dùn gōng chéng)といって、中国ではインターネットが国によって管理されていますので、データを国が主導して集めようと思えば、簡単に集められるでしょう。また 支付宝(zhī fù bǎo)などの電子マネーや、WeChatなどのSNSが発達して、なんでもオンライン化されているので、データも集まりやすいですね。

また、AIの分野ではAndrew Ngなど、华裔美国人(huá yì měi guó rén)=中国系アメリカ人の研究者が活躍しています。

AIの今後は中国が握っているのかもしれませんね。

www.theverge.com

Little History of Canada 第1章を読んだ 単語I

カナダの歴史について書かれた本を読んでいます。

www.amazon.ca

よくこういったカナダの歴史の本を読んでいると、市民権(citizenship)取得のための試験の準備をしているの?と聞かれるのですが、関係ありません。特に理由があるとすれば、歴史について知っていると、博物館に行った時や、カナダのテレビ番組を見るときにより一層楽しめるからです。まあ滞在している国のことに詳しくなって損はありません。もし他の国に行くことになっても、カナダの人と喋ったり、カナダのことを説明する時に役に立つでしょう。

第1章は「Home and Native Land」というタイトルでした。今日は分からなかった単語をいくつか羅列します:

insinuate = 忍び込む

spectacled bear = カナダにいるクマ

f:id:etopirika5:20170828092155j:plain

matrilineal = 女の人が家系をつぐシステム

f:id:etopirika5:20170828092408g:plain

lake whitefish = カナダの湖にいる淡水魚

f:id:etopirika5:20170828092537j:plain

cordillera = 山脈、山系

stockade = 丸太を立てた柵で作った囲い

f:id:etopirika5:20170828093317j:plain

flotilla = fleetと同じ 船団

f:id:etopirika5:20170828093449j:plain

Auk = 鳥の一種 (Puffinとかもこのグループ)

f:id:etopirika5:20170828093628j:plain

pastoralist = 牧畜業の人

bog iron = 沼地で見られる鉄鉱石

f:id:etopirika5:20170828094815j:plain
Bog iron - Wikipedia
Iron-oxidizing bacteria (鉄バクテリア)というのが地下水から湧き出た鉄イオンを酸化して沼の底に溜まる酸化鉄にするらしいです。沼の底に溜まる鉄、ちょっと見てみたいですね。

salubrious = healthy,健康な

dugout = 地面を掘った壕、野球のベンチ

f:id:etopirika5:20170828095056j:plain

medicine wheel = アメリカ先住民の世界観、またはそれを表す石をリング状に並べたモニュメント

f:id:etopirika5:20170828095325j:plain

fluted-stone = 溝のついた石

fluteで溝を作るという動詞になります。fluted nut=溝付きナットなど

tapir = バク

Peccary = ペッカリー 南米の動物

f:id:etopirika5:20170828100234j:plain
Peccary - Wikipedia
イノシシみたいな動物ですね