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

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

ただいまの
回答率

90.38%

  • Python

    12885questions

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

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

受付中

回答 5

投稿

  • 評価
  • クリップ 2
  • VIEW 772

hanchou77

score 2

前提・実現したいこと

パイソンで、要約と翻訳のプログラムを作っています。
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/

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    2019/01/19 00:29

    複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という意見がありました
    「質問を編集する」ボタンから編集を行い、調査したこと・試したことを記入していただくと、回答が得られやすくなります。

回答 5

+10

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

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

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


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

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

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

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/11 00:58

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

    キャンセル

  • 2019/01/11 00:59

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

    キャンセル

  • 2019/01/11 23:33

    抽象的回答は不要です。

    キャンセル

+4

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/10 22:02

    回答を期待して質問しています。
    回答になっていないので、コメントしないでください。

    キャンセル

  • 2019/01/10 23:37

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

    キャンセル

  • 2019/01/11 23:34

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

    キャンセル

+3

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

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)


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+3

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+2

「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.'

補足

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 90.38%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python

    12885questions

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