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

时间:2015-03-17 12:33:42

标签: matlab subset cell-array

我正在进行文本挖掘。我从文本文件中提取了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,[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

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

1 个答案:

答案 0 :(得分:1)

我认为这可以满足您的需求:

[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}的超集,{{1}}也不会被删除。只与先前的集合(第三行代码)进行比较。