Самоконфликтующие стоп-слова в интеллектуальном анализе текста RTM

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

С помощью пакета tm в R можно удалить стоп-слова, например, с помощью tm_map(myCorpus, removeWords, stopwords('english')). Само руководство tm демонстрирует использование stopwords("english")). Этот список слов содержит такие сокращения, как «я бы» и «я», а также очень распространенное слово «я»:

> library(tm)
> which(stopwords('english') == "i")
[1] 1
> which(stopwords('english') == "i'd")
[1] 69

(Предполагается, что перед удалением стоп-слов текст будет в нижнем регистре.)

Но (предположительно), поскольку «i» стоит первым в списке, сокращения никогда не удаляются:

> removeWords("i'd like a soda, please", stopwords('english'))
[1] "'d like  soda, please"

Быстрый хак — перевернуть список слов:

> removeWords("i'd like a soda, please", rev.default(stopwords('english')))
[1] " like  soda, please"

Другое решение — найти/составить лучший список слов.

Есть ли лучший/правильный способ использования стоп-слов («английский»)?


person Erik Wognsen    schedule 13.11.2014    source источник
comment
Вы можете проверить только слова, в которых есть ' removeWords("i'd like a soda, please", grep("'", stopwords(), value=TRUE))   -  person Rich Scriven    schedule 13.11.2014
comment
Спасибо @richard, это хороший обходной путь.   -  person Erik Wognsen    schedule 13.11.2014
comment
Без проблем. Я не совсем уверен, что есть другие правильные способы сделать это с помощью пакета tm.   -  person Rich Scriven    schedule 13.11.2014


Ответы (1)


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

В частности, i удаляется из i'm, потому что токенизатор разделяется на апостроф. В пакете анализа текста quanteda вам необходимо сначала разметить текст и только потом удалить функции на основе совпадений с токенами. Например:

require(quanteda)
removeFeatures(tokenize("i'd like a soda, please"), c("i'd", "a"))
# tokenizedText object from 1 document.
# Component 1 :
# [1] "like"   "soda"   ","      "please"

Quanteda также имеет встроенный список наиболее распространенных стоп-слов, так что это тоже работает (и здесь мы также удалили знаки препинания):

removeFeatures(tokenize("i'd like a soda, please", removePunct = TRUE),
               stopwords("english"))
# tokenizedText object from 1 document.
# Component 1 :
# [1] "like"   "soda"   "please"

По моему мнению (по общему признанию, предвзятому, поскольку я разработал квантэду), это лучший способ удалить стоп-слова в английском и большинстве других языков.

Обновление от января 2021 г. для более современной версии Quanteda.

require("quanteda")
## Loading required package: quanteda
## Package version: 2.1.2

tokens("i'd like a soda, please") %>%
  tokens_remove(c("i'd", "a"))
## Tokens consisting of 1 document.
## text1 :
## [1] "like"   "soda"   ","      "please"

# or using the stopwords list and removing punctuation
tokens("i'd like a soda, please", remove_punct = TRUE) %>%
  tokens_remove(stopwords("en"))
## Tokens consisting of 1 document.
## text1 :
## [1] "like"   "soda"   "please"

Создано 01 февраля 2021 г. с помощью пакета reprex (v1.0.0)

person Ken Benoit    schedule 23.11.2015