Как получить только слово без знаков препинания при чтении текстового файла? - PullRequest
0 голосов
/ 25 августа 2018

Текстовый файл abc.txt - это произвольная статья, удаленная из Интернета.Например, это выглядит следующим образом:

Его зовут "Дональд", и он любит гамбургер.11 декабря он женился.

Я хочу извлечь только слова в нижнем регистре и цифры, за исключением всех видов периодов и цитат в приведенной выше статье.В приведенном выше примере:

{его, зовут Дональд, и он любит гамбургер, 11 декабря он женат}

Мой код выглядит следующим образом:

filename = 'abc.txt';
fileID = fopen(filename,'r');
C = textscan(fileID,'%s','delimiter',{',','.',':',';','"','''});
fclose(fileID);
Cstr = C{:};
Cstr = Cstr(~cellfun('isempty',Cstr));

Существует ли какой-либо простой код для извлечения только букв алфавита и цифр, кроме всех символов?

1 Ответ

0 голосов
/ 25 августа 2018

Для преобразования определенных слов в нижний регистр необходимо выполнить два шага.

regexprep преобразует слова, которые находятся либо в начале строки, либо после полной остановки и пробела, в нижний регистр.

В функции regexprep,мы используем следующий шаблон:

(?<=^|\. )([A-Z])

, чтобы указать, что:

  • (?<=^|\. ) Мы хотим утверждать, что перед словом интереса либо начало строки (^) или (|) найдена полная остановка (.), за которой следует пробел.Этот тип конструкции называется lookbehind .
  • ([A-Z]) Эта часть выражения соответствует и фиксирует (сохраняет совпадение) заглавную букву (A-Z).

Компонент ${lower($0)} в регулярном выражении называется динамическим выражением и заменяет содержимое захваченной группы (([A-Z])) на нижний регистр.Этот синтаксис специфичен для языка MATLAB.

Вы можете проверить поведение вышеприведенного выражения здесь .


После выполнения преобразований в нижний регистр regexp находит все вхождения одну или несколько цифр, строчных и прописных букв.

Шаблон [a-zA-Z0-9]+ соответствует строчным буквам, заглавным буквам и цифрам.

Вы можете проверить поведение этого регулярного выражения здесь .

text = fileread('abc.txt')
data = {regexp(regexprep(text,'(?<=^|\. )([A-Z])','${lower($0)}'),'[a-zA-Z0-9]+','match')'}

>>data{1}

13×1 cell array

    {'his'     }
    {'name'    }
    {'is'      }
    {'Donald'  }
    {'and'     }
    {'he'      }
    {'likes'   }
    {'burger'  }
    {'on'      }
    {'December'}
    {'11'      }
    {'he'      }
    {'married' }
...