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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

自然言語処理

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

Q&A

解決済

1回答

2149閲覧

python リストのcounterについて

---stax---

総合スコア148

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

自然言語処理

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

0グッド

0クリップ

投稿2018/07/04 03:06

表題の件で質問させてください。
現在、DBからText型のデータを読み込み、その内容を形態素解析し、単語の出現回数を調べて、その結果をDBに格納という内容を行っています

以下例です

シリンダが動かない ↓ シリンダ/が/動かない ↓ 単語  :回数 シリンダ:10 が   :20 動かない:5 上記結果をword,count列を持つDBのテーブルに格納

今回はこの単語と回数という情報に加えて単語の品詞状態を付け加えたいと考えています

単語  :品詞 :回数 シリンダ:名詞 :10 ['シリンダ','名詞'] ←要素ごとの出現回数を調べたい ['が', '助詞'] ['動かない','動詞'] ['シリンダ','名詞']

そこで以下のコードを作成しました

python

1from pandas import Series, DataFrame 2import pandas as pd 3from sqlalchemy.ext.declarative import declarative_base 4from sqlalchemy import create_engine, Column, Integer, Text, Date, Time, DateTime 5from sqlalchemy.orm import sessionmaker 6from functional import seq 7import os 8from janome.tokenizer import Tokenizer 9from janome.analyzer import Analyzer 10from janome.tokenfilter import POSStopFilter 11from operator import add 12from collections import Counter 13 14Base = declarative_base() 15engine = create_engine('postgres://postgres:postgres@test/testdb') 16Session = sessionmaker(bind=engine) 17session = Session() 18 19class Trblisttable(Base): 20 __tablename__ = 'trb_list' 21 __table_args__ = {'schema' : 'test'} 22 ex_num = Column(Integer, primary_key=True) 23 source = Column(Text) 24 mc_name = Column(Text) 25 line_name = Column(Text) 26 st_name = Column(Text) 27 trb_name = Column(Text) 28 phenom = Column(Text) 29 cause = Column(Text) 30 measures = Column(Text) 31 date = Column(DateTime) 32 33class Insertdata(Base): 34 __tablename__ = 'word_count_data' 35 __table_args__ = {'schema' : 'test'} 36 word = Column(Text, primary_key=True) 37 count = Column(Integer) 38 39 40pages = session.query(Trblisttable.phenom, Trblisttable.cause, Trblisttable.measures).all() 41 42phenom_data = seq(pages).map(lambda x: x.phenom).to_list() 43cause_data = seq(pages).map(lambda x: x.cause).to_list() 44measures_data = seq(pages).map(lambda x: x.measures).to_list() 45 46phenom_data = [a for a in phenom_data if not a in 'None'] 47cause_data = [b for b in cause_data if not b in 'None'] 48measures_data = [c for c in measures_data if not c in 'None'] 49 50t = Tokenizer() 51phenom_words = [] 52cause_words = [] 53measures_words = [] 54 55phenom_words = [] 56tokens = t.tokenize(str(phenom_data)) 57for token in tokens: 58 test = [] 59 if not token.part_of_speech.split(',')[0] in ['記号']: 60 test.append(token.base_form) 61 test.append(token.part_of_speech.split(',')[0]) 62 phenom_words.append(test) 63 64cause_words = [] 65tokens = t.tokenize(str(cause_data)) 66for token in tokens: 67 if not token.part_of_speech.split(',')[0] in ['記号']: 68 test.append(token.base_form) 69 test.append(token.part_of_speech.split(',')[0]) 70 cause_words.append(test) 71 72measures_words = [] 73tokens = t.tokenize(str(measures_words)) 74for token in tokens: 75 test = [] 76 if not token.part_of_speech.split(',')[0] in ['記号']: 77 test.append(token.base_form) 78 test.append(token.part_of_speech.split(',')[0]) 79 measures_words.append(test) 80 81 82countdata1 = phenom_words 83counter1 = Counter(countdata1) 84counter1.most_common() 85 86countdata2 = cause_words 87counter2 = Counter(countdata2) 88counter2.most_common() 89 90countdata3 = measures_words 91counter3 = Counter(countdata3) 92counter3.most_common() 93 94adddata = counter1 + counter2 + counter3 95adddata = Counter(adddata) 96adddata.most_common() 97for key, value in adddata.items(): 98 print('{}:{}'.format(key, value)) 99 100 101#insert_data = seq(adddata.items()).map(lambda x: Insertdata(word=x[0], count=x[1])).to_list() 102#session.add_all(insert_data) 103#session.commit() 104 105print('---END---')

[['シリンダ','名詞'],['が', '助詞'],['動かない','動詞']]
のような形態素解析した単語と品詞の情報を持つリストを作成し、
counterを使って出現回数を数えようとしたのですが以下のエラーが発生します
単語と品詞の組み合わせをディクショナリにしてしまうと重複の回数は調べられられず、
countdata1 = tuple(phenom_words)のようにしても同様のエラーが発生しました
どのようにすれば回数を数えることが出来るでしょうか?
単語と品詞の組み合わせを一つのリストで作る考え方が誤りなのでしょうか?
初歩的な質問で申し訳ありませんがアドバイス宜しくお願い致します

python

1--------------------------------------------------------------------------- 2TypeError Traceback (most recent call last) 3<ipython-input-12-b2ba1d096aea> in <module>() 4 91 print(phenom_words) 5 92 countdata1 = phenom_words 6---> 93 counter1 = Counter(countdata1) 7 94 counter1.most_common() 8 95 9 10~\AppData\Local\Continuum\anaconda3\lib\collections\__init__.py in __init__(*args, **kwds) 11 533 raise TypeError('expected at most 1 arguments, got %d' % len(args)) 12 534 super(Counter, self).__init__() 13--> 535 self.update(*args, **kwds) 14 536 15 537 def __missing__(self, key): 16 17~\AppData\Local\Continuum\anaconda3\lib\collections\__init__.py in update(*args, **kwds) 18 620 super(Counter, self).update(iterable) # fast path when counter is empty 19 621 else: 20--> 622 _count_elements(self, iterable) 21 623 if kwds: 22 624 self.update(kwds) 23 24TypeError: unhashable type: 'list' 25 26

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

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

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

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

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

guest

回答1

0

ベストアンサー

countdata1 = tuple(phenom_words)のようにしても同様のエラーが発生しました

phenom_wordsの各要素をタプルにしないといけないです。

Python

1countdata1 = map(tuple, phenom_words) 2counter1 = Counter(countdata1)

コメントを受けて

('交換', '名詞'):179を単語、品詞、回数のように各要素ごとに取得する方法はありますでしょうか・・・?

こういうことでしょうか。

Python

1for (key1, key2), value in adddata.items(): 2 print(key1, key2, value)

投稿2018/07/04 03:32

編集2018/07/04 04:30
LouiS0616

総合スコア35658

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

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

---stax---

2018/07/04 04:01

回答ありがとうございます 頂いたコードを使ってカウント回数を調べることが出来ました ただ、自分が勘違いと記述漏れしていたのですが、 今回格納したいDBのテーブルは単語、品詞、回数の3列あり Counterを使うと ('交換', '名詞'):179 のように('交換', '名詞')が一つの要素として扱われるので 交換、名詞、179という3つの要素として扱えず、DBの列と合っていないことに気づきました ('交換', '名詞'):179を単語、品詞、回数のように各要素ごとに取得する方法はありますでしょうか・・・?
---stax---

2018/07/04 05:49

ありがとうございます 何度も重ねて質問して申し訳ないのですが for (key1, key2), value in adddata.items(): print(key1, key2, value) 上記のようにすると値を確認できるのですが、 これらを最終的には以下のようなコードを使ってインサートしようと思っています insert_data = seq(adddata.items()).map(lambda x: Insertdata(word=x[0], part=x[1], count=x[2])).to_list() このwordやpart,countに当てはめたいのですが 例えば a = [] b = [] c = [] for (key1, key2), value in adddata.items(): a.append(key1) b.append(key2) c.append(value) このようにするとValueError: too many values to unpack (expected 2)と エラーが出てしまいます リストなどに別途格納するのは不可なのでしょうか?
LouiS0616

2018/07/04 06:12

> リストなどに別途格納するのは不可なのでしょうか? いえ、問題ないはずです。 もう一回プログラムの頭から実行してみるとどうなりますか?
---stax---

2018/07/11 03:52

返答遅くなり申し訳ありません エラーの原因を探っていると格納したいデータ(adddata)の中のデータが一部おかしい箇所があったのでそれらを修正すれば各リストに分割した結果を入れることが出来ました ありがとうございました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問