В этом примере показано, как сохранить текст из файла как массив строк, отсортируйте слова по их частоте, постройте результат и соберите основные статистические данные для слов, найденных в файле.
Считайте текст из Сонетов Шекспира с 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
| join
| lower
| replace
| sort
| split
| splitlines
| string
| strip
| table
| unique