我正在使用Matlab
编写一个文本分析器,它读取.txt
文件并找出它在说什么(主题),假设我有一个单词列表:{{ 1}}
在阅读我的文本文件时,我想查找它是否包含这些单词并显示类似“此文件谈论SVM ...”;否则它没有。
我真的很困惑,我试着得到单词freq,现在我得到了任何帮助!
我的代码:
{'SVM','Linear','SVMTRAIN','Vector', 'Support'..};
文本文件示例:
fid = fopen('Test.txt');
s=textscan(fid,'%s')
fclose(fid);
str=s{:}
[unique_words,jj,kk] = unique(str)
freq = hist(kk,(1:numel(jj))).'
d = [unique_words num2cell(freq)]
答案 0 :(得分:1)
这是使用正则表达式执行此操作的方法。我确信有一种更有效的方法,但我使用循环检查文本文件中的匹配项与单词列表中的每个单词。我希望你的申请不会太久。无论如何这里是代码:
clear
clc
%// Generate dummy text document, equivalent to what you would get after
%// the call to s{:}.
str = {'Blablabla';'SVM';'SuPPorT';'Vector';'DummyWord';'Hello there';'SVM';'Vector';'Support'};
WordList = cell(2,5);
WordList(1,:) = {'SVM','Linear','SVMTRAIN','Vector', 'Support'};
for k = 1:size(WordList,2)
%// Use regular expressions to match each word in your list in the text
CheckWord = regexp(str,WordList{1,k},'match');
%// Find indices in which there is a match in the text.
MatchCells = ~cellfun(@isempty,CheckWord);
%// Count the number of occurences for future reference.
NumOccurences = numel(find(MatchCells));
%// Assign number of occurences as 2nd row of WordList cell array
WordList{2,k} = num2str(NumOccurences);
end
%// Display WordList
WordList
WordList
看起来像这样:
WordList =
'SVM' 'Linear' 'SVMTRAIN' 'Vector' 'Support'
'2' '0' '0' '2' '1'
因此,很容易显示每个单词的匹配数。
希望有所帮助!
修改强> 以下是关于Matchcells和NumOccurences的一些补充说明:
1)MatchCells返回逻辑值(即0或1)的向量,该向量对应于(1)或不是(0)单元阵列中的给定单元是否为空。这里有问题的单元格数组为CheckWord
,对于上面定义的单词列表中的每个单词,我们使用regexp检查它们在str
中的位置。使用cellfun
对整个单元阵列进行操作,相当于for循环。例如,在上面的循环中,对于k = 1,MatchCells
看起来像这样:
MatchCells =
0
1
0
0
0
0
1
0
0
因此,我们看到CheckWord
的第2和第7个条目对于列表中的第一个单词(SVM)不为空。请注意,我使用~cellfun(...)
来表示非空的单元格。对于空单元格,我会使用cellfun(...)
。然后NumOccurences
表示MatchCells中1的数量,这里2表示单词SVM
的情况。
为了更清楚,find(MatchCells)
返回单元格数组中与匹配项对应的索引。如果没有匹配,则答案为零。使用numel(find(MatchCells))
为我们提供了find
命令产生的数组中的元素数,从而给出匹配数。
如果你想更好地看到每一行的作用,请删除末尾的分号(;),以便在命令窗口中获得输出。