【发布时间】:2022-06-26 01:26:42
【问题描述】:
我的用例与示例:
m = Mapping()
m["John Doe"] = "PERSON"
m["Google"] = "ORG"
我希望能够不插入“John”、“Mr. John”或“Mr. Doe”等实体,因为映射中存在类似的实体(“John Doe”)。
这是我的 Mapping 类的实现(请检查包含):
from fuzzywuzzy import fuzz
class Mapping(dict):
def __setitem__(self, key, item):
self.__dict__[key] = item
def __getitem__(self, key):
return self.__dict__[key]
def __repr__(self):
return repr(self.__dict__)
def __len__(self):
return len(self.__dict__)
def __delitem__(self, key):
del self.__dict__[key]
def clear(self):
return self.__dict__.clear()
def copy(self):
return self.__dict__.copy()
def has_key(self, k):
return k in self.__dict__
def update(self, *args, **kwargs):
return self.__dict__.update(*args, **kwargs)
def keys(self):
return self.__dict__.keys()
def values(self):
return self.__dict__.values()
def items(self):
return self.__dict__.items()
def pop(self, *args):
return self.__dict__.pop(*args)
def __cmp__(self, dict_):
return self.__cmp__(self.__dict__, dict_)
def __contains__(self, item):
for key in self.__dict__.keys():
# if incoming token is a partial or complete match of an existing token in the mapping
if fuzz.partial_token_set_ratio(item, key) == 100:
return True
else:
return False
def __iter__(self):
return iter(self.__dict__)
def __unicode__(self):
return unicode(repr(self.__dict__))
这打破了我的例子:
"John" in m # returns True as expected
"Goo" in m # returns False ?
fuzz.partial_token_set_ratio("Goo", "Google") # returns 100
fuzz.partial_token_set_ratio("John", "John Doe") # returns 100
为什么在第一个键之后会中断?
【问题讨论】:
-
扩展
dict的全部意义在于,您不必复制和粘贴所有方法来让它们工作。 -
__dict__不是你想象的那样。看看m.__dict__看看我的意思。 -
你为什么要这样?这没有道理。现在,您的
Mapping对象带有 两个字典,即对象本身(这是一个dict),和一个__dict__字典,这是它的命名空间。 -
另外,这不起作用,因为您的
__contains__方法总是在第一次迭代时返回。但这一切似乎都被误导了。 -
我希望能够消除名称的多种变体并合并到一个键中。
标签: python dictionary fuzzywuzzy