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

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

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

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

Python 3.x

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

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

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

自然言語処理

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

Q&A

解決済

1回答

2088閲覧

Pythonで1つのキーに対して複数の要素を持つ辞書型の処理

退会済みユーザー

退会済みユーザー

総合スコア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/06/28 11:50

前提・実現したいこと

配列に格納されている各単語間の類似度を計算して
その数値を表示するプログラムを書いています。
前の質問では実現したいことのために、例外処理を行いました。
前の質問

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

現在は一つの単語(キー)につき、配列に格納されている他の単語との類似度(要素)が全て出力されますが、これを類似度の高い上位2つの要素だけを出力するにはコードをどのように書き換えるべきでしょうか。

例えば、単語'cats'なら、'pigs'と'clocks'だけを出力するということです。

{'cats': {'pigs': 0.125, 'clocks': 0.06666666666666667}, 'pigs': {'cats': 0.125, 'clocks': 0.0625},

該当のソースコード

python

1from nltk.corpus import wordnet as wn 2import itertools 3words = ["cats", "pigs", "clocks", "cloud", "jerry beans", "orange"] 4words_to_synonym = {} 5for word in words: 6 synonyms = wn.synsets(word, lang='eng') 7 if synonyms: 8 words_to_synonym[word] = synonyms[0] 9 10print(words_to_synonym)

出力

{'cats': Synset('cat.n.01'), 'pigs': Synset('hog.n.03'), 'clocks': Synset('redstem_storksbill.n.01'), 'cloud': Synset('cloud.n.01'), 'orange': Synset('orange.n.01')}

Python

1words_matrix = {word: {} for word in words_to_synonym} 2 3it = itertools.product(words_to_synonym.items(), repeat=2) 4for (word_x, synonym_x), (word_y, synonym_y) in it: 5 if word_x is word_y: 6 continue 7 8 deg_similarity = synonym_x.path_similarity(synonym_y) 9 if deg_similarity is not None: 10 words_matrix[word_x][word_y] = deg_similarity 11 12print(words_matrix)

出力(段落は通常の出力よりも見やすく修正してあります)

{'cats': {'pigs': 0.125, 'clocks': 0.06666666666666667, 'cloud': 0.05555555555555555, 'orange': 0.05263157894736842}, 'pigs': {'cats': 0.125, 'clocks': 0.0625, 'cloud': 0.05263157894736842, 'orange': 0.05}, 'clocks': {'cats': 0.06666666666666667, 'pigs': 0.0625, 'cloud': 0.0625, 'orange': 0.058823529411764705}, 'cloud': {'cats': 0.05555555555555555, 'pigs': 0.05263157894736842, 'clocks': 0.0625, 'orange': 0.07692307692307693}, 'orange': {'cats': 0.05263157894736842, 'pigs': 0.05, 'clocks': 0.058823529411764705, 'cloud': 0.07692307692307693}}

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

Python 3.6.3
Mac OS High Sierra
Jupyter notebook 5.0.

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

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

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

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

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

guest

回答1

0

ベストアンサー

降順にソートし、先頭二要素を参照すれば良いです。

Python

1for outer_key, inner_dict in words_matrix.items(): 2 inner_sorted_items = sorted( 3 inner_dict.items(), 4 reverse=True, 5 key=operator.itemgetter(-1) 6 ) 7 8 print(f'{outer_key}:') 9 for k, v in inner_sorted_items[:2]: 10 print(f'- {k}') 11 12 print('-' * 42)

実行結果

plain

1cats: 2- pigs 3- clocks 4------------------------------------------ 5pigs: 6- cats 7- clocks 8------------------------------------------ 9clocks: 10- cats 11- pigs 12------------------------------------------ 13cloud: 14- orange 15- clocks 16------------------------------------------ 17orange: 18- cloud 19- clocks 20------------------------------------------

投稿2018/06/28 12:16

LouiS0616

総合スコア35660

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

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

退会済みユーザー

退会済みユーザー

2018/06/28 13:22

ご回答いただきましてありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問