質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1653閲覧

[JSONDecodeError]Googletransが急に結果を出力してくれなくなった

Yukiya025

総合スコア86

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/10/05 00:03

編集2018/10/06 05:14

一旦は動いたコードなのに、JSONDecodeErrorが出て翻訳がでなくなりましたorz

試したこと

  • freqdist_list = freqdist.most_common(100)most_common(100)の数を100にしてみる。(一旦は動いたけど、結局動かなくなる)
  • 負担がかかるのではと思いtime.sleep(5)を入れても状況変わらず。。。

どうぞよろしくお願いします:(

エラー文

commandline

1ayumka@yukiya:~/PycharmProjects/26and1$ python 26and1.py 2Traceback (most recent call last): 3 File "26and1.py", line 44, in <module> 4 show_word() # csvScraping.py 5 File "/home/ayumka/PycharmProjects/26and1/csvScraping.py", line 15, in show_word 6 ru_ja = translator.translate(ru, 'ja') 7 File "/usr/local/lib/python3.6/dist-packages/googletrans/client.py", line 172, in translate 8 data = self._translate(text, dest, src) 9 File "/usr/local/lib/python3.6/dist-packages/googletrans/client.py", line 81, in _translate 10 data = utils.format_json(r.text) 11 File "/usr/local/lib/python3.6/dist-packages/googletrans/utils.py", line 62, in format_json 12 converted = legacy_format_json(original) 13 File "/usr/local/lib/python3.6/dist-packages/googletrans/utils.py", line 54, in legacy_format_json 14 converted = json.loads(text) 15 File "/usr/lib/python3.6/json/__init__.py", line 354, in loads 16 return _default_decoder.decode(s) 17 File "/usr/lib/python3.6/json/decoder.py", line 339, in decode 18 obj, end = self.raw_decode(s, idx=_w(s, 0).end()) 19 File "/usr/lib/python3.6/json/decoder.py", line 357, in raw_decode 20 raise JSONDecodeError("Expecting value", s, err.value) from None 21json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) 22

該当コード

python

1# 26and1.py 2# -*- coding: utf-8 -*- 3from nltk import FreqDist 4import pymorphy2 5import csv 6import re 7 8import del_words 9from csvScraping import show_word 10 11downloadtxt = open('26and1.txt', 'r') 12texts = downloadtxt.read() 13texts = re.sub('[.,?!()\'—]', ' ', texts) 14texts = texts.split() 15 16analyzer = pymorphy2.MorphAnalyzer() 17 18lemma_list = [] 19for text in texts: 20 lemma = analyzer.parse(text)[0].normal_form 21 lemma_list.append(lemma) 22 23lemma_list = list(filter(lambda d: d not in (str(del_words.del_w)), lemma_list)) 24freqdist = FreqDist(lemma_list) 25freqdist_list = freqdist.most_common(100) 26 27with open('26and1.csv', 'w') as file: 28 writer = csv.writer(file, lineterminator = '\n') 29 writer.writerow(['Ру','Ном']) 30 for n in range(0, len(freqdist_list)): 31 writer.writerows([freqdist_list[n]]) 32pass 33 34show_word() # csvScraping.py 35

python

1# csvScraping.py 2import pandas as pd 3from googletrans import Translator 4import time 5import warnings 6warnings.filterwarnings('ignore') 7# https://pypi.org/project/yandex-translater/ を使うか? 8 9def show_word(): 10 csv_input = pd.read_csv('26and1.csv', sep=",") 11 csv_input['Яп'] = '' 12 13 for index, row in csv_input.iterrows(): 14 ru = csv_input.iloc[index, 0] 15 translator = Translator() 16 ru_ja = translator.translate(ru, 'ja') 17 ja = ru_ja.text 18 csv_input['Яп'][index] = ja 19 time.sleep(5) 20 21 csv_input.to_csv('26and1.csv', index=False) 22

とりあえず手作業も挟んで解決xD

tiitoiさんの推測どおり、googletransを使っています。最初は300語だったので、それが一日に積み重なって1万5,000語超える。。。確かに50回のトライはしたかもorz でも「ひとつのテキストで15000」という部分が納得できない(・_・) そこは信頼すべきでないか。。。

The maximum character limit on a single text is 15k

とりあえず現行のpythonの翻訳ライブラリ系はほぼgoogleを使っている、またロシアで主流のЯндексも課金制のようなので、以下のやり方に切り替えました。

  1. 26and1.pyでロシア語の文章でよく使われる単語を頻出順に登場回数も含めてCSVに出力
  2. 手動で出力したCSVをlibreofficeで開く (OSがLinux Mintのため)
  3. 手動でロシア語の部分をコピー
  4. 手動でЯндекс.Переводчикにペーストし、翻訳。
  5. 翻訳結果をコピーしてテキストファイルに保存。
  6. テキストファイルの中身を26and1.csvに追記

python

1# 26and1.py 2# -*- coding: utf-8 -*- 3from nltk import FreqDist 4import pymorphy2 5import csv 6import re 7 8import del_words 9 10downloadtxt = open('26and1.txt', 'r') 11texts = downloadtxt.read() 12texts = re.sub('[.,?!()\'—]', ' ', texts) 13texts = texts.split() 14 15analyzer = pymorphy2.MorphAnalyzer() 16 17lemma_list = [] 18for text in texts: 19 lemma = analyzer.parse(text)[0].normal_form 20 lemma_list.append(lemma) 21 22lemma_list = list(filter(lambda d: d not in (str(del_words.del_w)), lemma_list)) 23freqdist = FreqDist(lemma_list) 24freqdist_list = freqdist.most_common(600) 25 26with open('26and1.csv', 'w') as file: 27 writer = csv.writer(file, lineterminator = '\n') 28 writer.writerow(['Ру','Ном']) 29 for n in range(0, len(freqdist_list)): 30 writer.writerows([freqdist_list[n]]) 31pass

26and1.py出力結果
before

Яндекс.Переводчик出力結果
(26and1_600JP.txt)
middle

python

1# addJP.py 2import pandas as pd 3import warnings 4warnings.filterwarnings('ignore') 5 6jp = open('26and1_600JP.txt', 'r') 7jp_w = jp.read() 8jp_w = jp_w.split() 9 10csv_input = pd.read_csv('26and1.csv', sep=",") 11csv_input['Яп'] = '' 12 13for index, row in csv_input.iterrows(): 14 csv_input['Яп'][index] = jp_w[index] 15 16csv_input.to_csv('26and1.csv', index=False)

addJP.py出力結果
yay
しかしмочьは英語のcan相当だから「缶」ではなく「できる」なんだよな。。。そこはご愛嬌か^^; неяも多分訳が違って「彼女」みたいな感じだったと思う。。。そこは人力で修正^^ または最初からGoogle翻訳を使うか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tiitoi

2018/10/05 06:40 編集

使ってるのは https://py-googletrans.readthedocs.io/en/latest/ ですよね。Google 非公式のものだと思うので、使いすぎてブロックされたのではないでしょうか?安定して使いたいならお金を払って公式が提供しているAPIを使うしかないかと思います。
Yukiya025

2018/10/06 05:24

tiitoi様、ありがとうございます<3 そうです^^; とりあえず手動タスクも間に挟んで安定して動く方法思いついたのでそれでプログラムを書き直しました(≧∇≦)b 本文の最後に解決策を追記したのでご覧くださいm(_)m
guest

回答1

0

ベストアンサー

py-googletransのGitHubのissuesを見ると、Googleがブロックを始めたと思われます。コードの問題ではなく、大量に処理をするのが難しくなっているためではないでしょうか。

https://github.com/ssut/py-googletrans/issues/85
https://github.com/ssut/py-googletrans/issues/83
https://github.com/ssut/py-googletrans/issues/77

投稿2018/10/05 07:26

編集2018/10/05 07:28
YasuhiroNiji

総合スコア584

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Yukiya025

2018/10/06 05:20

YasuhiroNijiさま、ありがとうございます(≧∇≦) ブロックされたんですね^^; それでも翻訳ライブラリはGoogle系しか見当たらないので、制限なくロシア語-日本語の単語ペアを作れるよう、手動も挟んで望む結果を出すように方向性を変えました! 長くなるので、本文の最後に解決策を追記したのでご覧ください^^/
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問