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

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

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

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

自然言語処理

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

Q&A

解決済

1回答

793閲覧

単語の頻出度が思い通りに表示されない

farinelli

総合スコア61

Python

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

自然言語処理

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

0グッド

0クリップ

投稿2019/08/19 05:09

編集2019/08/19 05:34

1万件のツイートを格納したテキストファイルから抽出した名詞を対象に、いくつか分析を行いたいと考えています。
手始めに単語の頻出度を出そうと思ったら、このような出力結果になってしまい、クオーテーションにより正しい数値が反映されなくなってしまいました。
これに関して、解決策を教えていただけませんでしょうか?
宜しくお願いします。

追記: counter = Counter(str_corpus)の部分ですが、str_corpusを置いた時の出力が下記上部('',: 2693)、docsを置いた時の出力が下記下部(: 2693)となっております。
今回、ツイートを格納したテキストファイルにて「ちゃん」が277個、「みたい」が105個存在することを確認した為、str_corpusを採用することにしました。

'',: 2693 ちゃん: 76 みたい: 50 ???: 41 ちゃん',: 37 こずえ: 33 ところ: 31 みんな: 25 お願い: 25 'ハズレ: 24 '前日比',: 21 しよう: 20 わたし: 20
: 2693 前日比: 21

出力結果

'',: 2693 ちゃん: 76 みたい: 50 ???: 41 ちゃん',: 37 こずえ: 33 ところ: 31 みんな: 25 お願い: 25 'ハズレ: 24 '前日比',: 21 しよう: 20 わたし: 20

該当のソースコード

python

1from natto import MeCab 2import os 3import urllib.request 4import codecs 5from gensim import corpora 6from collections import Counter 7from collections import defaultdict 8frequency = defaultdict(int) 9 10f = open('test40.txt') 11corpus = f.read().split("\n") 12 13mecab = MeCab('-d /usr/local/lib/mecab/dic/mecab-ipadic-neologd') 14 15#if tagger.lang == 'ja': 16 17with codecs.open("test40.txt", "r", "utf-8") as f: 18 corpus = f.read().split("\n") 19 20rm_list = ["RT","https","co","さん","フォロー","本日","応募","今日","プレゼント","お金","FGO","無料","本人","投稿","動画","ツイート","リツイート","Twitter","ローソン","Peing","http","Amazonギフト券","bot","発売中","Youtube","www","WWW","質問箱","コラボ","フォロワー","DM","いいね","RT","lawson","://","!","peing","youtube","抽選","jp","リプ","キャンペーン","チケット","期間限定","DHC","日本","amp","人間","チャンネル","配信中","YouTube","WEB","楽しみ","イラスト","くじ","@","__"] 21 22stop_words = [] 23path = 'stop_words.txt' 24with open(path) as g: 25 stop_words = g.readlines() 26 27docs = [] 28for txt in corpus: 29 words = mecab.parse(txt, as_nodes=True) 30 doc = [] 31 32 for w in words: 33 if w.feature.split(",")[0] == "名詞": 34 if not any(sw in w.surface for sw in stop_words): 35 if not any(rm in w.surface for rm in rm_list): 36 if len(w.surface) >= 3: 37 doc.append(str(w.surface)) 38 39 doc = ' '.join(doc) 40 docs.append(doc) 41corpus = docs 42 43str_corpus = str(corpus).split(' ') 44 45counter = Counter(str_corpus) 46for word, count in counter.most_common(): 47 if count > 19: 48 print(f"{word}: {count}")

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

iOS 10.12.6, Python 3.7.3, Atom

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

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

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

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

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

quickquip

2019/08/19 05:14

counter = Counter(docs) としなかった理由はありますか?
guest

回答1

0

ベストアンサー

ざっと見た感じ、corpusは空白区切りの単語列の文字列を要素に持つリストになっています。なので、こうなることでしょう。

python

1>>> lst = ["ほげ ふが ぴよ", "hoge fuga piyo"] 2>>> str(lst).split(" ") 3["['ほげ", 'ふが', "ぴよ',", "'hoge", 'fuga', "piyo']"]

str(corpus)という処理と、わざわざ空白区切りでデータを持っていることが間違いです。こうすればよいでしょう。

python

1docs = [] 2for txt in corpus: 3 words = mecab.parse(txt, as_nodes=True) 4 doc = [] 5 6 for w in words: 7 if w.feature.split(",")[0] == "名詞": 8 if not any(sw in w.surface for sw in stop_words): 9 if not any(rm in w.surface for rm in rm_list): 10 if len(w.surface) >= 3: 11 doc.append(str(w.surface)) 12 13 # doc = ' '.join(doc) # ここ消す 14 docs.append(doc) 15corpus = docs 16 17from itertools import chain 18counter = Counter(chain.from_iterable(corpus)) 19# ほげほげ

投稿2019/08/19 05:25

hayataka2049

総合スコア30933

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

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

farinelli

2019/08/19 05:38

参考になります。 有難うございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問