我有一个巨大的单词列表corpus
和一个特定的单词w
。w
我知道语料库中每次出现的索引。我想查看每次出现的n
大小窗口,w
并创建一个包含该窗口中出现的其他单词的字典。int
字典是从到的映射,list[str]
其中键是距离我的目标词多少个位置,向左(负)或向右(正),值是该位置的单词列表。
例如,如果我有语料库["I", "made", "burgers", "Jack", "made", "sushi"]
:我的话是"made"
,我正在看一个大小的窗口1
,然后我最终想返回{-1: ["I", "Jack"], 1: ["burgers", "sushi"]}
。
可能会出现两个问题。我的窗口可能超出范围(如果我在上面的示例中查看大小为 2 的窗口)并且我可以在该窗口中多次遇到相同的单词,这是我想忽略的情况。我编写了以下似乎可行的代码,但我想让它更干净。
def find_neighbor(word: str, corpus: list[str], n: int = 1) -> dict[int, list[str]]:
mapping = {k: [] for k in list(range(-n,n+1)) if k != 0}
idxs = [k for k, v in enumerate(corpus) if v == word]
for idx in idxs:
for i in [x for x in range(-n,n+1) if x != 0]:
try:
item = corpus[idx+i]
if item != word:
mapping[i].append(corpus[item])
except IndexError:
continue
return mapping
有没有办法合并选项和模式匹配,以便我可以删除 try 块并拥有类似的东西......
match corpus[idx+i]
case None: continue; # If it doesn't exist (out of bounds), continue / i can also break
case word: continue; # If it is the word itself, continue
case _: mapping[i].append(corpus[item]) # Otherwise, add it to the dictionary