Вопрос или проблема
Ниже приведен демонстрационный корпус из 4 документов.
Словарь был разработан для определения частоты слов или фраз в корпусе, а также количества документов, в которых встречается слово или фраза.
Слово ‘Австралийцы’ встречается в двух ключах словаря (peep, indig). Содержимое ключей должно быть взаимно исключающим.
Аналогично, ‘Австралия’ (oz и Australia Post), иностранные термины (foreign и multinat) и фермерские термины (dairy и farmers) встречаются в двух ключах словаря каждый, но их следует считать только один раз в соответствии со словарём.
Ожидаемая общая частота составляет (извлеченная из колонки ‘pattern’ таблицы kwic) и указана как x2 ниже. Обратите внимание, что слово индустрия встречается, но не выделяется в категорию индустии, так как оно определяется в ключе indig.
Дойная продукция является самой часто встречающейся категорией, встречающейся в трех документах. Это можно вычислить по уникальным строкам в колонке ‘doc names’ таблицы kwic для каждого ключа.
У меня три вопроса:
- Есть ли какие-либо проблемы/вопросы, которые могут повлиять на точность результата с использованием данного метода?
- Существует ли лучший/более экономичный подход для достижения того, что я пытаюсь сделать?
- Какой будет лучший способ извлечь эквивалент данных частоты подсчета 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)
Этот подход позволяет получить количество уникальных документов для каждого ключа, что даёт более точное представление о распространенности ключевых слов в корпусе. Составленный отчет будет содержать каждое ключевое слово с соответствующим количеством документов, что соответствует ожиданиям из вашего описания.
В итоге предложенные методы обеспечивают надежный механизм для анализа текстов с учетом сложных взаимосвязей и исключений, что позволит избежать проблем с перекрытием и сократит сложность обработки.