bagOfWords

Описание

Модель мешка слов (также известная как счетчик частоты терминов) регистрирует количество раз, когда слова появляются в каждом документе набора.

bagOfWords не разделяет текст на слова. Чтобы создать массив токенизированных документов, смотрите tokenizedDocument.

Создание

Описание

bag = bagOfWords создает пустую модель мешка слов.

пример

bag = bagOfWords(documents) считает слова, появляющиеся в documents и возвращает модель мешка слов.

пример

bag = bagOfWords(uniqueWords,counts) создает модель мешка слов, используя слова в uniqueWords и соответствующие счетчики частот в counts.

Входные параметры

расширить все

Входные документы, заданные как tokenizedDocument массив, строковые массивы слов или массив ячеек из векторов символов. Если documents не является tokenizedDocument Массив это должно быть вектор-строка, представляющее один документ, где каждый элемент является словом. Чтобы задать несколько документов, используйте tokenizedDocument массив.

Уникальный список слов, заданный как строковый вектор или массив ячеек из векторов символов. Если uniqueWords содержит <missing>, тогда функция игнорирует отсутствующие значения. Размер uniqueWords должен быть 1-by- V, где V - количество столбцов counts.

Пример: ["an" "example" "list"]

Типы данных: string | cell

Счетчики частот слов, соответствующих uniqueWords, заданный как матрица неотрицательных целых чисел. Значение counts(i,j) соответствует количеству раз, когда слово uniqueWords(j) появляется в i-м документе.

counts должно иметь numel(uniqueWords) столбцы.

Свойства

расширить все

Количество слов в документе, заданное как разреженная матрица.

Количество просматриваемых документов, заданное как неотрицательное целое число.

Количество слов в модели, заданное как неотрицательное целое число.

Уникальные слова в модели, заданные как строковый вектор.

Типы данных: string

Функции объекта

encodeЗакодируйте документы как матрицу счетчиков слов или n-граммов
tfidfTerm Frequency-Inverse Document Frequency (tf-idf) матрица
topkwordsСамые важные слова в модели мешка слов или теме LDA
addDocumentДобавьте документы в модель мешка слов или мешка n-граммов
removeDocumentУдалите документы из модели мешка слов или мешка n-граммов
removeEmptyDocumentsУдалите пустые документы из токенизированного массива документов, модели мешка слов или модели мешка n-граммов
removeWordsУдалите выбранные слова из документов или модели мешка слов
removeInfrequentWordsУдалите слова с низким количеством из модели мешка слов
joinОбъедините несколько моделей мешка слов или мешка n-граммов
wordcloudСоздайте график облака слов из текста, модели мешка слов, модели мешка n-граммов или модели LDA

Примеры

свернуть все

Загрузите данные примера. Файл sonnetsPreprocessed.txt содержит предварительно обработанные версии сонетов Шекспира. Файл содержит по одному сонету на линию со словами, разделенными пространством. Извлеките текст из sonnetsPreprocessed.txtразделите текст на документы в символах новой строки, а затем пометьте его токеном.

filename = "sonnetsPreprocessed.txt";
str = extractFileText(filename);
textData = split(str,newline);
documents = tokenizedDocument(textData);

Создайте модель мешка слов с помощью bagOfWords.

bag = bagOfWords(documents)
bag = 
  bagOfWords with properties:

          Counts: [154x3092 double]
      Vocabulary: [1x3092 string]
        NumWords: 3092
    NumDocuments: 154

Просмотрите 10 лучших слов и их общее количество.

tbl = topkwords(bag,10)
tbl=10×2 table
     Word      Count
    _______    _____

    "thy"       281 
    "thou"      234 
    "love"      162 
    "thee"      161 
    "doth"       88 
    "mine"       63 
    "shall"      59 
    "eyes"       56 
    "sweet"      55 
    "time"       53 

Создайте модель мешка слов с помощью строковых массивов уникальных слов и матрицы отсчётов слов.

uniqueWords = ["a" "an" "another" "example" "final" "sentence" "third"];
counts = [ ...
    1 2 0 1 0 1 0;
    0 0 3 1 0 4 0;
    1 0 0 5 0 3 1;
    1 0 0 1 7 0 0];
bag = bagOfWords(uniqueWords,counts)
bag = 
  bagOfWords with properties:

          Counts: [4x7 double]
      Vocabulary: [1x7 string]
        NumWords: 7
    NumDocuments: 4

Если ваши текстовые данные содержатся в нескольких файлах в папке, то можно импортировать текстовые данные в MATLAB с помощью file datastore.

Создайте файл datastore для текстовых файлов сонета в качестве примера. Примеры сонетов имеют имена файлов "exampleSonnetN.txt, "где N - номер сонета. Задайте функцию read, которая будет extractFileText.

readFcn = @extractFileText;
fds = fileDatastore('exampleSonnet*.txt','ReadFcn',readFcn)
fds = 
  FileDatastore with properties:

                       Files: {
                              ' .../tpd66a0468/textanalytics-ex73762432/exampleSonnet1.txt';
                              ' .../tpd66a0468/textanalytics-ex73762432/exampleSonnet2.txt';
                              ' .../tpd66a0468/textanalytics-ex73762432/exampleSonnet3.txt'
                               ... and 1 more
                              }
                     Folders: {
                              ' .../mlx_to_docbook5/tpd66a0468/textanalytics-ex73762432'
                              }
                 UniformRead: 0
                    ReadMode: 'file'
                   BlockSize: Inf
                  PreviewFcn: @extractFileText
      SupportedOutputFormats: [1x16 string]
                     ReadFcn: @extractFileText
    AlternateFileSystemRoots: {}

Создайте пустую модель мешка слов.

bag = bagOfWords
bag = 
  bagOfWords with properties:

          Counts: []
      Vocabulary: [1x0 string]
        NumWords: 0
    NumDocuments: 0

Закольцовывайте файлы в datastore и считывайте каждый файл. Токенизируйте текст в каждом файле и добавляйте документ в bag.

while hasdata(fds)
    str = read(fds);
    document = tokenizedDocument(str);
    bag = addDocument(bag,document);
end

Просмотрите обновленную модель мешка слов.

bag
bag = 
  bagOfWords with properties:

          Counts: [4x276 double]
      Vocabulary: [1x276 string]
        NumWords: 276
    NumDocuments: 4

Удалите стоповые слова из модели мешка слов, введя список стоповых слов в removeWords. Стоповыми словами являются такие слова, как «a», «the» и «in», которые обычно удаляются из текста перед анализом.

documents = tokenizedDocument([
    "an example of a short sentence" 
    "a second short sentence"]);
bag = bagOfWords(documents);
newBag = removeWords(bag,stopWords)
newBag = 
  bagOfWords with properties:

          Counts: [2x4 double]
      Vocabulary: ["example"    "short"    "sentence"    "second"]
        NumWords: 4
    NumDocuments: 2

Составьте таблицу наиболее частых слов модели мешка слов.

Загрузите данные примера. Файл sonnetsPreprocessed.txt содержит предварительно обработанные версии сонетов Шекспира. Файл содержит по одному сонету на линию со словами, разделенными пространством. Извлеките текст из sonnetsPreprocessed.txtразделите текст на документы в символах новой строки, а затем пометьте его токеном.

filename = "sonnetsPreprocessed.txt";
str = extractFileText(filename);
textData = split(str,newline);
documents = tokenizedDocument(textData);

Создайте модель мешка слов с помощью bagOfWords.

bag = bagOfWords(documents) 
bag = 
  bagOfWords with properties:

          Counts: [154x3092 double]
      Vocabulary: [1x3092 string]
        NumWords: 3092
    NumDocuments: 154

Найдите пять лучших слов.

T = topkwords(bag);

Найдите 20 лучших слов в модели.

k = 20;
T = topkwords(bag,k)
T=20×2 table
      Word      Count
    ________    _____

    "thy"        281 
    "thou"       234 
    "love"       162 
    "thee"       161 
    "doth"        88 
    "mine"        63 
    "shall"       59 
    "eyes"        56 
    "sweet"       55 
    "time"        53 
    "beauty"      52 
    "nor"         52 
    "art"         51 
    "yet"         51 
    "o"           50 
    "heart"       50 
      ⋮

Создайте Term Frequency-Inverse Document Frequency (tf-idf) матрицу из модели мешка слов.

Загрузите данные примера. Файл sonnetsPreprocessed.txt содержит предварительно обработанные версии сонетов Шекспира. Файл содержит по одному сонету на линию со словами, разделенными пространством. Извлеките текст из sonnetsPreprocessed.txtразделите текст на документы в символах новой строки, а затем пометьте его токеном.

filename = "sonnetsPreprocessed.txt";
str = extractFileText(filename);
textData = split(str,newline);
documents = tokenizedDocument(textData);

Создайте модель мешка слов с помощью bagOfWords.

bag = bagOfWords(documents)
bag = 
  bagOfWords with properties:

          Counts: [154x3092 double]
      Vocabulary: [1x3092 string]
        NumWords: 3092
    NumDocuments: 154

Создайте матрицу tf-idf. Просмотрите первые 10 строк и столбцов.

M = tfidf(bag);
full(M(1:10,1:10))
ans = 10×10

    3.6507    4.3438    2.7344    3.6507    4.3438    2.2644    3.2452    3.8918    2.4720    2.5520
         0         0         0         0         0    4.5287         0         0         0         0
         0         0         0         0         0         0         0         0         0    2.5520
         0         0         0         0         0    2.2644         0         0         0         0
         0         0         0         0         0    2.2644         0         0         0         0
         0         0         0         0         0    2.2644         0         0         0         0
         0         0         0         0         0         0         0         0         0         0
         0         0         0         0         0         0         0         0         0         0
         0         0         0         0         0    2.2644         0         0         0    2.5520
         0         0    2.7344         0         0         0         0         0         0         0

Загрузите данные примера. Файл sonnetsPreprocessed.txt содержит предварительно обработанные версии сонетов Шекспира. Файл содержит по одному сонету на линию со словами, разделенными пространством. Извлеките текст из sonnetsPreprocessed.txtразделите текст на документы в символах новой строки, а затем пометьте его токеном.

filename = "sonnetsPreprocessed.txt";
str = extractFileText(filename);
textData = split(str,newline);
documents = tokenizedDocument(textData);

Создайте модель мешка слов с помощью bagOfWords.

bag = bagOfWords(documents)
bag = 
  bagOfWords with properties:

          Counts: [154x3092 double]
      Vocabulary: [1x3092 string]
        NumWords: 3092
    NumDocuments: 154

Визуализируйте модель мешка слов с помощью облака слов.

figure
wordcloud(bag);

Figure contains an object of type wordcloud.

Если ваши текстовые данные содержатся в нескольких файлах в папке, то можно импортировать текстовые данные и создать модель мешка слов параллельно с помощью parfor. Если у вас установлены Parallel Computing Toolbox™, то parfor цикл проходит параллельно, в противном случае он запускается последовательно. Использование join объединить массив моделей мешков слов в одну модель.

Создайте модель мешка слов из набора файлов. Примеры сонетов имеют имена файлов "exampleSonnetN.txt, "где N - номер сонета. Получите список файлов и их местоположений с помощью dir.

fileLocation = fullfile(matlabroot,'examples','textanalytics','exampleSonnet*.txt');
fileInfo = dir(fileLocation)
fileInfo = 

  0x1 empty struct array with fields:

    name
    folder
    date
    bytes
    isdir
    datenum

Инициализируйте пустую модель мешка слов, а затем закольцовывайте файлы и создайте массив моделей мешка слов.

bag = bagOfWords;

numFiles = numel(fileInfo);
parfor i = 1:numFiles
    f = fileInfo(i);
    filename = fullfile(f.folder,f.name);
    
    textData = extractFileText(filename);
    document = tokenizedDocument(textData);
    bag(i) = bagOfWords(document);
end

Объедините модели мешка слов с помощью join.

bag = join(bag)
bag = 
  bagOfWords with properties:

          Counts: []
      Vocabulary: [1x0 string]
        NumWords: 0
    NumDocuments: 0

Совет

  • Если вы намерены использовать задержанный тестовый набор для своей работы, разделите текстовые данные перед использованием bagOfWords. В противном случае модель мешка слов может смещать ваш анализ.

Введенный в R2017b