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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

5回答

326閲覧

【Python】パイソンで要約と翻訳を実行したいです。

hanchou77

総合スコア12

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

2クリップ

投稿2019/01/10 05:09

前提・実現したいこと

パイソンで、要約と翻訳のプログラムを作っています。
1か月くらいの期間、時間を作っていろいろと試行錯誤していますが、
ほかの方法で翻訳を試したり、Pythonの書籍を3冊ほど買ったり、
いろいろやってみても、なかなか解決していません。

そもそも基本的なことがわかっていないのでしょうが、
なんとか、翻訳だけでも成功したいのですが、うまくいかない状況です。
大変申し訳ありませんが、ご教授いただけますでしょうか。

参考サイト
LexRank
https://qiita.com/riverwell/items/310e0a31f2e5097df7ff

発生している問題・エラーメッセージ

現状、エラーメッセージも出ませんし、まったく動いてくれません。

該当のソースコード

import math import numpy def lex_rank(sentences, n, t): """ LexRankで文章を要約する. @param sentences: list 文章([[w1,w2,w3],[w1,w3,w4,w5],..]のような文リスト) @param n: int 文章に含まれる文の数 @param t: float コサイン類似度の閾値(default 0.1) @return : list LexRank """ cosine_matrix = numpy.zeros((n, n)) degrees = numpy.zeros((n,)) l = [] # 1. 隣接行列の作成 for i in range(n): for j in range(n): cosine_matrix[i][j] = idf_modified_cosine(sentences, sentences[i], sentences[j]) if cosine_matrix[i][j] > t: cosine_matrix[i][j] = 1 degrees[i] += 1 else: cosine_matrix[i][j] = 0 # 2.LexRank計算 for i in range(n): for j in range(n): cosine_matrix[i][j] = cosine_matrix[i][j] / degrees[i] ratings = power_method(cosine_matrix, n) return zip(sentences, ratings) def idf_modified_cosine(sentences, sentence1, sentence2): """ 2文間のコサイン類似度を計算 @param sentence1: list 文1([w1,w2,w3]のような単語リスト) @param sentence2: list 文2([w1,w2,w3]のような単語リスト) @param sentences: list 文章([[w1,w2,w3],[w1,w3,w4,w5],..]のような単語リスト) @return : float コサイン類似度 """ tf1 = compute_tf(sentence1) tf2 = compute_tf(sentence2) idf_metrics = compute_idf(sentences) return cosine_similarity(sentence1, sentence2, tf1, tf2, idf_metrics) from collection import Counter def compute_tf(sentence): """ TFを計算 @param sentence: list 文([w1,w2,w3]のような単語リスト) @return : list TFリスト """ tf_values = Counter(sentence) tf_metrics = {} max_tf = find_tf_max(tf_values) for term, tf in tf_values.items(): tf_metrics[term] = tf / max_tf return tf_metrics def find_tf_max(terms): """ 単語の最大出現頻度を探索 @param terms: list 単語の出現頻度 @return : int 単語の最大出現頻度 """ return max(terms.values()) if terms else 1 def compute_idf(sentences): """ 文章中の単語のIDF値を計算 @param sentences: list 文章([[w1,w2,w3],[w1,w3,w4,w5],..]のような単語リスト) @return: list IDFリスト """ idf_metrics = {} sentences_count = len(sentences) for sentence in sentences: for term in sentence: if term not in idf_metrics: n_j = sum(1 for s in sentences if term in s) idf_metrics[term] = math.log(sentences_count / (1 + n_j)) return idf_metrics def cosine_similarity(sentence1, sentence2, tf1, tf2, idf_metrics): """ コサイン類似度を計算 @param sentence1: list 文1([w1,w2,w3]のような単語リスト) @param sentence2: list 文2([w1,w2,w3]のような単語リスト) @param tf1: list 文1のTFリスト @param tf2: list 文2のTFリスト @param idf_metrics: list 文章のIDFリスト @return : float コサイン類似度 """ unique_words1 = set(sentence1) unique_words2 = set(sentence2) common_words = unique_words1 & unique_words2 numerator = sum((tf1[t] * tf2[t] * idf_metrics[t] ** 2) for t in common_words) denominator1 = sum((tf1[t] * idf_metrics[t]) ** 2 for t in unique_words1) denominator2 = sum((tf2[t] * idf_metrics[t]) ** 2 for t in unique_words2) if denominator1 > 0 and denominator2 > 0: return numerator / (math.sqrt(denominator1) * math.sqrt(denominator2)) else: return 0.0 def power_method(cosine_matrix, n, e): """ べき乗法を行なう @param scosine_matrix: list 確率行列 @param n: int 文章中の文の数 @param e: float 許容誤差ε @return: list LexRank """ transposed_matrix = cosine_matrix.T sentences_count = n p_vector = numpy.array([1.0 / sentences_count] * sentences_count) lambda_val = 1.0 while lambda_val > e: next_p = numpy.dot(transposed_matrix, p_vector) lambda_val = numpy.linalg.norm(numpy.subtract(next_p, p_vector)) p_vector = next_p return p_vector

試したこと

「LexRank」⇒現状、エラーメッセージも出ませんし、まったく動いてくれません。
「translate パッケージ」⇒現状、エラーメッセージも出ませんし、まったく動いてくれません。
「py-googletrans」⇒現状、エラーメッセージも出ませんし、まったく動いてくれません。
「BeautifulSoup」⇒現状、エラーメッセージも出ませんし、まったく動いてくれません。

補足情報(FW/ツールのバージョンなど)

Windows10
Python 3.7.0
Anaconda

参考サイト
translate パッケージ
https://arthur-ai.hatenadiary.jp/entry/2018/11/10/000807

py-googletrans
https://github.com/BoseCorp/py-googletrans/blob/master/googletrans/gtoken.py

BeautifulSoup
https://imaharu.sakura.ne.jp/blog/2018/06/10/137/

shou_hitotose👍を押しています

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

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

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

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

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

guest

回答5

0

そもそも基本的なことがわかっていない

のであればまずは基本からやるべきです。
参考記事はコピペでできることを保証していません。
(個人記事なので保証する謂れもないですが。)

それぞれの関数で処理を行っていますが、関数が何かわかっていますか?
どうすれば関数が実行されるかわかりますか?
わからないのであれば基本から学ぶか、初心者からできる系の記事を探しましょう。


プログラミングの世界は意味があって成り立っているものばかりなので、
ひらすらにコピペしたり調べたりするだけで理解する気がないと成長はできないと思っています。

「理解する」とは、これで動いたから私は理解できたということではなく、、
こうなっているからこう動くのかという動作に対しての原因を把握することです。

前者は「ここを触ったら暖房がついたから、寒かったらここを押そう」レベルの猫です。
後者は「ここが電源ボタンだからここを押したら動作する」とわかっている人間です。
つまり猫は暖房器具が変わると対処できませんが、人間は暖房器具が変わっても電源ボタンがわかれば対処できます。

プログラムを書けるようになりたいのであれば基礎を理解してください。

このご時世、コピペで動くものが多くなりましたが、多くの記事が個人の方が書いた記事です。
ケアレスミスもあれば情報が古いこともあります。(根っから間違っていることもあります。)

そこら辺を判断できるようになるためにも基礎を学びましょう。
そこを判断できなければあなたは毎回記事を見るたびに質問しなければならないという
とても非効率なプログラマーのままになってしまいます。

投稿2019/01/10 06:56

dice142

総合スコア5158

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

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

hanchou77

2019/01/10 13:03

抽象的な回答はご遠慮ください。 具体的な助言をお願いします。
hanchou77

2019/01/10 13:03

翻訳を実現するための方法が知りたいです。
dice142

2019/01/10 15:58

私は調べれば分かることに関しては直接的な回答はしないようにしてるので他の方の回答をお待ちください。 調べるキーワードは回答中に載せてはいますが。
dice142

2019/01/10 15:59

ちなみにあなたが詰まっているのは翻訳を行う処理ではなく、本当に基礎的なところだと思います。 コピペで関数を用意したなら翻訳の処理自体は実装できているでしょう。
hanchou77

2019/01/11 14:33

抽象的回答は不要です。
guest

0

掲載しているコードは単なるユーザー定義の関数です。関数はその関数を実行するコードを記述することで機能させることができます。参照されている記事に関数を実行するコードがあるはずなので、確認の上、真似てください。

ちなみに、記事を書いた方に直接質問されたのでしょうか?このコードは専門性が高いので、ここで質問して回答を得るにはかなり絞り込んだ内容にしないとムリと思います。少なくとも、今のような「うまくいかないのでご教授ください」では、回答しやすいような工夫を求められても仕方ない気がします

投稿2019/01/11 14:41

R.Shigemori

総合スコア3376

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

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

0

パッと見て、関数を定義しているだけでなにも実行していません。

https://qiita.com/riverwell/items/310e0a31f2e5097df7ff#%E8%A6%81%E7%B4%84%E7%B5%90%E6%9E%9C
このアンカーのコード部分、

# lex_rank(document)

と書いてありますけど、これが関数呼び出しだとして、lex_rank関数と引数があってませんね。
lex_rank関数のコメントにある通り、テキストを読み込んでリストのリストにしたものがdocument変数に格納して、

for s, r in lex_rank(document, len(document), 0.1): print(s, r)

とかすれば動くんじゃないでしょうか。

投稿2019/01/11 13:15

quickquip

総合スコア11029

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

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

0

そりゃ、何冊書籍を購入しても、読んで理解しなけりゃ意味がないです。
正直に他人のコードをコピペしたけど動きません、くらい書けば、ド親切な方がなにかコメントくれるかもしれませんが、あなたがコピペして作ったソースコードはそもそもPythonの形として問題があるレベルです。

投稿2019/01/10 05:47

kunai

総合スコア5405

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

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

hanchou77

2019/01/10 06:06

コピペしたり、ほかの方法も、いろいろやってみたんですけどね。。ダメですかぁ。
kunai

2019/01/10 06:14

コピペしただけで、pythonのコードを自分で書く事も出来ないレベルですよね。 回答文で提示したコードがコメント含め一致してるんですが。 いろいろやったのなら何をして何がどう期待通りでなかったのか書いて下さい。
hanchou77

2019/01/10 13:02

回答を期待して質問しています。 回答になっていないので、コメントしないでください。
退会済みユーザー

退会済みユーザー

2019/01/10 14:37

質問になっていないので、質問しないでください。
hanchou77

2019/01/11 14:34

退会済みユーザー、ってなんだ? 回答するなよ。
guest

0

「translate パッケージ」⇒現状、エラーメッセージも出ませんし、まったく動いてくれません。

translateパッケージは全くの初見でしたが以下の通りに問題なく動きましたよ。

  1. pipでtranslateパッケージをインストール
  2. 参考サイトの通りにコードを実行してみる。
C:\Users\sakurai>pip install --user translate Collecting translate (省略) C:\Users\sakurai>ipython Python 3.7.0 (v3.7.0:1bf9cc5093, Jun 27 2018, 04:59:51) [MSC v.1914 64 bit (AMD64)] Type 'copyright', 'credits' or 'license' for more information IPython 6.4.0 -- An enhanced Interactive Python. Type '?' for help. In [1]: from translate import Translator In [2]: t = Translator(from_lang="ja", to_lang="en") In [3]: t.translate("これはペンです。") Out[3]: 'This is a pen.'

補足

問題解決のコツは大きな問題を小さく細切れにすることです。大きなままの問題は解くことも聞くことも叶いません。小さく砕いてから試行錯誤するなり聞くなりしないと問題は解決しないと思います。でもお金を積めば細切れにしなくてもみんな進んで問題を解決してくれるので、そちらの手法を採用するのもアリです。例えるなら、川に橋をかける時に「民よ、橋をかけよ」と命ずる王になるのか「橋をかけるために必要なことは、、、」と考え始める役人・職人になるのかの違いみたいなものです。

投稿2019/01/12 05:06

編集2019/01/12 05:17
YouheiSakurai

総合スコア6142

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問