在多个文本文件中查找常用单词并将其保存到新文本文件中

时间:2014-04-27 07:52:08

标签: matlab

如果我有10-20个文本文件,并且每个文件至少包含4-5个单词,那么如何获取这些单词并将它们保存到新的文本文件中。 我已经尝试了很多东西,因为我的文本文件是逐个出现的,所以我无法计算文本文件的数量。有没有办法将文本分别保存到不同的单元格数组而不使用循环,然后找到常用的单词。 这是代码 -

sdirectory = 'C:\Users\anurag\Desktop\Animals\Annotations\';
textfiles = dir([sdirectory '*.eng']);
sdirectory1 = 'C:\Users\anurag\Desktop\Animals\Images\';
imgfiles = dir([sdirectory1 '*.jpg']);

num_of_files = length(textfiles);
C = cell(num_of_files,1);

for w = 1:length(textfiles)
  file = [sdirectory textfiles(w).name];
  STR = importdata(file);
  BL = cellfun(@lower,STR,'uni',0);
  B = regexprep(BL,'<.*?>','');
  B(strcmp(B, '')) = [];
  tmp = regexp(B, '/| ', 'split');
  C{w} = [tmp{:}];
end

where = [];

for j = 1:length(C)
  file1 = [sdirectory1  imgfiles(j).name];
  file2 = [sdirectory textfiles(j).name]; 

  if find(strcmp(C{j},'alligator'))
    where = [where num2str(j) '.eng, '];
    disp(file2);
  end
end

file2变量将显示将文本文件与文本alligator匹配的路径。但它不会存储路径,但会在新循环开始时覆盖路径。因此,如何分别存储每个路径,以便分别访问文本文件中的存储数据,并在其中查找常用词。

1 个答案:

答案 0 :(得分:0)

您应首先阅读您正在使用的文件,并将这些单词存储为包含字符串的单元格数组。然后你应该成对地比较单元格数组并比较成对和儿子的结果,直到你有一个单元格数组。

如果您有四个文件且(A,B,C,D)是文件中的四个单元格单词数组,则应比较A和B(结果为AB),C和D(结果为CD),然后你应该比较AB和CD来得到所有四个文件中最后一个单词数组。

一个例子

basedir = '';
files = dir([basedir '*.eng']);
filenames = strcat({basedir}, {files.name});

现在filenames将保留您要处理的所有文件的路径。然后,您应该编写一个函数,给定一个路径打开文件并在文件中创建单词的单元格数组,让我们调用此函数read_my_data

wordlists = {};
for i = 1:numel(filenames)
  wordlists{i} = read_my_data(filenames{i});
end

如果您有两个字符串AB的单元格数组,那么您可以通过对它们进行排序找到重复项,然后遍历数组。

function C = duplicates(A,B)
  i = 1; j = 1; k = 1;
  C = {};
  A = sort(A);
  B = sort(B);
  while i <= numel(A) & j <= numel(B) 
    switch strcmp(A{i}, B{i})
      case -1
        i = i + 1;
      case 0
        C{k} = A{i};
        i = i + 1;
        j = j + 1;
        k = k + 1;
      case 1
        j = j + 1;
    end
  end

然后,您可以循环wordlists并找到重复项

while numel(wordlists) > 1
  j = 1
  tmp = {};
  for i = 1:2:numel(wordlists)-1
    tmp{j} = duplicates(wordlists{i}, wordslists{i+1});
    j = j + 1;
  end
  wordlists = tmp;
end

请注意,您需要确保numel(wordlists)为偶数或1。