我有一个包含27个文件的数据集,每个文件都包含操作码。我想使用词干分析将相似操作码的所有版本映射到相同的操作码。例如: push、pusha、push B等都映射到push;addf addi到add,multi到mult,等等)。我如何做到这一点呢?我尝试将PorterStemmer与NLTK扩展一起使用,但它在我的数据集上不起作用。我认为它只适用于正常的人类语言单词。(像播放,播放-->播放),而不是像(pusha,push b --> push)这样的操作码。
发布于 2019-02-26 04:36:44
我不认为词干是您想要在这里做的。词干分析器是特定于语言的,并且基于该语言中常见的词形变化模式。例如,在英语中,你有动词的不定式形式(例如,“走”),它变成了时态、体和人称/数字的变化:I walk vs. walks (walk+s),I Wals. vs. walked (walk+ed),还有walk+ing,等等。词干分析器将这些随机分布编码成“规则”,然后应用于“单词”,以改变其词干。换句话说,您的操作码不存在现成的词干分析器。
您有两种可能的解决方案:(1)创建字典或(2)编写自己的词干分析器。如果您没有太多的变体要映射,那么创建一个自定义字典可能是最快的,其中您使用所有单词变体作为键,并将词条/词干/规范形式作为值。
addi -> add
addf -> add
multi -> mult
multf -> mult如果您的潜在映射太多而无法手工完成,那么您可以编写一个自定义的正则表达式词干分析器来执行映射和转换。下面的函数接受一个输入词,并尝试将其与代表词干的所有变体的模式进行匹配,以获取集合中所有的n词干。它返回一个1 x n data.frame,其中1表示存在,0表示不存在变体匹配。
#' Return word's stem data.frame with each column indicating presence (1) or
#' absence (0) of stem in that word.
map_to_stem_df <- function(word) {
## named list of patterns to match
stem_regex <- c(add = "^add[if]$",
mult = "^mult[if]$")
## iterate across the stem names
res <- lapply(names(stem_regex), function(stem) {
pat <- stem_regex[stem]
## if pattern matches word, then 1 else 0
if (grepl(pattern = pat, x = word)) {
pat_match <- 1
} else {
pat_match <- 0
}
## create 1x1 data.frame for stem
df <- data.frame(pat_match)
names(df) <- stem
return(df)
})
## bind all cols into single row data.frame 1 x length(stem_regex) & return
data.frame(res)
}
map_to_stem_df("addi")
# add mult
# 1 0
map_to_stem_df("additional")
# add mult
# 0 0https://stackoverflow.com/questions/54874069
复制相似问题