2017-04-16 10 views
0

私は関数(hypernym_distances())を見ていましたが、可能なすべてのハイパーニムの結果を見たとき、異なる距離の2つの "entity.n.01"要素があったのはなぜですか?誰もこれについて説明できますか? Pythonでsynset.hyperym_distances()に重複はありませんか?

print([{i[0] : i[1]} for i in wn.synset('person.n.01').hypernym_distances()])

この上記のコードは、最終的な用語 'エンティティ' につながるすべての上位語が表示されて表示されます。

出力である:

[{Synset( 'entity.n.01'):3}、{Synset( 'object.n.01'):4}、{Synset( 'physical_entity {Synset( 'entity.n.01'):1}、{Synset( 'person.n.01'):0}、{Synset( 'entity.n.01'): )、{Synset( 'causal_agent.n.01'):1}、{Synset( 'living_thing.n.01'):2}、{Synset( 'physical_entity.n.01'):2} {Synset( 'whole.n.02'):3}]

これは、指定された単語の上位語の1つであるsynsetを含む名前と値のペアです。

「entity.n.01」が2回出現する理由を誰が説明できるのでしょうか。

{Synset( 'entity.n.01'):6}

{Synset( 'entity.n.01'):3}

+0

StackOverflowへようこそhttps://stackoverflow.com/help/how-to-askをご覧ください。コードを書式設定して質問を言い換えることができますか?あなたが何を求めているのかは不明です。 – alvas

+0

確認してください:)!@alvas –

答えて

0

コードは鈍角であり、休憩それらをダウン。

また、ワンライナーを使用しないようにしよう、彼らは通常、あなたがそれらを入力することができますどれだけ速く以外の計算速度アップを持っていません。

あなたはそれでは、ダウンを破るせ

を反復しているか知っています。すべての要素のリストの反復のための辞書を作成し、リスト内包の複雑なプリントで

、我々は、次を参照してください。

print([{i[0] : i[1]} for i in wn.synset('person.n.01').hypernym_distances()]) 

ループ自体を簡素化することができるように見えます。最初にsynsetを保持する変数を設定します。 (私はあなたの代わりにのみのみperson.n.01にそれを使用して、いくつかののsynsetに同じ操作をしたいと思うことを想定):person.hypernym_distances()

>>> person.hypernym_distances() 
{(Synset('person.n.01'), 0), (Synset('organism.n.01'), 1), (Synset('whole.n.02'), 3), (Synset('physical_entity.n.01'), 5), (Synset('causal_agent.n.01'), 1), (Synset('entity.n.01'), 3), (Synset('living_thing.n.01'), 2), (Synset('physical_entity.n.01'), 2), (Synset('entity.n.01'), 6), (Synset('object.n.01'), 4)} 

データ構造です:

person = wn.synset('person.n.01') 

今度はperson.hypernym_distances()リターンは何を見てみましょうすでにタプルのセットで、最初の要素が上位の要素で、2番目の要素が距離です。 Synset('entity.n.01')は、setタイプのため、person.hypernym_distances()に1回しか発生しません。タプルのリストを反復処理することにより

タプルを反復処理するとき、あなたは簡単に(Unpacking a list/tuple of pairs into two lists/tuplesHow can I iterate through two lists in parallel?を参照)、それを「解凍」できるループで

>>> from nltk.corpus import wordnet as wn 
>>> wn.synset('person.n.01') 
Synset('person.n.01') 
>>> person = wn.synset('person.n.01') 
>>> person.hypernym_distances() 
{(Synset('person.n.01'), 0), (Synset('organism.n.01'), 1), (Synset('whole.n.02'), 3), (Synset('physical_entity.n.01'), 5), (Synset('causal_agent.n.01'), 1), (Synset('entity.n.01'), 3), (Synset('living_thing.n.01'), 2), (Synset('physical_entity.n.01'), 2), (Synset('entity.n.01'), 6), (Synset('object.n.01'), 4)} 
>>> for ss, count in person.hypernym_distances(): 
...  print (ss,'\t', count) 
... 
Synset('person.n.01') 0 
Synset('organism.n.01')  1 
Synset('whole.n.02')  3 
Synset('physical_entity.n.01') 5 
Synset('causal_agent.n.01')  1 
Synset('entity.n.01') 3 
Synset('living_thing.n.01')  2 
Synset('physical_entity.n.01') 2 
Synset('entity.n.01') 6 
Synset('object.n.01') 4 

をタプル/イテレート可能オブジェクトの反復可能な開梱

あなたは醜い(i[0], i[1]) for i in iterable_of_tuplesの構文を避けることができます。代わりに(a,b) for a,b in iterable_of_tuplesを実行します。 Dictの理解

一覧あなたは鍵がsynsetであり、値がカウントで辞書にperson.hypernym_distances()からタプルを入れしようとしているように思えます。

あなたがlist comprehensiondictionary comprehensionの間でトリップしたときに間違いが起こったと思います。 person.hypernym_distances()にすべての要素の新しい辞書を作成する必要はありません。代わりに、私は辞書理解がつまり、あなたが探しているものだと思う:

>>> {ss:count for ss, count in person.hypernym_distances()} 
{Synset('object.n.01'): 4, Synset('whole.n.02'): 3, Synset('living_thing.n.01'): 2, Synset('organism.n.01'): 1, Synset('entity.n.01'): 6, Synset('person.n.01'): 0, Synset('causal_agent.n.01'): 1, Synset('physical_entity.n.01'): 2} 

上記の辞書が持つタプルの反復可能な特定のあなたが望むものであるならば、実際の辞書

にタプルのリストをキャスティング

>>> dict(person.hypernym_distances()) 
{Synset('object.n.01'): 4, Synset('whole.n.02'): 3, Synset('living_thing.n.01'): 2, Synset('organism.n.01'): 1, Synset('entity.n.01'): 6, Synset('person.n.01'): 0, Synset('causal_agent.n.01'): 1, Synset('physical_entity.n.01'): 2} 

を参照してください。辞書に反復可能に鋳造タプルあたり2つの項目は、自動的にキーと値と第二のようにタプルの最初の項目を設定します

これを処理できるネイティブのPythonには、高性能のコンテナデータ構造があります。 https://docs.python.org/3/library/collections.html

関連する問題