2017-03-02 6 views
4

に合わせてスコアに基づいて、リストの項目を並べ替える:は、私が持っていることを考えると関数曲線

  • 各単語
  • 難しさのレベルのための「シンプルさ」を示す言葉
  • ポイント/スコアのリスト各単語の:

>>> words = ['apple', 'pear', 'car', 'man', 'average', 'older', 'values', 'coefficient', 'exponential'] 
>>> points = ['9999', '9231', '8231', '5123', '4712', '3242', '500', '10', '5'] 
>>> bins = [0, 0, 0, 0, 1, 1, 1, 2, 2] 

現在、単語リストは、シンプルpointsによって発注されます。

シンプルさを「2次曲線」としてモデル化したいのですが?、すなわち高い方から低い地点へと戻っハイに、すなわち対応点で、このように見える単語リストを生成:私はこれを試してみましたが、それは痛いほどクレイジーだ

['apple', 'pear', 'average', 'coefficient', 'exponential', 'older', 'values', 'apple', 'pear'] 

を:

>>> from collections import Counter 
>>> Counter(bins)[0] 
4 
>>> num_easy, num_mid, num_hard = Counter(bins)[0], Counter(bins)[1], Counter(bins)[2] 
>>> num_easy 
4 
>>> easy_words = words[:num_easy] 
>>> mid_words = words[num_easy:num_easy+num_mid] 
>>> hard_words = words[-num_hard:] 
>>> easy_words, mid_words, hard_words 
(['apple', 'pear', 'car', 'man'], ['average', 'older', 'values'], ['coefficient', 'exponential']) 
>>> easy_1 = easy_words[:int(num_easy/2)] 
>>> easy_2 = easy_words[len(easy_1):] 
>>> mid_1 = mid_words[:int(num_mid/2)] 
>>> mid_2 = mid_words[len(mid_1):] 
>>> new_words = easy_1 + mid_1 + hard_words + mid_2 + easy_1 
>>> new_words 
['apple', 'pear', 'average', 'coefficient', 'exponential', 'older', 'values', 'apple', 'pear'] 

いいえ。ビンの数が> 3か、正弦曲線に合うように単語の「ポイント」を設定することができます。

これはまったくnlpの質問ではなく、 'zipf'ディストリビューションとは関係なく、単語のランキングに合わせて並べ替えるものがあります。

オブジェクト(この場合は単語)を各整数にマップした整数のリストがあり、オブジェクトのリストを2次曲線に合わせて並べ替えたいとします。カスタム基準に従ってリストに

+0

>>> s = sorted(zip(map(int, points), words)) >>> new_words = [word for p, word in list(reversed(s[::2])) + s[1::2]] # If you have lots of words you'll be better off using some # itertools like islice and chain, but the principle becomes evident >>> new_words ['apple', 'car', 'older', 'values', 'exponential', 'coefficient', 'average', 'man', 'pear'] 

のように順序ポイントの派生? – schwobaseggl

+0

ビンはポイントから派生しています。 – alvas

+0

あなたは "単語リストはシンプルな' points'によって整理されていますが、 'points'は' 5123 '、' 3242 '、' 4712'という部分列があるのであなたの例では整列していません。私の理解に間違いはありますか? @Rohanil、typo。 – Rohanil

答えて

2

これらの行に沿ってsthします。並び替え、そのポイントによって言葉は、毎秒を取ることの半分を逆転し、2 CONCAT:無関係 `points`ですか` bin`値が

[(9999, 'apple'), (8231, 'car'), (4712, 'older'), (500, 'values'), (5, 'exponential'), (10, 'coefficient'), (3242, 'average'), (5123, 'man'), (9231, 'pear')] 
2

ソートそれを、2つの塊でそれを圧縮し、最後の半分を逆に、その長さが偶数か奇数であるかどうかを確認する:不均一なデータが生じることがあること

>>> def peak(s): 
...  return s[::2]+s[-1-(len(s)%2)::-2] 
... 
>>> peak('112233445566778') 
'123456787654321' 
>>> peak('1122334455667788') 
'1234567887654321' 

注意を非対称的な結果:

>>> peak('11111123') 
'11123111' 
関連する問題