我正在进行文本挖掘。我从文本文件中提取了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
请记住,这应该检查系统中所有可能的条目子集。
答案 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}}也不会被删除。只与先前的集合(第三行代码)进行比较。