2022-06-19に更新

pycall ( python 用の機械学習向けのライブラリーを Ruby で使えるようにした Ruby gem ) を機械学習向けのライブラリーじゃないもので使う。

translate to

_why ( === why the lucky stiff ) のことを知って、Why's ( poignant ) Guide to Ruby :wikipedia の日本語訳版 翻訳 青木靖を勝手に epub に再編集しはじめてずっとずっと 何日も作業していると ( 訳 ( どころか全てが丁寧 ) が悪いわけではなく 2 バイト文字とそうでない文字がくっついてると自分はディスクレシアのようにゲシュタルト崩壊になるので、そういうところとアーカイブされているオリジナルに近いサイトで生きているものにリンクを張り替えたりということを調べていた。つまり 2004 年くらいにレイドバックして文章の意味をおしはかっている期間が続いて )、Ruby が気になり始めた。

Rf. http://www.aoky.net/articles/why_poignant_guide_to_ruby/

2004

Scala の古本を買って読みたいと考えていたのに、なかなか進めないうちに Ruby のことにひきよせられていく。しかも、20 年近く前の。
バージョン 1.8 以前。

Ruby についてはよく知らないが、知らないうちに書いてると、これ基本的なかたこと英語になっているよなということがわかる言語で、その後に python をわからないなりに書くと、どうしても間違うところがあって、そこが最も Ruby の気に入っているポイントだった、半年から 1 年まえあたり。
その間違う、お気に入りポイントは、「 p 」。
python でも自然に p で書き続けて、実行すると当然エラーになるが、見直してもわからない。あってる、あってるのに ... とイライラしはじめて、コーヒーをいれながら豆の香りをかいでると、嗤いだしてしまう。
「 p 」だ。

それくらい p は自然に手になじんでしまう。というところが、すごいなと感じていて、クラスとか、Ruby を使ったフレームワークだとかにはまるで興味が持てないので、とりあえず Ruby についてはもういいと思っていた。というところで、ふいに _why の存在で、急激に、そういう人がフィーリングが合ったという、その背景について知りたくなった。
フラタニティー的な一色世界に見えてたけど、そうでもないの?と、アンチポストモダンと位置づけられたりする _why のその手作り風のおもしろさは、Ruby のどのへんに共感したのだろうか

1999 年発行の matz の本を買おうかどうか、結局読まないとなった紙の本がふえると、かなり精神的ダメージとなって責めてくるので、何日か迷っている。

迷っている間に、おそらく初期の Ruby ユーザーマニュアルを見てみる。
もともと matz が日本語で書いたものを英語にしたものとして _why が本で紹介したものだが、当然、リンク切れで、同じとされているもののうちこちらが、ディスクレシアでもなんとかなりそうな感じがしたので、それを無難に翻訳してもらうものを書いた。たぶん、古いためか翻訳前の日本語のテクストは現在公開されていないようだ。まあ、日本語のテクストだと読めないかもしれない、ゲシュタルト崩壊で。おおよその古いプログラミング言語本はゲシュタルト崩壊しやすいデザインで止まっていて、現在もそれを継承していることが多い ( と思います )。

Rf. http://www.math.bas.bg/bantchev/place/ruby-ug.html

python

!pip install googletrans==4.0.0-rc1
!python -m pip install requests beautifulsoup4

import requests,re
from bs4 import BeautifulSoup

from googletrans import Translator
translator = Translator()

url = "http://www.math.bas.bg/bantchev/place/ruby-ug.html"
res = requests.get(url)
soup = BeautifulSoup(res.text, "html.parser")
ptag_list_0 = soup.find_all('p')


for index,lines in enumerate(ptag_list_0):
    if(re.match(r'\w',lines.text) != None ):

        texts = re.sub(r'\.\s+','. ',lime.text)
        texts = re.sub(r'\?\s+','? ',texts)
        texts = re.sub(r'\!\s+','! ',texts)
        texts = re.sub(r'\,\s+',', ',texts)
        print(texts)
        try:
            translated = translator.translate(texts, dest='ja')
            print(index, translated.text)
            ptag_list_0[index].string = translated.text
        except IndexError:
# check
#res2 = requests.get(url)
#soup2 = BeautifulSoup(res2.text, "html.parser")
#ptag_list_2 = soup2.find_all('p')
#
#
#for index,lines in enumerate(ptag_list_2):
#    print(lines.text)
#    print(ptag_list_0[index].text)
metatag = soup.new_tag('meta')
metatag.attrs['charset'] = "utf-8"
soup.head.append(metatag)

import os
filename = os.path.basename(url)
with open(filename, "wb") as f_output:
    f_output.write(soup.prettify("utf-8"))

web サイトのソースのなかの p タグで囲まれた文字列を順番に google の翻訳にかけると、だいたい文章が都合よく翻訳できる、という前提で、反対に、都合悪いというのは、それ ( <p> タグ ) 以外のとこがプログラムコードを表現した箇所だったりしたら、コードのメソッドが直訳されたり、ピリオドが 。になったりで利用しづらくなる。つまり、自然言語のできるだけ訳してほしいところだけを選んで機械翻訳したいので、大まかに選別するということだ。

そして、その前提で、じゃあ、p タグのところだけ機械的に翻訳して、またもとあった HTM ソースに戻したら、70% くらい翻訳されてるんじゃない?という予想を立ててやってみたというものだ。

もちろんそのままを web ページ翻訳にしてもいいけど、そうすると都合悪いとこもその時点でwebサービスの機械学習の結果の精度が完全にいいとこまできてないと払拭できないので、直していく作業がでてくる。読めなくなるし。
だから、<p> から </p> までだけ、あとは絶対に触らなくていいからねと google tanslate に依頼して、翻訳済みの p タグ内テキストを HTML に書き戻すというプログラムになっている。

例えばこのページでやってみるとこうなる。

やってみておかしいなと思ったのは、python beautifulsoup4 だとパースされたオブジェクト ( 上の例では doc のことを指す ) って深いコピーじゃなく、element として変更すると ( 上の例では ptag_list_0 ) オブジェクトの持つ値も変更されているんだということだった。奇妙に感じたがそういうものだった。


PyCall 実験

PyCall は Ruby 深層学習のために python をバインド ( ではなく、ブリッジらしいけど、バインド?) する感じで、python 用の機械学習のライブラリを Ruby で使えるようにする目的で用意されているので、機械学習のライブラリ以外はどうなのかな?と、この上の python コードで使用したライブラリを Ruby で呼んでみる。

html = `curl -s 'http://www.math.bas.bg/bantchev/place/ruby-ug.html'`

require 'oga'
#require 'nokogiri'

require 'pycall/import'
include PyCall::Import
pyfrom 'googletrans',import: :Translator

translator = Translator.new

doc = Oga.parse_html(html)
#doc = Nokogiri::HTML.parse(html)

doc.css('p').each {|x|
#  puts &quot;#{x.text}&quot;
  if x.text != "" && (x.text.match?(/^\w/) || x.text.match?(/^\(/))
    x.text.gsub!(/^s*/,'')
    x.text.to_s.gsub!(/\.\s*/,'')
    begin
      translated = translator.translate(x.text,dest='ja')
      p x['text'] = translated.text
    rescue => evar
      p $!
    end
  else
#    p x.text
  end
}

p doc.to_xml
#p doc.to_html

できますね。

では、vosk はどうだろう

ツイッターでシェア
みんなに共有、忘れないようにメモ

tomato

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント