我建议使用每个标签一行的映射,而不是每对一行(标签,相关标签)的新表,但是这一行将标签映射到所有相关标签(及其频率)的整个列表。
大多数编程语言在其标准库中都有一个标准“映射”:在 C++ 中,它是std::map
or std::unordered_map
; 在 Java 中,它是接口java.util.Map
,实现为java.util.HashMap
or java.util.TreeMap
;在 python 中,它是dict
.
这是python中的解决方案。该映射是用 实现的collections.defaultdict
,它将每个标签映射到一个collections.Counter
,这是用来计算频率的 Python 工具。
from collections import Counter, defaultdict
table = [
["A", "B", "C", "D"],
["A", "C", "D", "G"],
["A", "F", "G", "H"],
["A", "B", "G", "H"],
]
def build_frequency_table(table):
freqtable = defaultdict(Counter)
for row in table:
for tag in row:
freqtable[tag].update(row)
for c,freq in freqtable.items():
del freq[c]
return freqtable
freqtable = build_frequency_table(table)
print( freqtable )
# defaultdict(<class 'collections.Counter'>,
# {'A': Counter({'G': 3, 'B': 2, 'C': 2, 'D': 2, 'H': 2, 'F': 1}),
# 'B': Counter({'A': 2, 'C': 1, 'D': 1, 'G': 1, 'H': 1}),
# 'C': Counter({'A': 2, 'D': 2, 'B': 1, 'G': 1}),
# 'D': Counter({'A': 2, 'C': 2, 'B': 1, 'G': 1}),
# 'G': Counter({'A': 3, 'H': 2, 'C': 1, 'D': 1, 'F': 1, 'B': 1}),
# 'F': Counter({'A': 1, 'G': 1, 'H': 1}),
# 'H': Counter({'A': 2, 'G': 2, 'F': 1, 'B': 1})})
print(freqtable['A'].most_common())
# [('G', 3), ('B', 2), ('C', 2), ('D', 2), ('H', 2), ('F', 1)]