Анализ текстовых данных с массивами строк

Этот пример показывает, как сохранить текст из файла как массив строк, отсортировать слова по их частоте, постройте результат и соберите основные статистические данные для слов, найденных в файле.

Импорт текстового файла к массиву строк

Считайте текст из Сонетов Шекспира с функцией fileread. fileread возвращает текст как 1 100266 вектор символов.

sonnets = fileread('sonnets.txt');
sonnets(1:35)
ans = 
    'THE SONNETS
     
     by William Shakespeare'

Преобразуйте текст в строку с помощью функции string. Затем разделите его на символах новой строки с помощью функции splitlines. sonnets становится 2625 1 массивом строк, где каждая строка содержит одну строку из стихов. Отобразите первые пять строк sonnets.

sonnets = string(sonnets);
sonnets = splitlines(sonnets);
sonnets(1:5)
ans = 5x1 string array
    "THE SONNETS"
    ""
    "by William Shakespeare"
    ""
    ""

Чистый массив строк

Чтобы вычислить частоту слов в sonnets, сначала уберите его путем удаления пустых строк и знаков препинания. Затем измените его в массив строк, который содержит отдельные слова как элементы.

Удалите строки с нулевыми символами ("") от массива строк. Сравните каждый элемент sonnets к "", пустой строке. Начиная в R2017a, можно создать строки, включая пустую строку, с помощью двойных кавычек. TF является логическим вектором, который содержит истинное значение везде, где sonnets содержит строку с нулевыми символами. Индексируйте в sonnets с TF и удалите все строки с нулевыми символами.

TF = (sonnets == "");
sonnets(TF) = [];
sonnets(1:10)
ans = 10x1 string array
    "THE SONNETS"
    "by William Shakespeare"
    "  I"
    "  From fairest creatures we desire increase,"
    "  That thereby beauty's rose might never die,"
    "  But as the riper should by time decease,"
    "  His tender heir might bear his memory:"
    "  But thou, contracted to thine own bright eyes,"
    "  Feed'st thy light's flame with self-substantial fuel,"
    "  Making a famine where abundance lies,"

Замените некоторые знаки препинания на пробелы. Например, замените периоды, запятые и точки с запятой. Сохраните апострофы, потому что они могут быть частью некоторых слов в Сонетах, таких как свет.

p = [".","?","!",",",";",":"];
sonnets = replace(sonnets,p," ");
sonnets(1:10)
ans = 10x1 string array
    "THE SONNETS"
    "by William Shakespeare"
    "  I"
    "  From fairest creatures we desire increase "
    "  That thereby beauty's rose might never die "
    "  But as the riper should by time decease "
    "  His tender heir might bear his memory "
    "  But thou  contracted to thine own bright eyes "
    "  Feed'st thy light's flame with self-substantial fuel "
    "  Making a famine where abundance lies "

Разделите продвижение и символы конечного пробела от каждого элемента sonnets.

sonnets = strip(sonnets);
sonnets(1:10)
ans = 10x1 string array
    "THE SONNETS"
    "by William Shakespeare"
    "I"
    "From fairest creatures we desire increase"
    "That thereby beauty's rose might never die"
    "But as the riper should by time decease"
    "His tender heir might bear his memory"
    "But thou  contracted to thine own bright eyes"
    "Feed'st thy light's flame with self-substantial fuel"
    "Making a famine where abundance lies"

Разделите sonnets в массив строк, элементы которого являются отдельными словами. Можно использовать функцию split, чтобы разделить элементы массива строк на пробельных символах, или на разделителях, которые вы задаете. Однако split требует, чтобы каждый элемент массива строк был делимым в равное количество новых строк. Элементы sonnets имеют различные количества пробелов, и поэтому не являются делимыми в равные количества строк. Чтобы использовать функцию split на sonnets, запишите цикл for, который вызывает split на одном элементе за один раз.

Создайте массив пустой строки sonnetWords с помощью функции strings. Запишите цикл for, который разделяет каждый элемент sonnets с помощью функции split. Конкатенация вывода от split на sonnetWords. Каждый элемент sonnetWords является отдельным словом от sonnets.

sonnetWords = strings(0);
for i = 1:length(sonnets)
   sonnetWords = [sonnetWords ; split(sonnets(i))];
end
sonnetWords(1:10)
ans = 10x1 string array
    "THE"
    "SONNETS"
    "by"
    "William"
    "Shakespeare"
    "I"
    "From"
    "fairest"
    "creatures"
    "we"

Сортировка слов на основе частоты

Найдите уникальные слова в sonnetWords. Считайте их и отсортируйте их на основе их частоты.

Чтобы считать слова, которые отличаются только случаем как то же слово, преобразуйте sonnetWords в нижний регистр. Например, The и the рассчитывают как то же слово. Найдите уникальные слова с помощью функции unique. Затем считайте число раз, каждое уникальное слово происходит с помощью функции histcounts.

sonnetWords = lower(sonnetWords);
[words,~,idx] = unique(sonnetWords);
numOccurrences = histcounts(idx,numel(words));

Сортировка слов в sonnetWords количеством случаев, от большинства до наименее общего.

[rankOfOccurrences,rankIndex] = sort(numOccurrences,'descend');
wordsByFrequency = words(rankIndex);

Графическое изображение частотности слова

Постройте случаи слов в Сонетах от большинства до наименее общих слов. Закон Зипфа утверждает, что распределение случаев слов в большом основном тексте следует за распределением закона степени.

loglog(rankOfOccurrences);
xlabel('Rank of word (most to least common)');
ylabel('Number of Occurrences');

Отобразите десять наиболее распространенных слов в Сонетах.

wordsByFrequency(1:10)
ans = 10x1 string array
    "and"
    "the"
    "to"
    "my"
    "of"
    "i"
    "in"
    "that"
    "thy"
    "thou"

Собирание основных статистических данных в таблице

Вычислите общее количество случаев каждого слова в sonnetWords. Вычислите количество случаев как процент общего количества слов и вычислите совокупный процент от большинства до наименее общего. Запишите слова и базовую статистику для них к таблице.

numOccurrences = numOccurrences(rankIndex);
numOccurrences = numOccurrences';
numWords = length(sonnetWords);
T = table;
T.Words = wordsByFrequency;
T.NumOccurrences = numOccurrences;
T.PercentOfText = numOccurrences / numWords * 100.0;
T.CumulativePercentOfText = cumsum(numOccurrences) / numWords * 100.0;

Отобразите статистику для десяти наиболее распространенных слов.

T(1:10,:)
ans=10×4 table
    Words     NumOccurrences    PercentOfText    CumulativePercentOfText
    ______    ______________    _____________    _______________________

    "and"          490             2.7666                2.7666         
    "the"          436             2.4617                5.2284         
    "to"           409             2.3093                7.5377         
    "my"           371             2.0947                9.6324         
    "of"           370             2.0891                11.722         
    "i"            341             1.9254                13.647         
    "in"           321             1.8124                15.459         
    "that"         320             1.8068                17.266         
    "thy"          280             1.5809                18.847         
    "thou"         233             1.3156                20.163         

Наиболее распространенное слово в Сонетах, и, происходит 490 раз. Вместе, десять наиболее распространенных слов составляют 20,163% текста.

Смотрите также

| | | | | | | | | |

Похожие темы