删除 R 中具有特定标点符号的特定单词

标签 r string text-mining tm

我正在使用 R 开发一个语料库,其中包含俄语疑问句。

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

举例:

President. - Are you Nikolaj Khvostov?

为了分析这些询问,我想在这些名称出现在行首时(即,当它们用于识别说话者时)删除这些名称,但当它们出现在文本中间时则不删除(即,当说话者实际说出该名字时)。因此后面有一个特定的标点符号。

我尝试了以下代码:

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

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

但是没有任何内容被删除,如果我尝试:

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

总统和赫沃斯托夫的所有术语均已删除。但我需要在干预期间使用这些名称时使用它们。

我的意思是通过例子:

输入字符串:

President. - Are you Nikolaj Khvostov?

Khvostov. - Yes Mr. President.

所需输出:

Are You Nikolaj Khvostov?

Yes Mr. President.

第三个代码块生成的不需要的输出:

Are you Nikolaj?

Yes Mr..

这是我的数据示例:

用文字来完成很容易,但实际上我有超过 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"

))

最佳答案

有多种方法可以做到这一点。使用 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 = "")

关于删除 R 中具有特定标点符号的特定单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55241806/

相关文章:

r - 将很长的字符串中的数字提取到向量中

如果出错,重试 for-loop R 循环

r - 在 purrr 中处理不同长度的向量

r - 没有找到 ksvm 的预测函数?

string - PySerial 和 readline() 返回二进制字符串 - 转换为常规字母数字字符串?

c++ - 将 double 转换为具有超过 5 个十进制数字精度的字符串

r - 在 RStudio 中拆分扬声器和对话

ruby - Liblinear如何使用它

java - String.replaceAll 奇怪的行为

python - 如何计算段落中的单词数并排除一些单词(从文件中)?