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

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

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

Считайте текст из Сонетов Шекспира с 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 рассчитайте как то же слово. Найдите уникальные слова с помощью 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 object. The axes object 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% текста.

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

| | | | | | | | | |

Похожие темы