如何 select 从有序字典中选出最好的一对?

How to select the best pair from the ordered dictionary?

我正在尝试将一个字符串映射到它最合适的匹配字符串。我有一个与每个映射相关联的置信度分数。我对映射进行了排序,以便很好地了解可以观察到 match_string 的重复映射的数量。有序字典如下:

OrderedDict([(('access', 0.9997727), 'アクセス'),
             (('address', 0.44976854), 'お問い合せ先'),
             (('address', 0.99939954), '会社所在地'),
             (('address', 0.99950135), '勤務地'),
             (('app_condition', 0.33275154), '祝'),
             (('app_condition', 0.7852746), '勤務期間'),
             (('app_condition', 0.8870019), '社員登用実績多数'),
             (('app_condition', 0.9899178), '資格・スキル'),
             (('cname', 0.9822838), '会社名'),
             (('companydescr', 0.44985813), '経度'),
             (('feature', 0.69835746), '待遇・福利厚生'),
             (('feature', 0.8646633), 'メリット'),
             (('feature', 0.9998708), '特徴'),
             (('hiretype', 0.9998646), '雇用形態_職種ヒント'),
             (('jd', 0.42525598), '応募方法'),
             (('jd', 0.5210456), '生活スタイルに合わせて働けます'),
             (('jd', 0.7155549), '応募後のプロセス'),
             (('jd', 0.99901605), '仕事内容'),
             (('occup', 0.6487035), '事業内容'),
             (('occup', 0.91239053), '休日・休暇'),
             (('occup', 0.94584364), 'トップ'),
             (('occup', 0.96194524), '掲載URL'),
             (('occup', 0.9865232), 'CMS分類職種'),
             (('salary', 0.69874144), '緯度'),
             (('salary', 0.9436217), '取得日'),
             (('salary', 0.97082114), '交通費'),
             (('salary', 0.9999827), '給与'),
             (('title', 0.999959), 'タイトル'),
             (('workhours', 0.99996305), '勤務曜日・時間'),
             (('workhours', 0.9999968), '時間帯'),
             (('workhours', 0.9999995), '勤務時間')])

我想 select 根据这些多个映射中的置信度分数进行最佳匹配,并创建一个新字典,例如:

{
'access':'アクセス'
'address':'勤務地'
.
.
.
'workhours':'勤務時間'
}

我怎样才能做到这一点? 有序字典的键是一个元组,值是一个字符串。

如果您的字典已经根据置信度得分排序,您可以只使用字典理解:

d = OrderedDict([(('access', 0.9997727), 'アクセス'),
             (('address', 0.44976854), 'お問い合せ先'),
             (('address', 0.99939954), '会社所在地'),
             (('address', 0.99950135), '勤務地'),
...
])
result = {
    key[0]: val for key, val in d.items()
}
print(result)

这相当于:

result = {
   'access': 'アクセス',
   'address': 'お問い合せ先',
   'address': '会社所在地',
   'address': '勤務地',
   ...
}

由于字典已排序,您将只保留得分最高的最后一个值。所以最后就像这样做:

result = {
   'access': 'アクセス',
   #'address': 'お問い合せ先',
   #'address': '会社所在地',
   'address': '勤務地',
   ...
}

它给你你想要的。

你可以试试这个:

best_vals = dict()
item_list = list()

i = 0
for key, val in ord_dict.items():
    item_list.append(key[0])
    if key[0] == item_list[i]:
        if len(item_list) == 1:
          best_vals[key[0]] = val
        continue
    else:
        best_vals[key[0]] = val

best_vals 的输出:

{'access': 'アクセス',
 'address': '勤務地',
 'app_condition': '資格・スキル',
 'cname': '会社名',
 'companydescr': '経度',
 'feature': '特徴',
 'hiretype': '雇用形態_職種ヒント',
 'jd': '仕事内容',
 'occup': 'CMS分類職種',
 'salary': '給与',
 'title': 'タイトル',
 'workhours': '勤務時間'}

因为你的字典是反向排序的,我做的是检查当前项目是否是你字典中的最后一个,如果是,我设置相应键的值。

from collections import OrderedDict


d = OrderedDict([(('access', 0.9997727), 'アクセス'),
             (('address', 0.44976854), 'お問い合せ先'),
             (('address', 0.99939954), '会社所在地'),
             (('address', 0.99950135), '勤務地'),
             (('app_condition', 0.33275154), '祝'),
             (('app_condition', 0.7852746), '勤務期間'),
             (('app_condition', 0.8870019), '社員登用実績多数'),
             (('app_condition', 0.9899178), '資格・スキル'),
             (('cname', 0.9822838), '会社名'),
             (('companydescr', 0.44985813), '経度'),
             (('feature', 0.69835746), '待遇・福利厚生'),
             (('feature', 0.8646633), 'メリット'),
             (('feature', 0.9998708), '特徴'),
             (('hiretype', 0.9998646), '雇用形態_職種ヒント'),
             (('jd', 0.42525598), '応募方法'),
             (('jd', 0.5210456), '生活スタイルに合わせて働けます'),
             (('jd', 0.7155549), '応募後のプロセス'),
             (('jd', 0.99901605), '仕事内容'),
             (('occup', 0.6487035), '事業内容'),
             (('occup', 0.91239053), '休日・休暇'),
             (('occup', 0.94584364), 'トップ'),
             (('occup', 0.96194524), '掲載URL'),
             (('occup', 0.9865232), 'CMS分類職種'),
             (('salary', 0.69874144), '緯度'),
             (('salary', 0.9436217), '取得日'),
             (('salary', 0.97082114), '交通費'),
             (('salary', 0.9999827), '給与'),
             (('title', 0.999959), 'タイトル'),
             (('workhours', 0.99996305), '勤務曜日・時間'),
             (('workhours', 0.9999968), '時間帯'),
             (('workhours', 0.9999995), '勤務時間')])

d = sorted(d.items(), key=lambda item: (item[0][0], -item[0][1]))
res = dict()
for item in d:
  if item[0][0] not in res:
    res[item[0][0]] = item[1]
print("\n".join(str(item) for item in res.items()))

结果是

('access', 'アクセス')
('address', '勤務地')
('app_condition', '資格・スキル')
('cname', '会社名')
('companydescr', '経度')
('feature', '特徴')
('hiretype', '雇用形態_職種ヒント')
('jd', '仕事内容')
('occup', 'CMS分類職種')
('salary', '給与')
('title', 'タイトル')
('workhours', '勤務時間')

最简单的解决方案是 -

import pandas as pd
from collections import OrderedDict


d = OrderedDict([(('access', 0.9997727), 'アクセス'),
             (('address', 0.44976854), 'お問い合せ先'),
             (('address', 0.99939954), '会社所在地'),
             (('address', 0.99950135), '勤務地'),
             (('app_condition', 0.33275154), '祝'),
             (('app_condition', 0.7852746), '勤務期間'),
             (('app_condition', 0.8870019), '社員登用実績多数'),
             (('app_condition', 0.9899178), '資格・スキル'),
             (('cname', 0.9822838), '会社名'),
             (('companydescr', 0.44985813), '経度'),
             (('feature', 0.69835746), '待遇・福利厚生'),
             (('feature', 0.8646633), 'メリット'),
             (('feature', 0.9998708), '特徴'),
             (('hiretype', 0.9998646), '雇用形態_職種ヒント'),
             (('jd', 0.42525598), '応募方法'),
             (('jd', 0.5210456), '生活スタイルに合わせて働けます'),
             (('jd', 0.7155549), '応募後のプロセス'),
             (('jd', 0.99901605), '仕事内容'),
             (('occup', 0.6487035), '事業内容'),
             (('occup', 0.91239053), '休日・休暇'),
             (('occup', 0.94584364), 'トップ'),
             (('occup', 0.96194524), '掲載URL'),
             (('occup', 0.9865232), 'CMS分類職種'),
             (('salary', 0.69874144), '緯度'),
             (('salary', 0.9436217), '取得日'),
             (('salary', 0.97082114), '交通費'),
             (('salary', 0.9999827), '給与'),
             (('title', 0.999959), 'タイトル'),
             (('workhours', 0.99996305), '勤務曜日・時間'),
             (('workhours', 0.9999968), '時間帯'),
             (('workhours', 0.9999995), '勤務時間')])

df = pd.concat((pd.DataFrame(d.keys()) , pd.DataFrame(d.values())), axis =1 )
df.columns = [0,1,2]     
((df.groupby(0).max())[2]).to_dict()

输出-

{'access': 'アクセス',
 'address': '勤務地',
 'app_condition': '資格・スキル',
 'cname': '会社名',
 'companydescr': '経度',
 'feature': '特徴',
 'hiretype': '雇用形態_職種ヒント',
 'jd': '生活スタイルに合わせて働けます',
 'occup': '掲載URL',
 'salary': '緯度',
 'title': 'タイトル',
 'workhours': '時間帯'}