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

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

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

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

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

Q&A

解決済

1回答

3570閲覧

sumyで最大文字数を指定して要約

asibarai

総合スコア6

Python

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

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

0グッド

0クリップ

投稿2020/11/08 16:08

前提・実現したいこと

pythonで自動要約ライブラリのsumyを用いてプログラムの作成しようと思っています。
最大文字数を指定して、その文字数以下の要約文になるようにしたいのですが、その方法が分かりません。どうかお力添えいただきたいです。

プログラムはこちらのサイトを参考にしました(というかほぼ一緒です)

該当のソースコード

python

1from janome.analyzer import Analyzer 2from janome.charfilter import UnicodeNormalizeCharFilter, RegexReplaceCharFilter 3from janome.tokenizer import Tokenizer as JanomeTokenizer # sumyのTokenizerと名前が被るため 4from janome.tokenfilter import POSKeepFilter, ExtractAttributeFilter 5from janome.analyzer import Analyzer 6from janome.charfilter import * 7from janome.tokenfilter import * 8import re 9from sumy.parsers.plaintext import PlaintextParser 10from sumy.nlp.tokenizers import Tokenizer 11from sumy.summarizers.lex_rank import LexRankSummarizer 12 13def fn_start_document_summarize(): 14 file=(r"ファイルパス") 15 with open(file,encoding='utf-8') as f: 16 contents = f.readlines() #ファイルのテキスト読み込み 17 18 contents = ''.join(contents) #contents要素を結合 19 20 text = re.findall("[^。]+。?", contents.replace('\n', '')) 21 #contentsをreplace処理後の要素から、"。"以外の文字から"。"までの要素で区切って配列へ格納 22 #re.findall(指定するフィルター,調べる対象) 23 #(text=文章ごとに要素に分ける) 24 25 print(text) 26 tokenizer = JanomeTokenizer('japanese') #単語分割、品詞付与の言語選択 27 char_filters=[UnicodeNormalizeCharFilter(), RegexReplaceCharFilter(r'[()「」、。]', ' ')] 28 token_filters=[POSKeepFilter(['名詞', '形容詞', '副詞', '動詞']), ExtractAttributeFilter('base_form')] 29 #ExtractAttributeFilter=POSKeepFilterの品詞の基本形を抽出 30 # 形態素解析(単語単位に分割する) 31 analyzer = Analyzer( 32 char_filters=char_filters, 33 tokenizer=tokenizer, 34 token_filters=token_filters 35 ) 36 37 corpus = [' '.join(analyzer.analyze(sentence)) + u'。' for sentence in text] 38 #text配列の各要素に右記実行⇒基本形で抽出された単語をスペースで連結 39 print("corpus=",corpus) 40 print("corpus_len=",len(corpus)) 41 42 # 文書要約処理実行 43 # from sumy.parsers.plaintext import PlaintextParser 44 # from sumy.nlp.tokenizers import Tokenizer 45 # from sumy.summarizers.lex_rank import LexRankSummarizer 46 47 parser = PlaintextParser.from_string(''.join(corpus), Tokenizer('japanese')) 48 #PlaintextParser=文字列・ファイルから文書読み込み 49 #基本形で連結した文字列を再び単語に分ける 50 51 # LexRankで要約を原文書の3割程度抽出 52 summarizer = LexRankSummarizer() 53 summarizer.stop_words = [' '] 54 55 # 文書の重要なポイントは2割から3割といわれている?ので、それを参考にsentences_countを設定する。 56 summary = summarizer(document=parser.document, sentences_count=int(int(len(corpus) / 10 * 3))) 57 #sentences_count =30%設定 58 59 print("contents_len=",len(contents)) 60 print(int(len(corpus) / 10 * 3)) 61 print(u'文書要約結果') 62 for sentence in summary: 63 print(text[corpus.index(sentence.__str__())]) 64 #text[corpus配列(指定した文数.文字列にして返す)] 65 66 67if __name__ == '__main__': 68 #def mainとmain()を同時に実行 69 fn_start_document_summarize() 70

##補足(FW/ツールのバージョンなど)
pycharmを利用しています。
Python 3.8.5
OS:windows10

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

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

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

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

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

guest

回答1

0

ベストアンサー

GitHubのリポジトリに載っているsumyのソースを読んでください。

あなたが提示した(他人の作った)コードで利用しているLexRankSummarizerも、それ以外のサマライザーにも、「最大文字数を指定」するような機能は付いていません。sentences_countに要約文の行数(文の個数)を指定するだけです。

投稿2020/11/09 01:46

Daregada

総合スコア11990

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

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

asibarai

2020/11/10 13:50

そうなんですね、わかりました。回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問