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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

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

Python

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

自然言語処理

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

Q&A

解決済

2回答

1319閲覧

Pythonにおける辞書の要素取得に関するエラー

退会済みユーザー

退会済みユーザー

総合スコア0

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

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

Python

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

自然言語処理

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

0グッド

0クリップ

投稿2018/07/09 11:22

編集2018/07/09 11:22

前提・実現したいこと

形態素解析を行った後、名詞・形容詞・動詞の時のみ単語を取り出して、
リストに加えようとしています。

発生している問題・エラーメッセージ

①と②についてアドバイスをいただきたいです。

①以下のエラーを修正する方法


名詞:'NN' 'NNP' 'NNPS' 'NNS'
形容詞:'JJ' 'JJR' 'JJS'
動詞:'VB' 'VBD' 'VBG' 'VBN' 'VBZ'
要素の単語をリストに入れて持ちたいです。
その場合はどのように条件分岐を書けばいいでしょうか。

現在のコードを実行した後、
試しに名詞(NNS)を出力しようとしたところ、
以下のエラーが出てしまいました。

pickup = str(dict["NNS"])

エラー文

--------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-58-5291868e6248> in <module>() ----> 1 pickup = str(dict["NNS"]) TypeError: 'type' object is not subscriptable

該当のソースコード

python

1import nltk 2string = "The beauties of nature" 3words = nltk.word_tokenize(string) 4nltk.pos_tag(words) 5words_dict = dict(nltk.pos_tag(words)) 6words_dict 7words_dict = dict(nltk.pos_tag(words)) 8print(words_dict ) 9words_dict2 = {v:k for k, v in words_dict.items()} 10print(words_dict2) 11#形態素解析結果の意味に関する説明を確認するコマンド 12nltk.help.upenn_tagset()

出力

{'The': 'DT', 'beauties': 'NNS', 'of': 'IN', 'nature': 'NN'} {'DT': 'The', 'NNS': 'beauties', 'IN': 'of', 'NN': 'nature'}

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

Jupyter notebook 5.0.0

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

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

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

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

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

guest

回答2

0

ベストアンサー

解析結果を直接辞書に入れてしまうと、情報が消えるのでやめたほうがいいですです。実例を見せると、

python

1>>> result = nltk.pos_tag(nltk.word_tokenize("I like dogs. You are working like a dog.")) 2>>> result 3[('I', 'PRP'), ('like', 'VBP'), ('dogs', 'NNS'), ('.', '.'), ('You', 'PRP'), ('are', 'VBP'), ('working', 'VBG'), ('like', 'IN'), ('a', 'DT'), ('dog', 'NN'), ('.', '.')] 4>>> dict(result) 5{'working': 'VBG', 'dog': 'NN', 'dogs': 'NNS', '.': '.', 'You': 'PRP', 'I': 'PRP', 'are': 'VBP', 'a': 'DT', 'like': 'IN'}

likeに注目。

あと、当然語順はわからなくなるし、回数のカウントとかもできなくなる。あえて辞書にする理由はないと思いますが・・・


普通に、こんな感じでいいのでは。

python

1>>> s = {'NN', 'NNP', 'NNPS', 'NNS', 'JJ', 'JJR', 'JJS', 'VB', 'VBD', 'VBG', 'VBN', 'VBZ'} 2>>> [(word, tag) for word, tag in result if tag in s] 3[('dogs', 'NNS'), ('working', 'VBG'), ('dog', 'NN')]

投稿2018/07/09 12:17

編集2018/07/09 12:19
hayataka2049

総合スコア30933

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

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

退会済みユーザー

退会済みユーザー

2018/07/09 13:43

ご回答いただきましてありがとうございます。 'dogs'や'working'を別の処理で使いたいと考えているのですが、 [('dogs', 'NNS'), ('working', 'VBG'), ('dog', 'NN')] この形の出力の場合、単語のみ別のリストに移動することは可能でしょうか。
hayataka2049

2018/07/09 13:48

最初から単語だけで良いなら [word for word, tag in result if tag in s] 一回タグとセットで抽出してから単語だけにするなら a = [(word, tag) for word, tag in result if tag in s] # 変数名思いつかなかったので適当 b = [word for word, tag in a]
guest

0

python

1pickup = str(dict["NNS"])

dict は連想配列の予約語なので、型に対して "NNS" を参照しようとしておかしなことになりますよね。
正しくは words_dict2 なのかな?

投稿2018/07/09 11:34

mather

総合スコア6753

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問