【问题标题】:RegEx for retrieving words from a dictionaryRegEx 用于从字典中检索单词
【发布时间】:2019-10-09 22:40:59
【问题描述】:

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

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 后跟 '>' 以便当我在 d_filtered_words 中看到 'serrer' 时,代码将检索 '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)

【问题讨论】:

    标签: regex python-3.x dictionary findall dictionary-comprehension


    【解决方案1】:

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

    样本数据现在是:

    >>> 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
    ... }
    

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

    >>> 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')]}
    

    第三,“按列”对值求和。有一个简单的方法来做到这一点:

    >>> 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 函数将对每个元组的第一个元素进行分组,然后对每个元组的第二个元素进行分组,然后...:您得到“列”并且只需对它们求和。在你的情况下:

    >>> 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(">")] 是在 dict 理解中使用 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 解析来使其简短,但如果您需要,请不要犹豫,将代码扩展为常规循环。

    【讨论】:

    • 你好,只是为了澄清包含元素'>'的单词也是dico_lexique的一部分,它们不是来自另一个文件。在 dico_lexique 中,您对一个词有不同的含义,为了区分它,有些词后面跟着 '>'。我只在 dico_lexique 和 d_filtered 中查找,并希望考虑 key_word 后跟 '>' 以便当我在 d_filtered_words 中看到 'serrer' 时,代码将检索 'serrer' 的值以及所有值“serrer”这个词后面跟着'>'。
    • @kely789456123 更新了答案。
    • 我有这个错误 import TreeTagger OK Traceback(最近一次调用最后一次):文件“CSV_dico_2.py”,第 87 行,在 merge_values_by_word = {code:merge_values(tuples) for code, tuples在 values_by_word.items()}
    • 文件“CSV_dico_2.py”,第 87 行,在 merge_values_by_word = {code:merge_values(tuples) 用于代码,元组在 values_by_word.items()} 文件“CSV_dico_2.py”,行85,在 merge_values return tuple(str(sum(int(v) for v in vs)) for vs in zip(*tuples)) 文件“CSV_dico_2.py”,第 85 行,在 return tuple(str(sum (int(v) for v in vs)) for vs in zip(*tuples)) 文件“CSV_dico_2.py”,第 85 行,在 中返回 tuple(str(sum(int(v) for v in vs) ) for vs in zip(*tuples)) ValueError: invalid literal for int() with base 10: 'Des luxations'
    • @kely789456123 在 int 值的元组中似乎有一个字符串 (' Des luxations')。您是否检查过您的原始dico_lexique 是否正常?在您的 csv 文件中查找 ' Des luxations' 以检查格式是否一致。
    猜你喜欢
    • 1970-01-01
    • 2019-01-02
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多