我有一个类似树的结构,其中每个节点都附加了5个文档的列表。每个文档都有一定数量的单词。我想保留每个节点上的所有单词,这些单词在该节点中占多数,在其他节点中占少数,或者在该节点中占60%以上的文档,在其兄弟中的文档少于40%。
例如:A是父节点,B,C是其子节点,每个子节点都附有5个文档的列表。
B = [['a','b','c','d','m'],['b','d','m','n'],['c','d','e','o'],['c','e','f','n'],['b','c','e','g']]
C = [['a','m','n'],['a','m','o'],['b','c','m','n'],['c','n','o'],['b','n','o','g']]
所以我想把b,c,d保留在B中,因为它们在B中占多数,在C中占少数,在C中同样是m,n,o。 最后B和C将如下所示:
B = [['b','c','d'],['b','d'],['c','d'],['c'],['b','c']]
C = [['m','n'],['m','o'],['m','n'],['n','o'],['n','o']]
请帮助我如何做到这一点。
答案 0 :(得分:1)
以下是我使用易于理解的代码的建议:
B = [['a','b','c','d','m'],['b','d','m','n'],['c','d','e','o'],['c','e','f','n'],['b','c','e','g']]
C = [['a','m','n'],['a','m','o'],['b','c','m','n'],['c','n','o'],['b','n','o','g']]
# 1. Retrieve the set of all words
wordSet = set([word for words in B+C for word in words])
# 2. Compute the occurrences of each word in each node
occurB = {word:0 for word in wordSet}
occurC = {word:0 for word in wordSet}
for word in wordSet:
for document in B:
if word in document:
occurB[word] += 1
for document in C:
if word in document:
occurC[word] += 1
# 3. Filter the nodes using majority and minority
majorityB, minorityB = int(0.6 * len(B)), int(0.4 * len(B))
majorityC, minorityC = int(0.6 * len(C)), int(0.4 * len(C))
newB = [[word for word in document if occurB[word] >= majorityB and occurC[word] <= minorityC] for document in B]
newC = [[word for word in document if occurC[word] >= majorityC and occurB[word] <= minorityB] for document in C]
print(newB) # [['b', 'c', 'd'], ['b', 'd'], ['c', 'd', 'e'], ['c', 'e'], ['b', 'c', 'e']]
print(newC) # [['m', 'n'], ['m', 'o'], ['m', 'n'], ['n', 'o'], ['n', 'o']]
注意:
与原始问题相比,'e'另外保存在newB
中。但我认为这是合乎逻辑的,因为它在B中占多数,在C中占少数。