【问题标题】:Remove specific words with specific punctuation in R删除R中具有特定标点符号的特定单词
【发布时间】:2019-03-19 13:06:14
【问题描述】:

我正在研究一个包含俄语疑问句的 R 语料库。

在每个问题的开头都有发言者的姓名。

举例:

总统。 - 你是尼古拉·赫沃斯托夫吗?

为了对这些疑问句进行分析,我想在它们出现在行首时(即,当它们用于识别说话者时)删除这些名称,而不是在它们出现在文本中间时(即,当说话者实际说出那个名字时)。所以后面有一个特定的标点符号。

我尝试了以下代码:

corpus3 <- tm_map(corpus2, removeWords, c("Председатель. —", "Хвостов. -"))

corpus3 <- tm_map(corpus2, removeWords, c("President. —", "Khvostov. -"))

但没有任何东西被删除,如果我尝试:

corpus3 <- tm_map(corpus2, removeWords, c("President", "Khvostov"))

总统和赫沃斯托夫这两个词都被删除了。但我需要在干预期间使用这些名称。

我的意思是举例:

输入字符串:

总统。 - 你是尼古拉·赫沃斯托夫吗?

赫沃斯托夫。 - 是的,总统先生。

期望的输出:

你是尼古拉·赫沃斯托夫吗?

是的,总统先生。

第三个代码块产生的非预期输出:

你是尼古拉吗?

是的,先生。

我的数据有一个例子:

用文字很容易做到,但我实际上有 5000 多页的疑问要研究。 Word 无法在不使我的计算机崩溃的情况下打开文档。这就是为什么我希望有一个匹配的代码来帮助我。

我的数据作为大型 VCorpus 添加到 R 中

Председатель。 — Алексей Николаевич, вы уже были допрошены один раз 15 марта — не правда ли?

Хвостов。 — Да.

Председатель。 — Вам известно, что вы в заседании Чрезвычайной Следственной Комиссии?

Хвостов。 — Да.

Председатель。 — Я просил бы вас, не стесняясь рамками допроса, который с вас снят, рассказать нам все, что вам известно и как члену Государственной Думы и по должности министра внутренних дел, — о действиях бывших министров и прочих высших должностных лиц, расследованием действий которых мы заняты。 Нас интересует, конечно, и та тема, которую вы задели при показании, данном вами г. Коровиченко, 回复-е。 тема о тех кружках, которые стояли рядом с правительством или, быть может, позади его и оказывали известное влияние。 Эта тема подлежит углублению... В частности, мы просим вас остановиться на следующем: в своей деятельности министра внутренних дел испытывали ли вы, и в какой мере, и при каких обстоятельствах, — давление этих кружков, о которых вы уже давали показание? Вот канва… Благоволите начать.

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

Председатель。 — Я не понял вашу мысль… У нас не может быть здесь никаких тайн: вы не только в праве, но вы обязаны показать нам абсолютно все то, что вы знаете。

Хвостов。 — Кроме тех обязанностей, которые на меня возлагались по должности, я руководствовался долгом русского человека, потому что вопрос касался больного для меня места — я разумею вопрос о шпионаже…

Председатель。 — Не расскажете ли вы в такой последовательности: при каких обстоятельствах вы были назначены министром внутренних дел? Это — сперва… [3]

Хвостов。 — Может быть, вы мне разрешите взять более глубоко? Вы изволили сказать, что я должен показать то, что мне известно было раньше в качестве члена Государственной Думы… Уже издавна, в качестве члена Государственной Думы, я обратил внимание на немецкое влияние, которое, мне казалось, имелось в правительстве。 Язанялся...

Председатель。 — Вы когда обратили на это внимание?

Хвостов。 — Еще членом Государственной Думы, почти в самом начале прибытия моего в Петроград — в 1912 году…До этого для меня, как служившего в провинции, те или другие влияния на петроградские сферы должны были оставаться в стороне… Единственный раз, когда мне пришлось встретиться с Распутиным, — это было в Нижнем Новгороде, когда я был губернатором。 Ко мне приехал Распутин, мне в то время мало известный, о котором я слышал в виде толков, доходивших до провинции。 Он предложил мне место министра внутренних дел。 Было это, насколько я помню, — за неделю или дней за десять до убийства Столыпина。 Я был удивлен его появлением, не придавал ему такого значения, какое впоследствии обнаружилось… Я крайне удивился возможности ухода Столыпина, так как в провинции нам казалось, что Столыпин — сила непререкаемая, нам казалось невозможным, чтобы он колебался, шатался или уходил… Распутин объявил мне, что он должен поговорить со мной, так как он послан, как он сказал, — «посмотреть мою душу»…

Председатель。 — Кем послан?

Хвостов。 — Неопределенно: из Царского послан — посмотреть мою душу… Это казалось мне, в то время непосвященному, несколько смешным, и я с ним поговорил шутовским образом, а потом, через несколько времени, я послал полицмейстера свезти его на вокзал。 Распутин уехал...

Председатель。 — Вы говорите, вам показалось странным, что это происходило еще при жизни министра внутренних дел, — вы выразили сомнение по этому поводу?

Хвостов。 — Я выразил сомнение。 Он сказал, что Столыпин должен уйти。 Но, по правде сказать, я с ним серьезно не говорил... Я считал, что он одно из духовных развлечений в Царском Селе, но не считал серьезным, чтобы он мог иметь значение при назначении министров… Я знал, что в это время ко мне относился в высшей степени благосклонно бывший император Николай II... Его хорошие отношения ко мне завязались впервые, когда ябыл губернатором в Вологде и докладывал о возможности соединения вологодских рек с Сибирью чрез Урал。 На это обстоятельство я, главным образом, напираю。 Это его очень интересовало, я делал ему часто доклады, которые были более радужны, в смысле экономических перспектив, чем все остальное, что делалось в России в это время。 Вот этим я обратил на себя его внимание… [4]В предпоследний раз, перед указанным приездом Распутина, я был принят государем сидя, что считалось высшим знаком благоволения。 Разговор велся об общих предметах。

Председатель。 — А когда в последний раз перед этим визитом Распутина вы были в Царском?

Хвостов。 — Я с точностью не помню, но так месяца за полтора… Мне было известно от близких лиц, от иностранных посольств, что обо мне постоянно ведется разговор на охоте… Но этот самый приезд Распутина в высшей степени поразил меня, и я к нему отнесся не серьезно。 После этого мне пришлось быть уже в Царском...

Председатель。 — Алексей Николаевич, вы говорите, что ваше отношение к этому приезду было отрицательным; но это не избавляет нас от необходимости несколько подробнее остановиться на нем: только ли для этого приезжал Распутин?

Хвостов。 — Исключительно для этого。

Председатель。 — Какой еще разговор был между вами?

Хвостов。 — Разговор исключительно этот。 Он сказал: «Приехал посмотреть твою душу»…

Председатель。 — Т.-е. только эти несколько слов?

Хвостов。 — Он изъявил еще желание посмотреть мою семью… Моей семьи еще не было… Я считал излишним вводить его в мою семью。 Я не серьезно к этому отнесся... Тут была ярмарка: она кончалась。 Мне было не до того, чтобыбеседоватьсним。 Я отнесся к этому в высшей степени легко… Когда, через месяц после этого, я приехал сюда, то я увидел ко мне совершенно обратное отношение。 Я был принят в высшей степени неприязненно, в высшей степени сухо, что, после предшествующих приемов, мне показалось неособенно приятным。 Это послужило основанием тому, что тогда казалось странным: я ушел из губернии, пошел в Государственную Думу… Уйти я сразу не мог, прошло порядочное время, около года: но во всяком случае, в этот промежуток времени, я делал все возможное, чтобы попасть в Государственную Думу по Орловской губернии, и уже все мои мысли были за то, чтобы уйти, — видя, что здесь мне отрезаны все дальнейшие пути...

Председатель。 — Что же, уезжая, Распутин какие-нибудь угрозы делал по вашему адресу?

Хвостов。 — Болтал по обыкновению: говорил, что он уже обо мне послал телеграмму。

Председатель。 — Какого содержания?

Хвостов。 — Содержания совершенно не помню в подробностях… Мне потом достали текст (всегда на почте есть свои люди, которые сообщают потом подробное содержание)。 Но я текста не помню.

Председатель。 — Приблизительно, какого содержания? [5]

Хвостов。 — Отрицательное ко мне отношение… Что-то такое: «Хотя бог на нем почиет, но чего-то не достает»...

Председатель。 — Скажите еще: он вам говорил, от чьего имени из Царского Села он являлся — от отрекшегося государя или от государыни?

我的代码的开头:

## Package ##
library(tm)
library(NLP)
library(slam)
library(FactoMineR)
library(explor)
library(R.temis)
library(zoo)
library(lattice)
library(RcmdrPlugin.temis)
library(tidyverse)

## Importation du corpus

corpus <- import_corpus("./data/CorpusPadenie", format = "txt", language = "ru")

## Importation metadonnees

don <- read.csv2("./data/2019_PDI_M1_MEM_DATA_DOP.csv")

## Association des metadonnees et du corpus

corpus <- set_corpus_variables(corpus, don)
corpus

## Creation d'une copie de secours

corpus2 <- corpus

### Suppression des mots inutiles ###

## Suppressions des noms des intervenants - pour pouvoir identifier les noms utiliser dans les interogatoires - suprressions des seuls intervenants possible du fait de la mise en page.


corpus3 <- tm_map(corpus2, removeWords, c("Председатель. —", "Хвостов"))
removeWords(corpus2[[1]], character(c("Председатель. —", "Хвостов. —")))
corpus2[[1]]
removeWords(corpus2[[1]], "Председатель")


writeCorpus(corpus2, path = "./data/Test", filenames = NULL)

dput(head(corpus2)) 的最后一部分结果

 "1917_08_21_TCHESSKA_7_79_POK_F_A_GOLOVIN.txt", "1917_08_25_TCHESSKA_7_80_DOP_A_A_POLIVANOV.txt", 
"1917_08_25_TCHESSKA_7_81_DOP_V_N_KOKOVTSOV.txt", "1917_09_04_TCHESSKA_7_83_DOP_M_V_RODZIANKO.txt", 
"1917_09_20_TCHESSKA_7_84_DOP_A_A_POLAVINOV.txt", "1917_09_27_TCHESSKA_7_85_DOP_N_B_CHTCHERBATOV.txt", 
"1917_09_27_TCHESSKA_7_86_POK_A_P_LEDNITSKIJ.txt", "1917_10_11_TCHESSKA_7_87_DOP_A_B_LIADOV.txt", 
"1917_10_11_TCHESSKA_7_88_DOP_D_S_CHOUVAEV.txt"), class = "factor"), 
    int_id = structure(1:6, .Label = c("1", "2", "3", "4", 
    "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", 
    "15", "16", "17", "18", "19", "20", "21", "22", "23", 
    "24", "25", "26", "27", "28", "29", "30", "31", "32", 
    "33", "34", "35", "36", "37", "38", "39", "40", "41", 
    "42", "43", "44", "45", "46", "47", "48", "49", "50", 
    "51", "52", "53", "54", "55", "56", "57", "58", "59", 
    "60", "61", "62", "63", "64", "65", "66", "67", "68", 
    "69", "70", "71", "72", "73", "74", "75", "76", "77", 
    "78", "79", "80", "81", "82", "83", "84", "85", "86"), class = "factor"), 
    ind_id = structure(1:6, .Label = c("1", "2", "3", "4", 
    "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", 
    "15", "16", "17", "18", "19", "20", "21", "22", "23", 
    "24", "25", "26", "27", "28", "29", "30", "31", "32", 
    "33", "34", "35", "36", "37", "38", "39", "40", "41", 
    "42", "43", "44", "45", "46", "47", "48", "49", "50", 
    "51", "52", "53", "54", "55", "56", "57", "58", "59", 
    "60"), class = "factor"), ind_nom = structure(c(23L, 
    24L, 43L, 22L, 52L, 9L), .Label = c("Andronikov", "Beletskij", 
    "Belyaev", "Bourtsev", "Chingerev", "Chouvaev", "Chtcheglovitov", 
    "Chtcherbatov", "Chtiourmer", "Djounkovskij", "Dobrovilskij", 
    "Doubenskij", "Frederiks", "Golitsyn", "Golovin", "Goremykin", 
    "Goutchkov", "Guerassimov", "Ignatev", "Ivanov", "Kafafov", 
    "Khabalov", "Khvostov", "Klimovitch", "Kokovtsov", "Komissarov", 
    "Kourlov", "Kryjanovskij", "Lednitskij", "Liadov", "Lodyjenskij", 
    "Lokhtina", "Makarov", "Maklakov", "Manassievitch-Manoujlov", 
    "Markov", "Milioukov", "Naoumov", "Neratov", "Pleve", 
    "Pokrovskij", "Polivanov", "Protopopov", "Rejn", "Rejnbot", 
    "Rodzianko", "Spiridovitch", "Tchaplin", "Tchelnokov", 
    "Tchkhejdze", "Trousevitch", "Vassiliev", "Velepolskij", 
    "Verevkin", "Vissarionov", "Voejkov", "Volkonskij", "Vyroubova", 
    "Zolotarev"), class = "factor"), ind_initiales = structure(c(5L, 
    12L, 3L, 39L, 7L, 9L), .Label = c("AA", "AB", "AD", "AI", 
    "AN", "AP", "AT", "AV", "BV", "DN", "DS", "EK", "FA", 
    "GE", "IF", "IG", "IL", "IM", "IN", "KD", "MA", "MI", 
    "MM", "MS", "MV", "NB", "ND", "NE", "NI", "NN", "NS", 
    "NV", "OA", "PG", "PN", "SE", "SI", "SP", "SS", "VB", 
    "VF", "VL", "VM", "VN"), class = "factor"), int_mois = structure(c(1L, 
    1L, 1L, 1L, 1L, 1L), .Label = c("3", "4", "5", "6", "7", 
    "8", "9", "10"), class = "factor"), int_jour = structure(c(15L, 
    16L, 18L, 19L, 19L, 19L), .Label = c("1", "2", "4", "6", 
    "7", "8", "9", "10", "11", "12", "13", "14", "15", "17", 
    "18", "19", "20", "21", "22", "24", "25", "26", "27", 
    "28", "29", "30", "31"), class = "factor"), int_tome = structure(c(1L, 
    1L, 1L, 1L, 1L, 1L), .Label = c("1", "2", "3", "5", "6", 
    "7"), class = "factor"), int_num = structure(1:6, .Label = c("1", 
    "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", 
    "13", "14", "15", "16", "17", "18", "19", "20", "21", 
    "22", "23", "24", "25", "26", "27", "28", "29", "30", 
    "31", "32", "33", "34", "35", "36", "37", "38", "39", 
    "40", "41", "42", "44", "45", "46", "47", "48", "49", 
    "50", "51", "52", "53", "54", "55", "56", "57", "58", 
    "59", "60", "61", "62", "63", "64", "65", "66", "67", 
    "68", "69", "70", "71", "72", "73", "74", "75", "76", 
    "77", "78", "79", "80", "81", "83", "84", "85", "86", 
    "87", "88"), class = "factor"), dop_pok = structure(c(1L, 
    1L, 1L, 1L, 1L, 1L), .Label = c("DOP", "POK"), class = "factor")), row.names = c(NA, 
6L), class = "data.frame")), class = c("VCorpus", "Corpus"

))

【问题讨论】:

  • 您能否使用dput 分享您的语料库的相关样本,以使其成为可重复的示例?在不了解数据结构的情况下很难测试解决方案。
  • Hiho Léo,您可以尝试使用正则表达式。像这样:gsub("^.*\\.", "", "president.president.president"). "^.*\\." 从字符串的开头开始(由 ^ 表示)并接受任何字符,直到找到一个点后跟空格。这个子字符串被一个空字符串替换。您可以在将字符串转换为语料库之前使用 gsub,也可以直接在语料库上的 content_transformer 中使用 gsub。但注意不要在之前删除标点符号:)
  • Remove part of a string的可能重复
  • 对不起,我不知道什么是 dput。我添加了其中一个疑问句的一部分。
  • 请包含dput(head(corpus2)) 的结果。粘贴的大块文本对于 R 中的数据结构提供的信息并不多。

标签: r string text-mining tm


【解决方案1】:

有几种方法可以做到这一点。使用 sub 只会将第一个匹配项替换为您指定的任何内容。 gsub 将替换每个实例。您还可以查看包stringi,它具有用于此类任务的多个功能。下面的示例匹配第一个破折号之前的所有内容(后面有一个空格)并将其替换为“”。如果您想更加保守,您可以删除之后的空格并使用trimws 如果在第一个破折号之后存在不一致的间距模式。

sub((".* \\- "), "", c("President. - Are you Nikolaj Khvostov?", "Khvostov. - Yes Mr. President."))
[1] "Are you Nikolaj Khvostov?" "Yes Mr. President."   

编辑:

如果没有更好地理解您的数据,我们只是在猜测,这就是为什么在 R 中提供数据示例非常有帮助。但是,理论上,这些解决方案可能会根据您的数据结构起作用。

如果它是一个列表,这应该可以:

text_as_list <- list("President. — Are you Nikolaj Khvostov?", "Khvostov. — Yes Mr. President.")

lapply(text_as_list, sub, pattern = "^.* \\— ", replacement = "")
[[1]]
[1] "Are you Nikolaj Khvostov?"

[[2]]
[1] "Yes Mr. President."

如果它是一个长向量,这应该可以工作(现在使用gsub):

long_vector <- c("President. — Are you Nikolaj Khvostov?\nKhvostov. — Yes Mr. President.")

cat(long_vector)
President. — Are you Nikolaj Khvostov?
Khvostov. — Yes Mr. President.

long_vector_fixed <- gsub(("Khvostov. \\— "), "", gsub(("President. \\— "), "", long_vector))

cat(long_vector_fixed)

Are you Nikolaj Khvostov?
Yes Mr. President.

使用您正在使用的tm_map 函数的可能解决方案:

tm_map(corpus2, sub, pattern = "^.* \\— ", replacement = "")

【讨论】:

  • 它没有用。我认为它适用于一些小文本......但我有超过 5000 页......
  • @Leo Henry,您的文本是否都在一个向量中?即,您粘贴的文本是否全部在数据框的一列中?或者 vcorpus 是一个列表,其中每个语句都是列表中的一个新元素?你能做到str(corpus)dput(head(corpus))
  • 这是一个大型的 VCorpus
  • 您的建议不起作用,因为它使 corpus2 成为“大字符”,并且要研究它们,我需要使用 VCorpus...
  • 看起来dput 可能不完整。至少,我无法将其复制/粘贴到我的控制台中。抱歉,Leo,事实证明这很困难。
【解决方案2】:

就像在 cmets 中所说的那样 - 不了解您的数据结构会使帮助您变得更加困难。在下面的示例中,我在第一步中创建了一些示例数据。

library(tidyverse)    

#Create some sample data
data <- tibble(
  text = c("President. - Are you Nikolaj Khvostov?",
           "Khvostov. - Yes Mr. President."))

#A print of the sample data
data

#Create a variable called "new_text" using the mutate() function
#The function str_remove() from the stringr package is used to remove the unwnted elements

data %>% 
  mutate(
    new_text = str_remove(text, pattern = "^[a-zA-Z]+\\. -"))

【讨论】:

  • 它没有用。我认为它只适用于一些小文本......但我有超过 5000 页......
  • UseMethod("mutate_") 中的错误 : pas de méthode pour 'mutate_' applicable pour un objet de classe "c('VCorpus', 'Corpus')"
  • 将数据导入 R 后的外观如何?它是一根长弦,还是分成多个较小的弦?从您对问题所做的更新中,我真的无法判断这一点。您能否创建一个最小示例来重现数据导入 R 后的结构?
  • 该错误听起来更像是拼写错误。请检查代码中的括号,或粘贴产生错误的代码。
【解决方案3】:

替换字符串的 R 函数是 gsub("Pattern_to_find", "replacement", string_vector_to_work_on)。 干杯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 2022-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多