2

我有一些从网上得到的文字,但是人们用简短的形式写了它们,比如大学的 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

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

4

2 回答 2

3

您的代码发生了一些事情,首先是您没有匹配APPOSTOPHES[word]支票中的任何候选替代品。

我把代码分成非常清晰的块,并在你的APPOSTROPHES字典中做了一个小的更正——注意现在值中的空间。其余的描述在代码注释中:

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

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

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

于 2015-12-14T19:03:22.183 回答
1

您的代码没有替换任何内容,因为您匹配完整的单词,但是'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,但这是您的方法所固有的)。

顺便说一句,请注意,合同不是“俚语”。它用于各种文本。

于 2015-12-20T20:57:30.903 回答