小编Ken*_*oit的帖子

如何从R中的ngram标记列表中有效地删除停用词

这是一个更好的方法来做一些我已经无法做到的事情的吸引力:使用"停用词"过滤一系列n-gram标记,以便n-gram中任何停用词术语的出现触发删除.

我非常希望有一个解决方案适用于unigrams和n-gram,虽然可以有两个版本,一个带有"固定"标志,另一个带有"正则表达式"标志.我将这个问题的两个方面放在一起,因为有人可能有一个解决方案尝试一种解决固定和正则表达式停用词模式的不同方法.

格式:

  • 标记是一个字符向量列表,可以是unigrams,也可以是由_(下划线)字符连接的n-gram .

  • 停用词是一个字符向量.现在我满足于让它成为一个固定的字符串,但是能够使用正则表达式格式化的停用词实现它将是一个很好的奖励.

期望输出:与输入标记匹配但与任何组件标记匹配的字符列表被删除.(这意味着unigram匹配,或与n-gram包含的术语之一匹配.)

构建的示例,测试数据以及工作代码和基准:

tokens1 <- list(text1 = c("this", "is", "a", "test", "text", "with", "a", "few", "words"), 
                text2 = c("some", "more", "words", "in", "this", "test", "text"))
tokens2 <- list(text1 = c("this_is", "is_a", "a_test", "test_text", "text_with", "with_a", "a_few", "few_words"), 
                text2 = c("some_more", "more_words", "words_in", "in_this", "this_text", "text_text"))
tokens3 <- list(text1 = c("this_is_a", "is_a_test", "a_test_text", "test_text_with", "text_with_a", "with_a_few", "a_few_words"),
                text2 = c("some_more_words", "more_words_in", "words_in_this", "in_this_text", "this_text_text"))
stopwords <- c("is", …
Run Code Online (Sandbox Code Playgroud)

performance r text-analysis stop-words n-gram

20
推荐指数
1
解决办法
3146
查看次数

如何索引矢量序列中的矢量序列

我有一个问题的解决方案涉及循环,并且工作,但我觉得我错过了一些涉及更有效的实现.问题:我有一个数字向量序列,并想要识别第一个向量的另一个向量中的起始位置.

它的工作原理如下:

# helper function for matchSequence
# wraps a vector by removing the first n elements and padding end with NAs
wrapVector <- function(x, n) {
    stopifnot(n <= length(x))
    if (n == length(x)) 
        return(rep(NA, n))
    else
        return(c(x[(n+1):length(x)], rep(NA, n)))
}

wrapVector(LETTERS[1:5], 1)
## [1] "B" "C" "D" "E" NA
wrapVector(LETTERS[1:5], 2)
## [1] "C" "D" "E" NA  NA

# returns the starting index positions of the sequence found in a vector
matchSequence <- function(seq, vec) {
    matches <- seq[1] …
Run Code Online (Sandbox Code Playgroud)

performance r vector

11
推荐指数
4
解决办法
1030
查看次数

如何让Rcpp和BH(Boost标头)与regex_replace for Windows build一起使用

我正在使用优秀的Rcpp项目在R中实现一些更快的文本处理,但无法在Windows下正确构建包.(它在OS X和Linux下构建得很好.)我正在使用Rcpp和BH头包.我可以在http://gallery.rcpp.org/articles/boost-regular-expressions/上找到示例,我可以获得以下代码,以构建除Windows之外的所有平台.

为了解决我的问题,我将其从较大的包中删除,并将其放入一个简单的包中,以便可以使用它安装devtools::install_github("kbenoit/boostTest").

文件是:

Makevars.win:

PKG_LIBS = -lboost_regex
Run Code Online (Sandbox Code Playgroud)

src/clean.cpp:

#include <Rcpp.h>
#include <string>
#include <boost/regex.hpp>

// [[Rcpp::depends(BH)]]

const boost::regex re_digits("[[:digit:]]");
const boost::regex re_punct("[[:punct:]]");
const std::string space0("");

std::string removeDigits(const std::string& s) {
    return boost::regex_replace(s, re_digits, space0, boost::match_default | boost::format_sed);
}

std::string removePunct(const std::string& s) {
    return boost::regex_replace(s, re_punct, space0, boost::match_default | boost::format_sed);
}


// [[Rcpp::export]]
Rcpp::DataFrame cleanCpp(std::vector<std::string> str) {
    int n = str.size();
    for (int i=0; i<n; i++) {
        str[i] = removeDigits(str[i]);
        str[i] = removePunct(str[i]); …
Run Code Online (Sandbox Code Playgroud)

boost r rcpp

6
推荐指数
0
解决办法
661
查看次数

vapply()可以与可变长度的FUN.VALUE一起使用吗?

我正在尝试遵循良好的做法并使用它vapply()而不是sapply()内部函数,但是vapply()在想要固定长度时发现类型检查过于僵硬。

假设我想要这样的东西:

list1 <- list(l1_one = 1:3, l1_two = letters[1:3])
list2 <- list(l2_one = 4:6, l2_two = letters[4:6], l2_three = 10:12)
list_12 <- list(list1, list2)

sapply(list_12, names)
# [[1]]
# [1] "l1_one" "l1_two"
# 
# [[2]]
# [1] "l2_one"   "l2_two"   "l2_three"
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以允许可变长度,但是要检查返回值是否为“字符”模式,并且长度至少为一个?显然这不起作用:

vapply(list_12, names, character(2))
# Error in vapply(list_12, names, character(2)) : values must be length 2,
# but FUN(X[[2]]) result is length 3
Run Code Online (Sandbox Code Playgroud)

r sapply

6
推荐指数
1
解决办法
1199
查看次数

R中的希伯来语编码地狱并在Windows中编写UTF-8表

我正在尝试保存RSeleniumhttps://www.magna.isa.gov.il/Det​​ails.aspx?l=he中提取的数据,但是虽然R成功将希伯来字符打印到控制台,但在导出TXT时却没有CSV或在其他简易R的功能,如data.frame(),readHTMLTable()

这是一个例子.

> head(lines)
[1] "????? ????? ?'?.??. 2 ??\"? ?????? ?????? ????? ???? ???\"?"
[2] "513435404"                                                  
[3] ""                                                           
[4] ""                                                           
[5] ""                                                           
[6] "4,481" 
Run Code Online (Sandbox Code Playgroud)

使用时,第一行更改为奇怪的字符(下面) data.frame()

> head(as.data.frame(lines))
[1] <U+05D2><U+05DC><U+05D5><U+05D1><U+05DC> <U+05E4><U+05D9><U+05E0><U+05E0><U+05E1> <U+05D2>'<U+05D9>.<U+05D0><U+05E8>. 2 <U+05D1><U+05E2>"<U+05DE> <U+05E0><U+05EA><U+05D5><U+05E0><U+05D9><U+05DD> <U+05DB><U+05E1><U+05E4><U+05D9><U+05D9><U+05DD> <U+05D1><U+05D0><U+05DC><U+05E4><U+05D9> <U+05D3><U+05D5><U+05DC><U+05E8> <U+05D0><U+05E8><U+05D4>"<U+05D1>
Run Code Online (Sandbox Code Playgroud)

通过write.table或导出.TXT或.CSV时也会发生同样的情况write.csv:

write.csv(lines,"lines.csv",row.names=FALSE)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我尝试将编码更改为"UTF-8",就像在几个相似的问题中所建议的那样,但问题仍然是以不同的格式:

iconv(lines, to = "UTF-8")
1 ?’??•?‘? ???™? ? ?¡ ?’'?™.??¨. 2 ?‘?¢"? ? ?×?•? ?™? ?›?¡???™?™? ?‘?????™ ?“?•??¨ ??¨?”"?‘
Run Code Online (Sandbox Code Playgroud)

希伯来语ISO-8859-8也是如此:

iconv(lines, to = "ISO-8859-8")
    1 …
Run Code Online (Sandbox Code Playgroud)

encoding text r hebrew

5
推荐指数
1
解决办法
2568
查看次数

为什么对列表进行分类会减慢length()函数的速度?

我刚刚注意到,通过向class属性添加附加标签(S3)或定义新的父类(S4)来对列表进行分类会大大减慢基本lengths()操作的速度.

这表明我应该在打电话之前总是取消"分类列表" lengths().

任何人都可以

  1. 解释为什么会发生这种情况,和/或

  2. 建议一个更好的解决方案(或解释为什么这并不重要,因为差异只是绝对数字的微秒).

可重现的代码:

# create a list of 1,000 elements with variable letter lengths
mylist <- list()
length(mylist) <- 1000
set.seed(99)
mylist <- lapply(mylist, function(x) sample(LETTERS, size = sample(1:100, size = 1), 
                                            replace = TRUE))

# create an S3 "classed" version
mylist_S3classed <- mylist
class(mylist_S3classed) <- c("myclass", "list")

# create an S4 classed version
setClass("mylist_S4class", contains = "list")
mylist_S4classed <- new("mylist_S4class", mylist)

# compare timings of lengths
microbenchmark::microbenchmark(lengths(mylist),
                               lengths(mylist_S3classed), 
                               lengths(mylist_S4classed),
                               unit …
Run Code Online (Sandbox Code Playgroud)

performance r

4
推荐指数
1
解决办法
68
查看次数

为什么 Build &amp; Reload 会重新编译所有 C++ 文件,即使这些文件没有更改?

我在两台机器上使用 RStudio,具有相同的配置,甚至具有相同的 .Rproj 文件(来自 Dropbox)。

RStudio 网页

增量重建

默认情况下,RStudio 执行包的增量重建。C++ 文件仅在更改或任何头文件更改时才会重新编译。这为增量开发提供了快速周转。

在一台机器上,如果我修改一个简单的 .R 文件,或者即使我根本不修改任何文件,并选择Build & Reload,那么 C++ 不会重新编译。

然而,另一方面,我得到:

没有更改文件的情况下:

==> devtools::document(roclets=c('rd', 'collate', 'namespace', 'vignette'))

Updating quanteda documentation
Loading quanteda
'/Library/Frameworks/R.framework/Resources/bin/R' CMD INSTALL '/Users/kbenoit/Dropbox (Personal)/GitHub/quanteda' --library='/var/folders/46/zfn6gwj15d3_n6dhyy1cvwc00000gp/T//RtmpowXjeu/devtools_install_cd475c156859' --no-R --no-data --no-help --no-demo --no-inst --no-docs --no-exec --no-multiarch --no-test-load --preclean
Re-compiling quanteda
clang++ -std=c++11 -I/Library/Frameworks/R.framework/Resources/include -DNDEBUG -I. -I/usr/local/include -I/usr/local/include/freetype2 -I/opt/X11/include -I"/Library/Frameworks/R.framework/Versions/3.3/Resources/library/Rcpp/include" -I"/Library/Frameworks/R.framework/Versions/3.3/Resources/library/RcppParallel/include" -I"/Library/Frameworks/R.framework/Versions/3.3/Resources/library/RcppArmadillo/include"   -fPIC  -Wall -mtune=core2 -g -O2 -c RcppExports.cpp -o RcppExports.o
Run Code Online (Sandbox Code Playgroud)

ETC

更改了一个.R文件:(
这是一个数据文档R文件,没有实际功能)

==> Rcpp::compileAttributes()

* …
Run Code Online (Sandbox Code Playgroud)

rcpp rstudio roxygen2

4
推荐指数
1
解决办法
810
查看次数

Quanteda 包,朴素贝叶斯:如何预测不同特征的测试数据?

我曾经quanteda::textmodel_NB创建一个模型,将文本分为两类之一。我将模型拟合到去年夏天的训练数据集上。

现在,我试图在今年夏天使用它来对我们在工作中获得的新文本进行分类。我尝试这样做并收到以下错误:

Error in predict.textmodel_NB_fitted(model, test_dfm) : 
feature set in newdata different from that in training set
Run Code Online (Sandbox Code Playgroud)

可以在此处的第 157 至 165 行找到生成错误的函数中的代码

我认为这是因为训练数据集中的单词与测试数据集中使用的单词不完全匹配。但是为什么会出现这个错误呢?我觉得好像——在现实世界的例子中有用——模型应该能够处理包含不同特征的数据集,因为这在应用中很可能总是发生。

所以我的第一个问题是:

1. 这个错误是朴素贝叶斯算法的一个属性吗?还是函数的作者选择这样做?

这让我想到了我的第二个问题:

2. 我该如何解决这个问题?

为了解决第二个问题,我提供了可重现的代码(最后一行生成了上面的错误):

library(quanteda)
library(magrittr)
library(data.table)

train_text <- c("Can random effects apply only to categorical variables?",
                "ANOVA expectation identity",
                "Statistical test for significance in ranking positions",
                "Is Fisher Sharp Null Hypothesis testable?",
                "List major reasons for different results from survival analysis among different studies",
                "How do the …
Run Code Online (Sandbox Code Playgroud)

r text-analysis naivebayes quanteda

3
推荐指数
1
解决办法
1252
查看次数

使用 Quanteda 语料库识别名词

我正在使用 Ken Benoit 和 Paul Nulty 的 quanteda 包来处理文本数据。

我的语料库包含带有完整德语句子的文本,我只想处理每个文本的名词。德语中的一个技巧是只使用大写单词,但这会在句子的开头失败。

Text1 <- c("Halle an der Saale ist die grünste Stadt Deutschlands")
Text2 <- c("In Hamburg regnet es immer, das ist also so wie in London.")
Text3 <- c("James Bond trinkt am liebsten Martini")

myCorpus <- corpus(c(Text1, Text2, Text3))
metadoc(myCorpus, "language") <- "german"
summary(myCorpus, showmeta = T)

myDfm <- dfm(myCorpus,  tolower = F, remove_numbers = T, 
                remove = stopwords("german"), remove_punct = TRUE, 
                    remove_separators = T)

topfeatures(myDfm, 20) 
Run Code Online (Sandbox Code Playgroud)

从这个最小的例子中,我想检索:“Halle”、“Saale”、“Stadt”、“Deutschland”、“Hamburg”、“London”、“Martini”、“James”、“Bond”。

我假设我需要一本字典,它定义了动词/名词/等。和专有名词(James Bond、Hamburg 等),或者是否有内置函数/字典? …

r spacy quanteda

3
推荐指数
1
解决办法
1268
查看次数

如何在R中使用Group By和order函数

我有一个包含120000条记录和19个变量的数据框,其中2个是state和MonthlyIncome.

我必须创建一个新的数据集,其中包含来自每个州的前10名(月收入)客户.

我尝试了很多选项,包括data.table和dplyr以及base,但总会有一些缺失.

data.table:

 x <- customer_any_360[,order(-dense_rank(MonthlyIncome))[1:10], by = state]
Run Code Online (Sandbox Code Playgroud)

---我试过的例子

有人可以请求帮助,我仍然是R的新手并且真的在努力解决这个问题.提前致谢!!

sorting group-by r data.table

2
推荐指数
1
解决办法
3745
查看次数

如何使用 quanteda 进行命名实体识别 (NER)?

有一个带文本的数据框

df = data.frame(id=c(1,2), text = c("My best friend John works and Google", "However he would like to work at Amazon as he likes to use python and stay at Canada")
Run Code Online (Sandbox Code Playgroud)

无需任何预处理

怎么可能像这样提取名称实体识别

示例结果词

dfresults = data.frame(id=c(1,2), ner_words = c("John, Google", "Amazon, python, Canada")
Run Code Online (Sandbox Code Playgroud)

r quanteda

2
推荐指数
1
解决办法
877
查看次数

情绪计算的公式是什么

使用情绪评级词典来计算情绪的实际公式是什么.我使用的词典包含-5到5之间的等级.我想计算单个句子的情绪.要么我必须计算句子中所有情绪排名单词的平均值,要么只计算它们.

nlp mining sentiment-analysis

0
推荐指数
1
解决办法
6906
查看次数