0

我有一个巨大的单词列表corpus和一个特定的单词ww我知道语料库中每次出现的索引。我想查看每次出现的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
4

0 回答 0