Q&A
表題の件で質問させてください。
現在、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
回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2018/07/04 04:01
2018/07/04 05:49
2018/07/04 06:12
2018/07/11 03:52