Анализируйте текстовые данные с помощью строковых массивов

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

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

Прочитайте текст из сонетов Шекспира с 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-loop, который вызывает split по одному элементу за раз.

Создайте пустые строковые массивы sonnetWords использование strings функция. Напишите цикл for-loop, который разделяет каждый элемент 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 считайте как то же слово. Найти уникальные слова используя 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% текста.

См. также

| | | | | | | | | |

Похожие темы