簡體   English   中英

Python字典不能根據需要匹配鍵

[英]Python dictionary not matching keys as desired

我有一本字典。 例,

dict = { "wd":"well done", "lol":"laugh out loud"}

問題是,如果有類似"lol?"東西"lol?" 在文中,它根本沒有擴展。 下面是代碼,我用來替換字典鍵:

def contractions(text, contractions_dict=dict):
    for word in text.split():
        if word.lower() in contractions_dict:
            text = text.replace(word, contractions_dict[word.lower()])
    return text

問題是由於'lol''?'之間缺少空間 我該如何解決這個問題?

之后,建議的更新代碼如下:

 dict1 = {
          "wd":"well done",
          "lol":"laugh out loud"
         }

 def contractions(text, contractions_dict=dict1):
     for key in contractions_dict:
         text = text.replace(key, contractions_dict[key])
     return text

 text = "lol?"
 text=contractions(text)
 print(text)

為上面的例子工作,但是在長文本中,這段代碼正在進行不希望的替換。

例如,lwhyear olduckwhyeahhnt lookingiaandteam effortato代表whyear oldwhyear oldugh lwhyear olduckwhyeahhahandal seato

這是我獲得實際數據的結果的一部分。 需要幫忙。

你的錯誤來自你分割文字的方式。 python中str.split()的默認情況是在空格上分割,這意味着“wtf?” 不分裂。

正如您在文檔中看到的,str.split()可以接收要使用的分隔字符列表。

您可以使用以下方法解決此特定問題:

text.split(sep=[' ', '?'])

但最有可能的是,您希望將更多字符用作分離點。

如果你看一下visaversa有一個更好的解決方案,對於每個密鑰,在整個文本中用該密鑰的值替換它:

def contractions(text, contractions_dict=dict):
    for k, v in contractions_dict.items():
        text = text.replace(k,v)
    return text

還請注意:

不要使用dict作為變量名,這個名稱是python內置的,你將覆蓋它的功能。

樣本輸入和輸出:

In [42]: contractions('this is wd and lol?')
Out[42]: 'this is well done and laugh out loud?'

而不是檢查文本是否是字典的一部分,迭代字典並檢查密鑰是否在文本中。 不推薦這樣做,因為它包含嵌套循環。

def contractions(text, contractions_dict=dict):
    for word in text.split():
        for key in contradictions_dict:
            if key in word:
                text = text.replace(word, contractions_dict[key])
    return text

相反,您可能希望使用replace方法自動替換每個鍵的每個匹配項。 替換將自動查找並替換該單詞。 無需自己迭代文本。

def contractions(text, contractions_dict=dict):
    for key in contradictions_dict:
        text = text.replace(key, contractions_dict[key])
    return text

如前所述, .split()僅在空格處分割,如果您希望從字符串中提取單詞和數字,可以按照以下方式使用re模塊執行該任務:

import re
a = 'This, is. (example) for :testing: 123!'
words = re.findall(r'\w+',a)
print(words) #['This', 'is', 'example', 'for', 'testing', '123']

如您所見,它會丟棄空格,圓點,逗號,冒號等,同時保留由以下內容組成的序列:字母,數字(和下划線_ )。

您可以使用文本標記生成器解決您的問題。 NLTK庫提供了許多例如WordPunctTokenizer ,您可以按如下方式使用它:

from nltk.tokenize import WordPunctTokenizer
text = "Good muffins cost $3.88\nin New York.  Please buy me\ntwo of them.\n\nThanks."
print(WordPunctTokenizer().tokenize(text))

這將輸出:

    ['Good', 'muffins', 'cost', '$', '3', '.', '88', 'in', 'New', 'York',
'.', 'Please', 'buy', 'me', 'two', 'of', 'them', '.', 'Thanks', '.']

你可以注意到它可以標記非常復雜的句子。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM