Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何使用python或Nltk更正俚语?_Python 3.x_Nltk_Error Correction_Spelling - Fatal编程技术网

Python 3.x 如何使用python或Nltk更正俚语?

Python 3.x 如何使用python或Nltk更正俚语?,python-3.x,nltk,error-correction,spelling,Python 3.x,Nltk,Error Correction,Spelling,我从网上得到了一些文字,但人们用简短的形式写下了它们,比如大学的uni,awsm的awesome等等,但我能猜出这些单词的列表。但是如何用Python纠正它们呢?我尝试了以下方法,但没有成功 APPOSTOPHES= {"'s": "is", "'re":"are"} s= " i luv my iphone, you're awsm apple. DisplayisAwesome, Sooooo happppppy" words = s.split() rfrm=[APPOSTOPHE

我从网上得到了一些文字,但人们用简短的形式写下了它们,比如大学的uni,awsm的awesome等等,但我能猜出这些单词的列表。但是如何用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]检查中的任何候选替换项

我将代码分成了非常清晰的部分,并在Approstophes字典中做了一个小的更正-注意现在值中的空格。描述的其余部分在代码注释中:

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标记化方法是一个很好的建议;如果你打算将你的方法建立在一个库的基础上,一定要学习它的首选方法


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

您的代码中有一些问题,其中第一个问题是,您没有匹配APPOSTOPHES[word]检查中的任何候选替换项

我将代码分成了非常清晰的部分,并在Approstophes字典中做了一个小的更正-注意现在值中的空格。描述的其余部分在代码注释中:

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标记化方法是一个很好的建议;如果你打算将你的方法建立在一个库的基础上,一定要学习它的首选方法


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

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

由于您标记了此nltk,因此只需使用nltk的标记器,而不是拆分:

现在,re是一个完整的令牌,您的代码将按预期工作。它也会把约翰的狗变成约翰是狗,但这是你的方法中固有的


顺便说一句,请注意,订约是而且不是俚语。它被用在各种文本中。

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

由于您标记了此nltk,因此只需使用nltk的标记器,而不是拆分:

现在,re是一个完整的令牌,您的代码将按预期工作。它也会把约翰的狗变成约翰是狗,但这是你的方法中固有的


顺便说一句,请注意,订约是而且不是俚语。它用于各种文本。

APPOSTOPHES[word]与列表中的任何项目都不匹配。APPOSTOPHES[word]与列表中的任何项目都不匹配。这就产生了这种特殊的替换,但对该任务进行部分替换是一个非常糟糕的主意。想想看。。。u:你当然知道,但这是提问者稍后会在他的方法中发现的。我看了你的答案,它打开了一个全新的蠕虫罐。你看了我的答案,你认为NLTKAPI的方法是错误的?让我们来听听为什么。我不希望你能解决OP的所有问题,我当然不会尝试,但OP的代码匹配完整的单词。你通过使用部分匹配引入了一个问题,你说这很好,因为提问者稍后会在他的方法中发现这个问题?哇,这有什么了不起的?我正在做OP试图在他的方法中做的事情。你希望有答案教他如何进行俚语分类吗?他想匹配撇号。我的密码是为他做的。我故意不匹配像u这样的字母,因为很明显。提到NLTKAPI(您没有提到),并不等于有一个全面的答案。提问者显然是在学习Python,所以一条小步走的道路比用手摇摇晃晃要好。嘿,只要用正确的方法来做,祝你好运!而且,他的代码与完整的单词不匹配。你读过吗?这是一个特殊的替换,但是为这个任务做部分单词替换是一个非常糟糕的主意。想想看。。。u:你当然知道,但那是询问者会发现的东西
后来在他的方法中。我看了你的答案,它打开了一个全新的蠕虫罐。你看了我的答案,你认为NLTKAPI的方法是错误的?让我们来听听为什么。我不希望你能解决OP的所有问题,我当然不会尝试,但OP的代码匹配完整的单词。你通过使用部分匹配引入了一个问题,你说这很好,因为提问者稍后会在他的方法中发现这个问题?哇,这有什么了不起的?我正在做OP试图在他的方法中做的事情。你希望有答案教他如何进行俚语分类吗?他想匹配撇号。我的密码是为他做的。我故意不匹配像u这样的字母,因为很明显。提到NLTKAPI(您没有提到),并不等于有一个全面的答案。提问者显然是在学习Python,所以一条小步走的道路比用手摇摇晃晃要好。嘿,只要用正确的方法来做,祝你好运!而且,他的代码与完整的单词不匹配。你读过吗?啊,我明白了。但是你删除了我的演示,它可以出现在非俚语文本中:-顺便说一句,如果你把它改为否决票,你能告诉我出了什么问题吗?删除你的评论是安全的now@alexis嗨,我知道这个答案已经发布很久了,但是nltk.WordTokens['I','luv','my','仔细看,你的测试文本在you's中包含一个直接引号。使用ascii撇号you's,它仍然被标记,如答案所示。啊,我明白了。但是你删除了我的演示,它可以在非俚语文本中显示:-顺便说一句,如果你把它改为否决票,你能告诉我出了什么问题吗?这是安全的删除您的评论now@alexis嗨,我知道这个答案已经发布很久了,但是nltk.wordtokenizes产生了[i]、[luv]、[my]、[you's]仔细看,你的测试文本在you's中包含一个直接引号。使用ascii撇号you's,它仍然被标记,如答案所示。