如何处理拼写错误 NLP

数据挖掘 机器学习 分类 nlp 文本挖掘
2021-09-30 08:18:14

我有一些数据,其中主列是一种产品的描述。主要任务是从该列中提取某些产品的名称,其中有时拼写错误并进行了修改。我有一千多个可能的产品名称。

目前我只是使用带有产品名称列表的正则表达式来查找和提取数据集每一行中的产品名称,但在产品名称拼写错误的情况下效果不佳。

因为我已经有超过 50,000 行产品是手动提取的,以防列中的列表中有一些产品。我想知道在将每个描述分成多行(标记化)之后是否可以应用一些分类/搜索方法来检测是否有一些产品以及描述中的哪些产品。

示例:用于癌症治疗的医疗产品“PRODUCT XXXXYYYY”,其中 XXXX 和 YYYY 是产品的第一个和第二个名称。

我认为大部分描述都不会被使用,因为在上面的例子中,仅仅作为一种医疗产品根本没有帮助,因为有多种可能性,但是描述特定产品的拼写错误的单词的存在会有所帮助。我愿意接受有关如何处理这些拼写错误的建议。

4个回答

其他选择是...

  • 比较相似的文本序列
  • 比较相似的字符串序列
  • 使用模糊匹配

模糊匹配:

library(fuzzyjoin)
# https://stackoverflow.com/questions/26405895/how-can-i-match-fuzzy-match-strings-from-two-datasets

a <- data.frame(name = c('Ace Co', 'Bayes', 'asd', 'Bcy', 'Baes', 'Bays'),
                price = c(10, 13, 2, 1, 15, 1))
b <- data.frame(name = c('Ace Co.', 'Bayes Inc.', 'asdf'),
                qty = c(9, 99, 10))

# Find matches
stringdist_join(a, b, 
                by = "name",
                mode = "left",
                ignore_case = FALSE, 
                method = "jw", 
                max_dist = 99, 
                distance_col = "dist"
) %>%
  group_by(name.x) %>%
  top_n(1, -dist)

这给出了一个词和另一个词之间的“距离”。所以如果你知道真正的产品名称,你也许可以通过距离找到错误的名称。

# A tibble: 6 x 5
# Groups:   name.x [6]
  name.x price name.y       qty   dist
  <fct>  <dbl> <fct>      <dbl>  <dbl>
1 Ace Co    10 Ace Co.        9 0.0476
2 Bayes     13 Bayes Inc.    99 0.167 
3 asd        2 asdf          10 0.0833
4 Bcy        1 Bayes Inc.    99 0.378 
5 Baes      15 Bayes Inc.    99 0.2   
6 Bays       1 Bayes Inc.    99 0.2  

或者,您可以查看字符串序列中的相似性:

如果您的产品名称在其字符串序列中并不常见,并且错误名称仅导致部分名称错误,您可以尝试以下操作:

library(dplyr)
library(tidytext)
library(fuzzyjoin)
library(tokenizers)

##############################
# Compare text sequences

text1=as.character("Hi my name is Bixi and I like cycling a lot. It is just great!")
mytext1=data_frame(text1)

text2=as.character("Hi my name is Lissi and I'm good in swimming. It is just great!")
mytext2=data_frame(text2)

ngram1 = unnest_tokens(mytext1, ngram, text1, token = "ngrams", n = 4)
ngram2 = unnest_tokens(mytext2, ngram, text2, token = "ngrams", n = 4)

# Find matching sequence(s)
semi_join(ngram1,ngram2)

##############################
# Compare sequences of single letters

ngram3=tokenize_character_shingles(mytext1$text1, n = 10, n_min = 10, strip_non_alphanum = FALSE)
ngram4=tokenize_character_shingles(mytext2$text2, n = 10, n_min = 10, strip_non_alphanum = FALSE)

ngram3=as.data.frame(ngram3)
ngram4=as.data.frame(ngram4)

# Find matching sequences of single letters
semi_join(ngram3,ngram4)

你可以看看我的Github还有一些相关的选项。

2 纠正拼写错误的方法:

制作自己的更正字典,例如:

mispell_dict = {'colour': 'color', 'centre': 'center', 'favourite': 'favorite', 'travelling': 'traveling', 'counselling': 'counseling', 'theatre': 'theater', 'cancelled': 'canceled', 'labour': 'labor', 'organisation': 'organization', 'wwii': 'world war 2', 'citicise': 'criticize', 'youtu ': 'youtube ', 'Qoura': 'Quora', 'sallary': 'salary', 'Whta': 'What', 'narcisist': 'narcissist', 'howdo': 'how do', 'whatare': 'what are', 'howcan': 'how can', 'howmuch': 'how much', 'howmany': 'how many', 'whydo': 'why do', 'doI': 'do I', 'theBest': 'the best', 'howdoes': 'how does', 'mastrubation': 'masturbation', 'mastrubate': 'masturbate', "mastrubating": 'masturbating', 'pennis': 'penis', 'Etherium': 'Ethereum', 'narcissit': 'narcissist', 'bigdata': 'big data', '2k17': '2017', '2k18': '2018', 'qouta': 'quota', 'exboyfriend': 'ex boyfriend', 'airhostess': 'air hostess', "whst": 'what', 'watsapp': 'whatsapp', 'demonitisation': 'demonetization', 'demonitization': 'demonetization', 'demonetisation': 'demonetization', 'pokémon': 'pokemon'}

def correct_spelling(x, dic):
    for word in dic.keys():
        x = x.replace(word, dic[word])
    return x

df['treated_question'] = df['treated_question'].apply(lambda x: correct_spelling(x, mispell_dict))

或者

有一个自动库处理最常见的库,请在此处查看

您可以尝试使用 Flashtext 轻松创建您找到的替代品,并尝试使用 FuzzyWuzzy 获得 n 克单词标记之间的相似性

拼写错误的问题通常不在于它们存在,而在于它们使具体条目应如何分类变得不清楚。这在一定程度上取决于拼写错误的严重程度——键入 StackExchaneg 的人可能意味着StackExchange,我很乐意将前者归类为后者的别名。

如果拼写错误大多是这样,那么您可以通过查看相似的拼写来手工制作别名列表(@Peter 建议的模糊匹配算法将是识别潜在拼写错误的好方法,而无需太多前期工作) . 即使从模糊匹配开始,这也可能很乏味,但在数据科学中通常很少有有效的方法可以避免乏味(尤其是目前无监督的分类问题)。

如果有更多的极端拼写错误,或者对于拼写错误的条目应该属于哪个“真实”类别存在潜在的混淆,最合理的方法可能是让多个人查看这些边缘案例进行分类。然后计算特定案例的评分者间可靠性(Cohen's Kappa),以表明当拼写错误的条目属于特定类别时,您有多确定(和不确定)。