2015-12-15 6 views
1

У меня есть некоторые проблемы с bigram в области интеллектуального анализа текста с использованием R в последнее время. Цель состоит в том, чтобы найти значимые ключевые слова в новостях, например, «умный автомобиль» и «интеллектуальный анализ данных».Форма биграмм без стоп-слов в R

Скажем, если у меня есть строка выглядит следующим образом:

"IBM have a great success in the computer industry for the past decades..." 

После удаления стоп-слова ("есть", "а", "в", "в" и "на"),

"IBM great success computer industry past decades..." 

В результате будут возникать такие биграммы, как «компьютер успеха» или «прошлое промышленности».

Но мне действительно нужно, чтобы между двумя словами не существовало стоп-слов, таких как «компьютерная индустрия», является ярким примером биграма для того, что я хочу.

Часть моего кода ниже:

corpus <- tm_map(corpus, removeWords, stopwords("english")) 
corpus <- tm_map(corpus, stripWhitespace) 
corpus <- tm_map(corpus, stemDocument) 
NgramTokenizer = function(x) {unlist(lapply(ngrams(words(x), 2), paste, collapse = " "), use.names = FALSE)} 
dtm <- TermDocumentMatrix(corpus, control = list(tokenize = NgramTokenizer)) 

Есть ли способ, чтобы избежать результата со словами, как «успех компьютера» при подсчете ТФ?

+0

Может быть, вы можете сначала разделить ваше предложение к различным подразделам предложений по игнорируемых слов. Затем продолжим идентификацию биграмм. –

+0

@VenYao Как я могу разделить предложение на определенную функцию? текст, который я импортирую, используя readLines. Что делать, если текст представляет собой большое количество слов? Я боюсь за проблему с эффективностью. –

+0

используйте функцию 'strsplit'. Эта функция быстрая. –

ответ

2

Примечание: Редактировано 2017-10-12, чтобы отразить новый синтаксис кванты.

Вы можете сделать это в quanteda, который может удалить слова остановки из ngrams после того, как они были сформированы.

txt <- "IBM have a great success in the computer industry for the past decades..." 

library("quanteda") 
myDfm <- tokens(txt) %>% 
    tokens_remove("\\p{P}", valuetype = "regex", padding = TRUE) %>% 
    tokens_remove(stopwords("english"), padding = TRUE) %>% 
    tokens_ngrams(n = 2) %>% 
    dfm() 

featnames(myDfm) 
# [1] "great_success"  "computer_industry" "past_decades" 

Что он делает:

  1. Формы маркеров.
  2. Удаляет пунктуацию с использованием регулярного выражения, но оставляет пустые места, где они были удалены. Это гарантирует, что вы не будете создавать ngrams, используя маркеры, которые никогда не были смежными для начала, потому что они были разделены пунктуацией.
  3. Удаляет временные слова, также оставляя колодки на их месте.
  4. Формы биграмм.
  5. Создает матрицу свойств документа.

Чтобы получить количество этих биграмм, вы можете проверить DFM непосредственно, или использовать topfeatures():

myDfm 
# Document-feature matrix of: 1 document, 3 features. 
# 1 x 3 sparse Matrix of class "dfmSparse" 
#  features 
# docs great_success computer_industry past_decades 
# text1    1     1   1 

topfeatures(myDfm) 
# great_success computer_industry  past_decades 
#    1     1     1 
+0

Спасибо! Но как я могу интегрироваться с пакетом tm? Можно ли положить myDfm в TermDocumentMatrix, чтобы получить результат TF? Мой код находится внизу ссылки, которую я положил на GitHub. [мой код] (https://gist.github.com/anonymous/0afbbe82415b0a55cfb3) –

+0

** dtm <- TermDocumentMatrix (myDfm) ** –

+0

Что вы подразумеваете под «результатом TF»?'dfm()' создает матрицу свойств документа. Вы можете запрашивать верхние термины с помощью 'topfeatures (myDfm)' или напрямую производить операции над матрицей. –

 Смежные вопросы

  • Нет связанных вопросов^_^