Этот пример показывает, как сохранить текст из файла как массив строк, отсортировать слова по их частоте, постройте график результата и соберите основные статистические данные для слов, найденных в файле.
Считайте текст из Сонетов Шекспира с функцией 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% текста.
histcounts
| соединение
| ниже
| замена
| вид
| разделение
| splitlines
| строка
| полоса
| таблица
| уникальный