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

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

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

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

自然言語処理

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

Q&A

解決済

2回答

1173閲覧

テキストデータを用いてトピック分析がしたい

farinelli

総合スコア61

Python

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

自然言語処理

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

0グッド

1クリップ

投稿2019/08/19 10:10

リアルタイムのツイート群から抽出した名詞を使って、gensim経由でトピック分析をしたいと考えています。
初歩的な質問で恐縮ですが、エラーの解決方法を教えていただけますと幸いです。
宜しくお願いします。

エラー

Traceback (most recent call last): File "topic.py", line 21, in <module> text = corpus.text AttributeError: 'list' object has no attribute 'text'

該当のソースコード

topic.py

1import os 2import math 3from collections import Counter 4from collections import defaultdict 5import re 6from natto import MeCab 7import codecs 8import sys 9import glob 10import pandas 11import urllib.request 12from gensim import corpora, models, similarities 13from itertools import chain 14 15with codecs.open("test40.txt", "r", "utf-8") as f: 16 corpus = f.read().split("\n") 17 18text = corpus.text 19text = re.sub(r"http\S+", "", text) 20text = re.sub(r"@(\w+) ", "", text) 21#text = re.sub(r"#(\w+)", "", text) 22text = re.sub(r"(^RT.*)", "", text, flags=re.MULTILINE | re.DOTALL) 23#絵文字も消したい 24emoji_pattern = re.compile("[" 25u"\U0001F600-\U0001F64F" 26u"\U0001F300-\U0001F5FF" 27u"\U0001F680-\U0001F6FF" 28u"\U0001F1E0-\U0001F1FF" 29"]+", flags=re.UNICODE) 30text = emoji_pattern.sub("", text) 31 32mecab = MeCab('-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd') 33 34#if tagger.lang == 'ja': 35#名詞の抽出と整形 36rm_list = ["RT","https","co","さん","フォロー","本日","応募","今日","プレゼント","お金","FGO","無料","本人","投稿","動画","ツイート","リツイート","Twitter","ローソン","Peing","http","Amazonギフト券","bot","発売中","Youtube","www","WWW","質問箱","コラボ","フォロワー","DM","いいね","RT","lawson","://","!","peing","youtube","抽選","jp","リプ","キャンペーン","チケット","期間限定","DHC","日本","amp","人間","チャンネル","配信中","YouTube","WEB","楽しみ","イラスト","くじ","@","__"] 37 38stop_words = [] 39path = 'stop_words.txt' 40with open(path) as g: 41 stop_words = g.readlines() 42 43docs = [] 44for txt in corpus: 45 words = mecab.parse(txt, as_nodes=True) 46 doc = [] 47 48 for w in words: 49 if w.feature.split(",")[0] == "名詞": 50 if len(w.surface) >= 3: 51 if w.surface not in rm_list: 52 doc.append(w.surface) 53 54 docs.append(doc) 55corpus = docs 56 57#辞書の作成 58dictionary = corpora.Dictionary(corpus) 59dictionary.filter_extremes(no_below=2, no_above=0.01) 60 61# コーパスを作成 62corpus_c = [dictionary.doc2bow(corpus) for text in corpus] 63 64#トピックモデルを生成 65lda = gensim.models.ldamodel.LdaModel(corpus=corpus_c, num_topics=100) 66 67# 各トピックの出現頻度上位を取得 68topic_top = [] 69for topic in lda.show_topics(-1, formatted=False): 70 topic_top.append([dictionary[int(tag[0])] for tag in topic[1]]) 71 72# 各トピックの出現頻度上位10位をcsv形式で保存 73topic_data = pandas.DataFrame(topic_top) 74topic_data.to_csv("topic_words1.csv", encoding="utf-8")

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

iOS 10.12.6, Python 3.7.3, Atom

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

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

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

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

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

hayataka2049

2019/08/19 10:24 編集

エラーが出た行をそう書いた意図を質問に追記してください。 また、どんな結果を期待していたのかも併せて書いてください。 コーディングの意図と期待する結果がわからないと「解決方法」は提示できません(「エラーの原因」はメッセージの通りですが)。
meg_

2019/08/19 10:31

「corpus」変数をデバッグすればエラーが起きた原因が分かるはずです。またエラーメッセージを注意深く見てください。
guest

回答2

0

ベストアンサー

with codecs.open("test40.txt", "r", "utf-8") as f: corpus = f.read().split("\n")

これによってcorpusはlistタイプの変数になっています。listにはtextという属性・メソッドはないのでエラーになっています。後続のコードからするとおそらく以下のようにしたいのかなと思います。

text=[] for i in corpus : text.append(re.sub(r"http\S+", "", i)) text.append(re.sub(r"@(\w+) ", "", i)) 以下、略

上記は、リストから要素をひとつずつ取り出して必要なデータ加工処理を行い、結果をtextというリストに格納しています。

なお、後続処理が正しく機能することは保証しません。あくまでも今回のエラーメッセージ対策だということをご理解ください。

投稿2019/08/19 16:51

R.Shigemori

総合スコア3376

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

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

farinelli

2019/08/20 04:56

有難うございます。参考になります。 素人質問で恐縮ですが、この状態のcorpusはどうしてlistタイプの変数になるのか教えていただけませんでしょうか? .read()を.readlines()にしたらlistタイプになるのでは?と思っています。
R.Shigemori

2019/08/20 10:38

corpusがlistタイプになるのは.split('\n')が付加されているためです。read()によって全体を丸ごと読み込んだあと、\nで分割していることになります。
farinelli

2019/08/27 06:53

お返事が遅くなり失礼しました。有難うございます。
guest

0

仮にファイルの中身が
あいうえお¥nかきくけこ¥nさしすせそ
だとしたら、

python

1corpus = f.read().split("\n")

このコマンドによって変数corpusはリストになるはずです

python

1print(corpus) # あいうえお かきくけこ さしすせそ 2print(corpus[0]) # あいうえお 3print(corpus[1]) # かきくけこ 4print(corpus[2]) # さしすえそ

splitは与えられた1つの文字列を引数の文字ごとに分割し、リストとして返します。

投稿2019/08/19 10:54

shirai

総合スコア1290

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

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

farinelli

2019/08/27 06:53

お返事が遅くなり失礼しました。有難うございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問