如何删除包含其他单元格超集的所有单元格?

How to remove all cells which contain supersets of other cells?

我从事文本挖掘工作。我从一个文本文件中提取了 23 个句子以及从同一个文本文件中提取的 6 个常用词。

对于常用词,我创建了一个一维数组来显示单词及其出现的句子。之后我用交集来显示哪个词与句子中其他每个剩余的词一起出现:

OccursTogether = cell(length(Out1));
for ii=1:length(Out1)
    for jj=ii+1:length(Out1)
        OccursTogether{ii,jj} = intersect(Out1{ii},Out1{jj});
    end
end
celldisp(OccursTogether)

输出有点像这样:

OccursTogether[1,1]= 4 3
OccursTogether[1,2]= 1 4 3
OccursTogether[1,3]= 4 3

在上面[1,1]表示第1个词出现在第4句和第3句中,[1,2]表示第1个词和第2个词出现在第1句2和3中,依此类推。

我想做的是实现一种元素吸收技术,它将删除所有包含其他单元格超集的单元格。正如我们在上面看到的 [1,1] 中的 4 和 3 是 [1,2] 的子集,因此应删除 OccursTogether[1,2] 条目并输出如下:

occurs[1,1]= 4 3
occurs[1,3]= 4 3

记住这应该检查系统中所有可能的条目子集。

我认为这符合您的要求:

[ii, jj] = ndgrid(1:numel(OccursTogether));
s = cellfun(@(x,y) all(ismember(x,y)), OccursTogether(ii), OccursTogether(jj));
s = triu(s,1); %// count each pair just once, and remove self-pairs
result = OccursTogether(~any(s,1));

示例 1:

OccursTogether{1,1} = [4 3]
OccursTogether{1,2} = [1 4 3]
OccursTogether{1,3} = [1 4 3 5];
OccursTogether{1,4} = [1 4 3 5];

给予

>> celldisp(result)
result{1} =
     4     3

OccursTogether{1,2} 被删除,因为它是 OccursTogether{1,1} 的超集。 OccursTogether{1,3} 被删除,因为它是 OccursTogether{1,2} 的超集。 OccursTogether{1,4} 被删除,因为它是 OccursTogether{1,3}.

的超集

示例 2:

OccursTogether{1,1} = [10 20 30]
OccursTogether{1,2} = [10 20 30]

给予

>> celldisp(result)
result{1} =
    10    20    30

OccursTogether{1,2} 被删除,因为它是 OccursTogether{1,1} 的超集,但 OccursTogether{1,1} 即使它是 OccursTogether{1,2} 的超集也不会被删除。仅与之前的集合(第三行代码)进行比较。