Анализ текстовых данных со строковыми массивами
В этом примере показано, как сохранить текст из файла в виде массива строк, отсортировать слова по частоте их встречаемости, построить график и собрать базовую статистику по словам, найденным в файле.
Импорт текстового файла в массив строк
Прочитайте текст из «Сонет» Шекспира с помощью функции read()
. Она возвращает текст в виде вектора из 100266 символов.
sonnets = read("/user/start/examples/language_basics/analizetextdataexample/sonnets.txt", String)
sonnets[1:35]
Преобразуйте текст в строку с помощью string
функции. Затем разделите его на строки с помощью split()
. sonnets
становится массивом строк размером 2625 на 1, где каждая строка содержит одну строку из стихотворений. Отобразите первые пять строк sonnets
.
sonnets = string(sonnets)
sonnets = split(sonnets, "\n")
sonnets[1:5]
Строковый массив
Чтобы подсчитать частоту слов в sonnets
, сначала очистите его, удалив пустые строки и знаки препинания. Затем преобразуйте его в массив строк, содержащий отдельные слова в качестве элементов.
Удалите строки с нулевым количеством символов ("") из массива строк. Сравните каждый элемент sonnets с "", пустой строкой. Вы можете создавать строки, в том числе пустые, с помощью двойных кавычек. TF — это логический вектор, который содержит значение true везде, где sonnets
содержит строку с нулевым количеством символов. Индексируйте sonnets
с помощью TF и удалите все строки с нулевым количеством символов.
TF = sonnets .== ""
sonnets = sonnets[.!TF]
sonnets[1:10]
Замените некоторые знаки препинания пробелами. Например, замените точки, запятые и точки с запятой. Сохраните апострофы, потому что они могут быть частью некоторых слов в сонетах, например light's.
p = ['.','?','!',',',';',':'];
sonnets = replace.(sonnets[:],p=>" ")
Уберите начальные и завершающие символы пробела из каждого элемента массива sonnets
.
sonnets = strip.(sonnets[:],' ')
sonnets[1:10]
Разбить sonnets
на массив строк, элементами которого являются отдельные слова. Вы можете использовать split()
для разделения элементов массива строк по пробелам или по указанным вами разделителям. Однако split()
требует, чтобы каждый элемент массива строк был делим на равное количество новых строк. Элементы sonnets
имеют разное количество пробелов и, следовательно, не делятся на равное количество строк. Чтобы использовать split()
функцию для sonnets
, напишите цикл for, который вызывает split()
для одному элементу за раз.
Создайте массив строк sonnetWords
. Напишите цикл for, который разбивает каждый элемент sonnets
. Объедините выходные данные split()
с sonnetWords
. Каждый элемент sonnetWords
— это отдельное слово из sonnets.
sonnetWords = split(sonnets[1]);
for i = 2:length(sonnets)
sonnetWords = [sonnetWords ; split(sonnets[i])];
end
sonnetWords[1:10]
Сортировка массива по частоте
Найдите уникальные слова в sonnetWords. Подсчитайте их и отсортируйте по частоте встречаемости.
Чтобы считать слова, которые отличаются только регистром, одним и тем же словом, преобразуйте sonnetWords
в нижний регистр. Например, The и the считаются одним и тем же словом.
Подключите функции StatsBase
и Statistics
, далее будут использоваться функции из этих библиотек.
import Pkg;
Pkg.add("StatsBase")
Pkg.add("Statistics")
using Statistics, StatsBase
Чтобы сделать слова одного регистра - нижнего, используйте функцию lowercase
.
sonnetWords = lowercase.(sonnetWords)
Найдите уникальные слова с помощью функции unique()
. Также здесь применена функция сортировки от меньшего к болшего. Это сделано удобства дальнейшей работы.
words = sort(unique(sonnetWords))
Затем посчитайте, сколько раз встречается каждое уникальное слово, с помощью функции countmap()
. Она возвращает словарь, в котором каждое уникальное значение массива sonnetWords
сопоставляется с количеством его вхождений.
numOccurrences = sort(countmap(sonnetWords))
Отсортируйте слова в сонетах по количеству встречаемости, от наиболее распространенных до наименее распространенных.
rankOfOccurrences = sort(collect(values(numOccurrences)), rev = true)
Также запишем в массив индексы слов, которые которые отсортированы по количеству встречаемости. Для этого используйте sortperm()
.
rankIndex = sortperm(collect(values(numOccurrences)), rev = true)
Используя записанные индексы отсортированных по частоте слов, выведите 10 частовстречающихся слов в «Сонетах».
wordsByFrequency = words[rankIndex]
wordsByFrequency[1:10]
График частоты слов
Создайте график, отображающий частоту слов в «Сонетах», начиная с самых часто встречающихся и заканчивая наименее частыми. Согласно закону Ципфа, распределение частоты слов в обширном тексте следует степенному закону.
plot(rankOfOccurrences, xscale=:log10, yscale=:log10)
Соберем статистику в таблицу
Подсчитайте общее количество вхождений каждого слова в sonnetWords
. Подсчитайте количество вхождений в процентах от общего количества слов и вычислите кумулятивный процент от наиболее часто встречающихся слов к наименее часто встречающимся. Запишите слова и основные статистические данные по ним в таблицу.
using DataFrames
T = DataFrame();
T.Words = wordsByFrequency;
T.NumOccurrences = rankOfOccurrences;
T.PercentOfText = rankOfOccurrences / length(sonnetWords) * 100.0;
T.CumulativePercentOfText = cumsum(rankOfOccurrences) / length(sonnetWords) * 100.0;
T[1:10, :]
Вывод
Самое частое слово в «Сонетах» — and. Оно встречается 490 раз. В совокупности десять самых частотных слов составляют 20,163% текста.
Анализируя текст «Сонет», мы поработали с чтением данных из файла, сортировали и обрабатывали информацию, используя библиотеки статистики.