gpt4 book ai didi

r - 在 Quanteda 中使用字典创建 Bigram

转载 作者:行者123 更新时间:2023-12-02 09:29:37 25 4
gpt4 key购买 nike

我正在尝试从数据文本分析中删除拼写错误。所以我使用 Quanteda 包的字典功能。对于 Unigrams 来说效果很好。但它为 Biggram 提供了意想不到的输出。不知道如何处理拼写错误,以免它们潜入我的二元组和三元组。

ZTestCorp1 <- c("The new law included a capital gains tax, and an inheritance tax.", 
"New York City has raised a taxes: an income tax and a sales tax.")

ZcObj <- corpus(ZTestCorp1)

mydict <- dictionary(list("the"="the", "new"="new", "law"="law",
"capital"="capital", "gains"="gains", "tax"="tax",
"inheritance"="inheritance", "city"="city"))

Zdfm1 <- dfm(ZcObj, ngrams=2, concatenator=" ",
what = "fastestword",
toLower=TRUE, removeNumbers=TRUE,
removePunct=TRUE, removeSeparators=TRUE,
removeTwitter=TRUE, stem=FALSE,
ignoredFeatures=NULL,
language="english",
dictionary=mydict, valuetype="fixed")

wordsFreq1 <- colSums(sort(Zdfm1))

电流输出

> wordsFreq1
the new law capital gains tax inheritance city
0 0 0 0 0 0 0 0

不使用字典,输出如下:

> wordsFreq
tax and the new new law law included included a a capital
2 1 1 1 1 1
capital gains gains tax and an an inheritance inheritance tax new york
1 1 1 1 1 1
york city city has has raised raised a a taxes taxes an
1 1 1 1 1 1
an income income tax and a a sales sales tax
1 1 1 1 1

预期二元组

The new
new law
law capital
capital gains
gains tax
tax inheritance
inheritance city

附:我假设标记化是在字典匹配后完成的。但根据我看到的结果,情况似乎并非如此。

另一方面,我尝试将字典对象创建为

mydict <- dictionary(list(mydict=c("the", "new", "law", "capital", "gains", 
"tax", "inheritance", "city")))

但是没有成功。所以我不得不使用上面的方法,我认为这种方法效率不高。

更新根据 Ken 的解决方案添加了输出:

> (myDfm1a <- dfm(ZcObj, verbose = FALSE, ngrams=2, 
+ keptFeatures = c("the", "new", "law", "capital", "gains", "tax", "inheritance", "city")))
Document-feature matrix of: 2 documents, 14 features.
2 x 14 sparse Matrix of class "dfmSparse" features
docs the_new new_law law_included a_capital capital_gains gains_tax tax_and an_inheritance
text1 1 1 1 1 1 1 1 1
text2 0 0 0 0 0 0 1 0
features
docs inheritance_tax new_york york_city city_has income_tax sales_tax
text1 1 0 0 0 0 0
text2 0 1 1 1 1 1

最佳答案

已于 2017 年 12 月 21 日更新为较新版本的 quanteda

很高兴看到您正在使用该包!我认为您正在努力解决的问题有两个。第一个是如何在形成 ngram 之前应用特征选择。第二个是如何一般性地定义特征选择(使用 Quanteda)。

第一个问题:如何在形成 ngram 之前应用特征选择。在这里,您定义了一个字典来执行此操作。 (正如我将在下面展示的,这在这里不是必需的。)您希望删除所有不在选择列表中的术语,然后形成二元组。 Quanteda 默认情况下不会这样做,因为它不是“二元组”的标准形式,其中单词不是根据邻接严格定义的某些窗口进行搭配的。例如,在您的预期结果中,law Capital 不是一对相邻的术语,这是二元组的通常定义。

但是,我们可以通过更“手动”地构建文档特征矩阵来覆盖此行为。

首先,对文本进行标记。

# tokenize the original
toks <- tokens(ZcObj, removePunct = TRUE, removeNumbers = TRUE) %>%
tokens_tolower()
toks
## tokens object from 2 documents.
## text1 :
## [1] "the" "new" "law" "included" "a" "capital" "gains" "tax" "and" "an" "inheritance" "tax"
##
## text2 :
## [1] "new" "york" "city" "has" "raised" "a" "taxes" "an" "income" "tax" "and" "a" "sales" "tax"

现在,我们使用 tokens_select() 将您的字典 mydict 应用于标记化文本:

(toksDict <- tokens_select(toks, mydict, selection = "keep"))
## tokens object from 2 documents.
## text1 :
## [1] "the" "new" "law" "capital" "gains" "tax" "inheritance" "tax"
##
## text2 :
## [1] "new" "city" "tax" "tax"

从这组选定的标记中,我们现在可以形成二元组(或者我们可以将 toksDict 直接提供给 dfm()):

(toks2 <- tokens_ngrams(toksDict, n = 2, concatenator = " "))
## tokens object from 2 documents.
## text1 :
## [1] "the new" "new law" "law capital" "capital gains" "gains tax" "tax inheritance" "inheritance tax"
##
## text2 :
## [1] "new city" "city tax" "tax tax"

# now create the dfm
(myDfm2 <- dfm(toks2))
## Document-feature matrix of: 2 documents, 10 features.
## 2 x 10 sparse Matrix of class "dfm"
## features
## docs the new new law law capital capital gains gains tax tax inheritance inheritance tax new city city tax tax tax
## text1 1 1 1 1 1 1 1 0 0 0
## text2 0 0 0 0 0 0 0 1 1 1
topfeatures(myDfm2)
# the new new law law capital capital gains gains tax tax inheritance inheritance tax new city city tax tax tax
# 1 1 1 1 1 1 1 1 1 1

功能列表现在非常接近您想要的。

第二个问题是为什么你的字典方法看起来效率低下。这是因为您正在创建一个字典来执行特征选择,但并没有真正将其用作字典 - 换句话说,每个键等于其自己的键作为值的字典并不是真正的字典。只需向其提供一个选择标记的字符向量,它就可以正常工作,例如:

(myDfm1 <- dfm(ZcObj, verbose = FALSE, 
keptFeatures = c("the", "new", "law", "capital", "gains", "tax", "inheritance", "city")))
## Document-feature matrix of: 2 documents, 8 features.
## 2 x 8 sparse Matrix of class "dfm"
## features
## docs the new law capital gains tax inheritance city
## text1 1 1 1 1 1 2 1 0
## text2 0 1 0 0 0 2 0 1

关于r - 在 Quanteda 中使用字典创建 Bigram,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34474601/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com