如何删除包含其他单元格超集的所有单元格?
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}
的超集也不会被删除。仅与之前的集合(第三行代码)进行比较。
我从事文本挖掘工作。我从一个文本文件中提取了 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}
的超集也不会被删除。仅与之前的集合(第三行代码)进行比较。