用于从字典中检索单词的正则表达式

RegEx for retrieving words from a dictionary

这是我的代码:它在一个字典和另一个字典中查找并计算第一个字典的值的分数。

d_score = {k: [0, 0, 0] for k in d_filtered_words.keys()}
for k, v in d_filtered_words.items():
    for word in v:
        if word in dico_lexique:
            print(word, dico_lexique[word]
            d_score[k] = [a + b for a, b in zip(map(int, dico_lexique[word]), d_score[k])]
d_score = {k: list(map(str, v)) for k, v in d_score.items()}

打印结果为:

avoir ['101', '3772', '110']
serrer ['175', '936', '252']
main ['251', '2166', '49']
avoir ['101', '3772', '110']
serrer ['175', '936', '252']
enfant ['928', '1274', '19']
aérien ['354', '769', '39']
affable ['486', '45', '32']
affaire ['46', '496', '104']
agent ['265', '510', '18']
connaître ['448', '293', '29']
rien ['24', '185', '818']
trouver ['387', '198', '31']
être ['225', '328', '44']
emmerder ['0', '23', '493']
rien ['24', '185', '818']
suffire ['420', '35', '56']
mettre ['86', '1299', '67']
multiprise ['314', '71', '0']
abasourdir ['0', '43', '393']
ablation ['75', '99', '353']
abominable ['0', '24', '1170']
être ['225', '328', '44']
seul ['65', '97', '540']
ami ['492', '72', '31']
aimer ['1140', '49', '35']

澄清一下: dico_lexique 还包含 key_word,例如:

sabot de Vénus>orchidée;294;76;0
imbuvable>boisson;0;0;509
imbuvable>insupportable;0;0;416
accentuer>intensifier;255;89;4
accentuer>mettre un accent;50;29;30

这些是我在查看 dico_lexique

中的键时也想考虑的词

d_score 的结果是:

{'15': ['1731', '12856', '792'], '44': ['3079', '4437', '2549'], '45': ['75', '166', '1916'], '47': ['7721', '3854', '7259']}

您好,请澄清一下,包含元素“>”的单词也是 dico_lexique 的一部分,它们不是来自另一个文件。在 dico_lexique 中,您对一个词有不同的含义,为了区分它,有些词后面跟有“>”。我只查看 dico_lexique 和 d_filtered 并且想考虑 key_word 后跟 '>' 这样当我在 [=37 中看到 'serrer' =]_words ,代码将检索 'serrer' 的值以及单词 "serrer" 后跟“>”的所有值。

d_score = {k: [0, 0, 0] for k in d_filtered_words.keys()}
for k, v in d_filtered_words.items():
    for word in v:
        regex =????
        if word in dico_lexique and if word = re.findall(regex, word)

编辑:更新问题后的新版本。

样本数据现在是:

>>> d_filtered_words = {
...    '1': ['avoir', 'main'],
...    '2': ['main', 'serrer', 'posséder'],
... }

>>> dico_lexique = {
...     'avoir': ('101', '3772', '110'),
...     'avoir>posséder': ('91', '2724', '108'),
...     'serrer': ('175', '936', '252'),
...     'main': ('251', '2166', '49'),
... }

您必须先处理 dico_lexique 以删除 > 之后的部分并按主词对值进行分组:

>>> values_by_word = {}
>>> for word, values in dico_lexique.items():
...     main, *_ = word.split(">")
...     values_by_word.setdefault(main, []).append(values)
>>> values_by_word
{'avoir': [('101', '3772', '110'), ('91', '2724', '108')], 'serrer': [('175', '936', '252')], 'main': [('251', '2166', '49')]}

解释:

  • main, *_ = word.split(">") 保留可选 > 之前的所有内容并忘记其余部分(参见 destructuring assignement
  • setdefault 创建一个与主词关联的新列表(如果它不存在)并添加值。

现在,同样的逻辑如下:

>>> def merge_values(tuples):
...     """Sums columns (with a str->int->str conversion)"""
...     return tuple(str(sum(int(v) for v in vs)) for vs in zip(*tuples))

>>> merged_values_by_word = {code:merge_values(tuples) for code, tuples in values_by_word.items()}
>>> merged_values_by_word
{'avoir': ('192', '6496', '218'), 'serrer': ('175', '936', '252'), 'main': ('251', '2166', '49')}

(我将 get_values 重命名为 merge_values 但它是相同的功能。) 您可以将下面的代码与 merged_values_by_word 一起使用,而不是 dico_lexique.

编辑结束:以下旧版本,备案

你混合了两个问题:你的代码做什么(求和与单词或单词族相关的值)和解析文件或字符串。

一些代码审查

让我总结一下: * 你有 dico_lexique 将一个词映射到三个值(包含整数的字符串) * 你有 d_filtered_words 将代码('15','44',......)映射到单词列表。 * 您创建一个字典,将代码映射到 [sum of the value1, sum of the value2, sum of the value2],用于映射到代码并出现在 dico_lexique.

中的每个单词

首先,如果您总是有三个值,请使用 tuple,而不是 list。我将使用这个自定义示例:

>>> d_filtered_words = {
...    '1': ['avoir', 'main'],
...    '2': ['main', 'serrer', 'posséder'],
... }

>>> dico_lexique = {
...     'avoir': ('101', '3772', '110'),
...     'serrer': ('175', '936', '252'),
...     'main': ('251', '2166', '49'),
...     # no posséder here
... }

其次,构建一个将代码映射到三个值列表的字典:

>>> def get_tuples(words):
...     """return the tuples of values for every word in dico_lexique"""
...     return [dico_lexique[word] for word in words if word in dico_lexique]

>>> tuples_by_code = {code:get_tuples(words) for code, words in  d_filtered_words.items()}
>>> tuples_by_code
{'1': [('101', '3772', '110'), ('251', '2166', '49')], '2': [('251', '2166', '49'), ('175', '936', '252')]}

第三,对数值求和"by column"。有一个简单的方法可以做到:

>>> tuples = [(1,2,3), (4,5,6)]
>>> tuple(zip(*tuples))
((1, 4), (2, 5), (3, 6))
>>> tuple(map(sum, zip(*tuples)))
(5, 7, 9)

zip 函数将对每个元组的第一个元素进行分组,然后对每个元组的第二个元素进行分组,然后......:你得到 "columns" 并且只需要对它们求和。在你的情况下:

>>> def get_values(tuples):
...     """Sums columns (with a str->int->str conversion)"""
...     return tuple(str(sum(int(v) for v in vs)) for vs in zip(*tuples))

>>> values_by_code = {code:get_values(tuples) for code, tuples in tuples_by_code.items()}
>>> values_by_code
{'1': ('352', '5938', '159'), '2': ('426', '3102', '301')}

你的问题

现在你的问题。假设我有一个包含替代形式的文本文件:

>>> text = """avoir>posséder
... voilé>dissimulé
... voilé>caché"""

您必须解析该文件并拆分 > 上的每一行以构建字典 alternative -> main:

>>> main_by_alternative = {a: m for line in text.split("\n") for m, a in [line.split(">")]}
>>> main_by_alternative
{'posséder': 'avoir', 'dissimulé': 'voilé', 'caché': 'voilé'}

关键思想是拆分字符 > 上的行以获得列表中的主要形式和替代形式。 for m, a in [line.split(">")] 是在听写理解中使用 m, a = line.split(">") 的技巧。现在,回到 get_tuples:

>>> def get_tuples(words):
...     """return the tuples of values for every word in dico_lexique"""
...     return [dico_lexique[main_by_alternative.get(word, word)] for word in words if main_by_alternative.get(word, word) in dico_lexique]

有什么新鲜事?看:main_by_alternative.get(word, word)。如果它退出,它只是获取主要形式,否则获取单词本身。

>>> {code:get_tuples(words) for code, words in  d_filtered_words.items()}
{'1': [('101', '3772', '110'), ('251', '2166', '49')], '2': [('251', '2166', '49'), ('175', '936', '252'), ('101', '3772', '110')]}

代码 2 现在映射到三个词:'main'、'serrer'、'avoir'(通过 'posséder')。

希望对您有所帮助。我使用了很多 dict/list 理解来使它简短,但如果你需要,请毫不犹豫地将代码扩展为常规循环。