【问题标题】:How to Correct Slang words using python or Nltk?如何使用 python 或 Nltk 纠正俚语?
【发布时间】:2016-03-20 07:28:41
【问题描述】:

我有一些从网上得到的文字,但人们用简短的形式写出来,比如 uni 代表大学,awsm 代表真棒等,但我可以猜出这些单词的列表。但是如何用 Python 纠正它们呢?我尝试了以下方法,但没有成功。

APPOSTOPHES= {"'s": "is", "'re":"are"}    
s= " i luv my iphone, you're awsm apple. DisplayisAwesome, Sooooo happppppy"
words = s.split()
rfrm=[APPOSTOPHES[word] if word in APPOSTOPHES else word for word in words]
rfrm= " ".join(rfrm)
print(rfrm)

i luv my iphone, you're awsm apple. DisplayisAwesome, Sooooo happppppy

但它会打印相同的句子。它没有改变任何东西。

【问题讨论】:

  • APPOSTOPHES[word] 不会匹配您列表中的任何项目。

标签: python-3.x nltk error-correction spelling


【解决方案1】:

您的代码出现了一些问题,首先是您在 APPOSTOPHES[word] 检查中没有匹配任何候选替换。

我将代码分解成非常清晰的块,并在您的APPOSTROPHES 字典中进行了小修正——注意现在值中的空格。其余描述在代码 cmets 中:

APPOSTOPHES= {"'s": " is", "'re":" are"}    
test_string = " i luv my iphone, you're awsm apple. DisplayisAwesome, Sooooo happppppy"

# split the words based on whitespace
sentence_list = test_string.split()

# make a place where we can build our new sentence
new_sentence = []

# look through each word 
for word in sentence_list:
    # look for each candidate
    for candidate_replacement in APPOSTOPHES:
        # if our candidate is there in the word
        if candidate_replacement in word:
            # replace it 
            word = word.replace(candidate_replacement, APPOSTOPHES[candidate_replacement])

    # and pop it onto a new list 
    new_sentence.append(word)

rfrm = " ".join(new_sentence)
print(rfrm)
# i luv my iphone, you are awsm apple. DisplayisAwesome, Sooooo happppppy

编辑:正如 Alexis 的评论所指出的,如果您尝试对所有内容应用相同的模式,那么单词/收缩替换将导致麻烦。我采用这种方法是因为您的变量名称接近于“撇号”一词——这就是我们正在改变的。他建议使用 nltk tokenize 方法是一个很好的建议;如果您打算将您的方法基于库,那么一定要学习它的首选方法。

我的回答旨在帮助您克服眼前的障碍,并向您展示为什么您会得到相同的句子字符串作为响应。

【讨论】:

  • 这会进行这种特殊的替换,但是为此任务进行部分单词替换是一个非常糟糕的主意。想想看……"u": "you"
  • 当然,但这是提问者稍后会在他的方法中找到的东西。我看了你的回答,它打开了一个全新的蠕虫罐头。
  • 你看了我的回答,你认为 NLTK api 的方法是错误的?让我们听听为什么。
  • 我不希望你解决所有 OP 的问题(我当然不会尝试),但是 OP 的代码匹配完整的单词。 通过使用部分匹配引入了一个问题,你说这很好,因为它是“提问者稍后会在他的方法中找到的东西”?哇。
  • 它有什么“哇”的地方?我正在做 OP 在他的方法中试图做的事情。你期待一个答案来教他如何进行俚语分类吗?他想匹配撇号。我的代码为他做到了这一点。我故意不匹配像“u”这样的字母,因为很明显。提及您没有提及的 NLTK API 与获得全面的答案不同。提问者显然是在学习 Python,所以小步走总比手忙脚乱“嘿,做对了,祝你好运!”更好。此外,他的代码匹配完整的单词。你读过吗?
【解决方案2】:

您的代码没有替换任何内容,因为您匹配的是完整的单词,但是 're 写在前一个单词的后面。如果你破解了一个撇号的解决方案,你很快就会发现你的代码在标点符号附近的单词上也失败了。例如,... luv, susan."

由于您标记了此 nltk,因此只需使用 nltk 的标记器而不是 split()

>>> s = " i luv my iphone, you're awsm apple. DisplayisAwesome, Sooooo happppppy"
>>> nltk.word_tokenize(s)
['i', 'luv', 'my', 'iphone', ',', 'you', "'re", 'awsm', 'apple', '.', 'DisplayisAwesome', ',', 'Sooooo', 'happppppy']

现在 're 是一个完整的令牌,您的代码将按预期工作。 (它还会将 John's dog 更改为 John is dog,但这是您的方法所固有的)。

顺便提一下,isare 不是“俚语”。它用于各种文本。

【讨论】:

  • 啊,我明白了。但是您删除了我关于“It's”可以出现在非俚语文本中的演示:-(顺便说一句,如果您将其更改为反对票,您能告诉我有什么问题吗?
  • 现在可以安全地删除您的 cmets
  • @alexis 嗨,我知道这个答案发布已经很久了,但是 nltk.wordtokenize(s) 在 nltk 3.2.3 中产生['I', 'luv', 'my', '<', '3', 'iphone', '&', 'you', '’', 're', 'awsm', 'apple', '.', 'DisplayIsAwesome']。可能这是旧版本的输出。
  • 仔细看,您的测试文本包含you’re 中的定向引用。使用 ascii 撇号 (you're),它仍然被标记化,如答案所示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
  • 1970-01-01
  • 2023-01-08
  • 2020-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多