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

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

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

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

自然言語処理

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

Q&A

解決済

1回答

4605閲覧

janomeのTokenizerでエラー

asibarai

総合スコア6

Python

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

自然言語処理

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

0グッド

0クリップ

投稿2020/09/25 08:52

前提・実現したいこと

pythonで自動要約プログラムを作ろうと思っています。
https://software-data-mining.com/python%E3%81%AB%E3%82%88%E3%82%8B%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E5%87%A6%E7%90%86%E6%8A%80%E6%B3%95%E3%82%92%E3%81%B5%E3%82%93%E3%81%A0%E3%82%93%E3%81%AB%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%9F/
こちらのサイトのプログラムを参考に要約プログラムの方を書きましたが、"Tokenize"の部分でエラーが吐かれます。
どうすれば改善されるでしょうか。
お力添えいただきたいです。

該当のコード

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.tokenizer import Tokenizer 6from janome.analyzer import Analyzer 7from janome.charfilter import * 8from janome.tokenfilter import * 9import re 10from sumy.parsers.plaintext import PlaintextParser 11from sumy.nlp.tokenizers import Tokenizer 12from sumy.summarizers.lex_rank import LexRankSummarizer 13 14def fn_start_document_summarize(): 15 file=(r"C:\Users\名前\PycharmProjects\aiueo\ extract-sample.txt") 16 with open(file,encoding='utf-8') as f: 17 contents = f.readlines() 18 19 contents = ''.join(contents) 20 21 text = re.findall("[^。]+。?", contents.replace('\n', '')) 22 23 print(text) 24 tokenizer = Tokenizer('japanese') 25 char_filters=[UnicodeNormalizeCharFilter(), RegexReplaceCharFilter(r'[()「」、。]', ' ')] 26 token_filters=[POSKeepFilter(['名詞', '形容詞', '副詞', '動詞']), ExtractAttributeFilter('base_form')] 27 # 形態素解析(単語単位に分割する) 28 analyzer = Analyzer( 29 char_filters=char_filters, 30 tokenizer=tokenizer, 31 token_filters=token_filters 32 ) 33 34 corpus = [' '.join(analyzer.analyze(sentence)) + u'。' for sentence in text] 35 print(corpus) 36 print(len(corpus)) 37 38 # 文書要約処理実行 39 # from sumy.parsers.plaintext import PlaintextParser 40 # from sumy.nlp.tokenizers import Tokenizer 41 # from sumy.summarizers.lex_rank import LexRankSummarizer 42 43 parser = PlaintextParser.from_string(''.join(corpus), Tokenizer('japanese')) 44 45 # LexRankで要約を原文書の3割程度抽出 46 summarizer = LexRankSummarizer() 47 summarizer.stop_words = [' '] 48 49 # 文書の重要なポイントは2割から3割といわれている?ので、それを参考にsentences_countを設定する。 50 summary = summarizer(document=parser.document, sentences_count=int(len(corpus) / 10 * 3)) 51 52 print(u'文書要約結果') 53 for sentence in summary: 54 print(text[corpus.index(sentence.__str__())]) 55 56 57if __name__ == '__main__': 58 fn_start_document_summarize()

エラー

Traceback (most recent call last): File "C:/Users/名前/PycharmProjects/youyaku/bunshoyouyaku.py", line 58, in <module> fn_start_document_summarize() File "C:/Users/名前/PycharmProjects/youyaku/bunshoyouyaku.py", line 28, in fn_start_document_summarize analyzer = Analyzer( File "C:\Users\名前\AppData\Local\Programs\Python\Python38\lib\site-packages\janome\analyzer.py", line 91, in __init__ elif tokenizer.wakati: AttributeError: 'Tokenizer' object has no attribute 'wakati'

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

pycharmを利用しています。
Python 3.8.5
OS:windows10

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

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

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

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

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

guest

回答1

0

ベストアンサー

ソースの動作確認はしてないのですが、気になったのが2点あります。

インポート問題

※インポート領域から抜粋

python

1from janome.tokenizer import Tokenizer as JanomeTokenizer # sumyのTokenizerと名前が被るため 2from janome.tokenizer import Tokenizer 3from sumy.nlp.tokenizers import Tokenizer

最初のjanome.tokenizer.Tokenizerを別名インポートをしているのは良いのですが、
もう一度from janome.tokenizer import Tokenizerを別名付けずにインポートしています。
(とはいえ、sumyのインポートで上書きされるので、ややこしくなるだけではあると思いますが)

どっちのTokenizer問題

Analyzerに渡すタイミングと、PlaintextParserに渡すタイミングで、
それぞれTokenizerオブジェクトを渡しています。

これがそれぞれ「どっちのパッケージのTokenizerを使う予定だったか」を一度確認したほうが良いと思います。

※エラー内容からすると、今回のソースでAnalyzerに渡すべきものはJanomeTokenizerと別名定義したほうなのに、コードを書く過程で正しく区別できてない気がします

diff

1 print(text) 2- tokenizer = Tokenizer('japanese') 3+ tokenizer = JanomeTokenizer('japanese') 4 char_filters=[UnicodeNormalizeCharFilter(), RegexReplaceCharFilter(r'[()「」、。]', ' ')] 5 token_filters=[POSKeepFilter(['名詞', '形容詞', '副詞', '動詞']), ExtractAttributeFilter('base_form')] 6 # 形態素解析(単語単位に分割する) 7 analyzer = Analyzer( 8 char_filters=char_filters, 9 tokenizer=tokenizer, 10 token_filters=token_filters 11 )

投稿2020/09/25 09:36

attakei

総合スコア2738

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

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

asibarai

2020/09/25 10:48

エラーを吐く理由に納得すると共にプログラム側の解決もできました。”Tokenizer”モジュールを別名で定義したにも関わらず、元の名前で呼び出そうとしても呼べるわけないですね。 改善策だけでなく、そのほかの部分も教えていただけたのですっきりしました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問