Избежание пересечений в частоте и подсчете частоты документов в Quanteda

Вопрос или проблема

Ниже приведен демонстрационный корпус из 4 документов.

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

Слово ‘Австралийцы’ встречается в двух ключах словаря (peep, indig). Содержимое ключей должно быть взаимно исключающим.

Аналогично, ‘Австралия’ (oz и Australia Post), иностранные термины (foreign и multinat) и фермерские термины (dairy и farmers) встречаются в двух ключах словаря каждый, но их следует считать только один раз в соответствии со словарём.

Ожидаемая общая частота составляет (извлеченная из колонки ‘pattern’ таблицы kwic) и указана как x2 ниже. Обратите внимание, что слово индустрия встречается, но не выделяется в категорию индустии, так как оно определяется в ключе indig.

Дойная продукция является самой часто встречающейся категорией, встречающейся в трех документах. Это можно вычислить по уникальным строкам в колонке ‘doc names’ таблицы kwic для каждого ключа.

У меня три вопроса:

  1. Есть ли какие-либо проблемы/вопросы, которые могут повлиять на точность результата с использованием данного метода?
  2. Существует ли лучший/более экономичный подход для достижения того, что я пытаюсь сделать?
  3. Какой будет лучший способ извлечь эквивалент данных частоты подсчета tetxstat из таблицы kwic?
        library (quanteda)
        library(quanteda.textstats)

        txt <- c(doc1 = "Значительная часть всех ферм в Австралии - молочные. 
         Хотя в этой стране много молочных ферм, 
         это не крупнейшая отрасль сельского хозяйства. Жизнь фермера не легка, молочный 
        фермер должен быть ранним пташкой. ",
         doc2 = "Австралийцы любят молоко, поэтому здоровая молочная промышленность важна в 
         нашей стране",
         doc3 = "Молочные и овцеводческие фермы развивались за счет коренных 
         австралийцев. Более того, многие компании сейчас принадлежат иностранцам",
         doc4 = "Некоторые фермеры счастливы получать услуги от Australia Post. Почта 
         отправляется во многие иностранные страны и достигает быстрее, чем 
         доставляется в некоторых местах Австралии.")



         x <- x %>%
         tokens_compound(phrase("молочные фермеры"), concatenator = " ") %>%
         tokens_compound(phrase("молочные фермы"), concatenator = " ") %>%
         tokens_compound(phrase("молочная ферма"), concatenator = " ") %>%
         tokens_compound(phrase("молочное скотоводство"), concatenator = " ") %>%
         tokens_compound(phrase("молочная промышленность"), concatenator = " ") %>%
         tokens_compound(phrase("коренные австралийцы"), concatenator = " ") %>%
         tokens_compound(phrase("австралия пост"), concatenator = " ") %>%
         tokens_compound(phrase("молочный фермер"), concatenator = " ")
              x

         dict <- dictionary(list(multinat = c("иноземные нефтяные компании", "принадлежащие иностранцам", "иностранные", "иностранные компании", "мультинациональные", "мультинациональные нефтяные компании", "мультинционалы", "транснациональные"),
         dairy = c("молочные фермеры", "молочные фермы","молочная ферма","молочное скотоводство","молочная промышленность", "молочный фермер","молоко"),
         auspost = "австралия пост",
         oz = c("австралия", "эта страна", "наша страна"),
         farmers = c("фермеры", "фермер", "ферма", "фермы"),
         foreign = c("иностранный", "иностранец", "иностранцы"), 
         business =c("малый бизнес", "бизнес", "компании", "предприятия"),
         indig = c("абориген", "аборигены", "коренные австралийцы", "торресовцы"),
         peep = c("австралийцы", "люди австралии", "австралийский народ", "люди этой нации", "люди этой страны"),
         industry = c("индустрия", "индустрии")))

        kwicdict <- kwic(x, pattern = dict, window = 4)
        write.csv (kwicdict, "D:/Output/TEST.csv")

       DF <- read.csv("D://Output/TEST.csv",header=T)

       ## получение частотного подсчета значений 'pattern' таблицы KWIC
       > x2 <- DF[,8]
       > 
       > table (x2)
       x2
       auspost business    dairy  farmers  foreign    indig industry multinat  oz  peep    
          1        1        6        5        1        1        1        1     5    2 

Ответ или решение

Ответ на вопросы о вычислении частотности и частотности документов в Quanteda

1. Проблемы, влияющие на точность вывода

Одной из основных проблем, которая может повлиять на точность вывода, является перекрытие ключевых слов в словаре. Например, слова "Australians" могут встречаться в двух ключах (peep, indig), что приведет к дублирующемуся подсчету. Это означает, что фактическая частота слова может быть завышена, если не предусмотрены меры по исключению дублирующихся слов из подсчета. Также, если одно и то же слово встречается в различных формах (например, "farm" и "farmer"), его можно учесть несколько раз в разных ключах, что может исказить данные.

Кроме того, стоит обратить внимание на порядок применения функций в обработке текста. Ошибки в процессе компаундинга токенов могут привести к тому, что некоторые комбинации не будут учтены, тем самым снижая точность подсчетов.

2. Более простые подходы к достижению цели

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

  • Создание промежуточного векторизованного текста: Сначала можно создать обобщенный вектор, который объединяет все ключи, и подсчитывать частоты после создания токенов. Это позволит избежать сложности учета сходных терминов.

  • Пользовательские функции частотности: Можно написать пользовательскую функцию, которая будет проверять наличие слова в различных ключах и возвращать единичный подсчет только для одного из ключей, тем самым избегая дублирования.

  • Объединение ключей: Если некоторые ключи логически связаны или их можно объединить, это может уменьшить количество перекрывающихся токенов.

3. Получение данных о частоте текстостатов из таблицы KWIC

Для экстракции данных о частоте, аналогичных статистике TextStat, можно использовать следующие шаги:

# Подсчет уникальных документов для каждого ключа в таблице KWIC
library(dplyr)

# Получаем уникальные названия документов по каждому паттерну (ключу)
frequency_data <- DF %>%
  group_by(x2) %>%
  summarise(count = n_distinct(doc_name))

# Выводим результаты частотности
print(frequency_data)

Этот подход позволяет получить количество уникальных документов для каждого ключа, что даёт более точное представление о распространенности ключевых слов в корпусе. Составленный отчет будет содержать каждое ключевое слово с соответствующим количеством документов, что соответствует ожиданиям из вашего описания.

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

Оцените материал
Добавить комментарий

Капча загружается...