exponenta event banner

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

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

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

Прочитать текст из «Сонетов Шекспира» с 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
    "THE SONNETS"
    ""
    "by William Shakespeare"
    ""
    ""

Очистить массив строк

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

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

TF = (sonnets == "");
sonnets(TF) = [];
sonnets(1:10)
ans = 10x1 string
    "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
    "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
    "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
    "THE"
    "SONNETS"
    "by"
    "William"
    "Shakespeare"
    "I"
    "From"
    "fairest"
    "creatures"
    "we"

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

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

Для подсчета слов, различающихся только по регистру как одно и то же слово, преобразуйте sonnetWords в нижний регистр. Например, The и the count как одно и то же слово. Поиск уникальных слов с помощью 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');

Figure contains an axes. The axes contains an object of type line.

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

wordsByFrequency(1:10)
ans = 10x1 string
    "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% текста.

См. также

| | | | | | | | | |

Связанные темы