前提・実現したいこと
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

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/10 13:50