如何根据关键字对不同元素进行排序?

问题描述 投票:0回答:1

我试图根据每个句子中指定单词的词性对文本文件中的不同句子进行排序。例如:给定

the big [house]
the {red} flower
,我想创建两个字典,例如
dict1

{house: ["the big house", "substantive"]

dict2

{red: "the red flower", "adjective"}

这是我后来想出的想法,将它们合并并拥有一本字典,其中包含作为句子中的主要单词的关键字,以及一个包含我从中得到它的句子及其词性的列表。

我尝试了多种方法,但最终总是把它们混合在一起,几乎没有任何顺序。这是我最后一次尝试,虽然我知道它可以更好地格式化,而且它不是最干净的解决方案,但这是迄今为止我能使用的最多的解决方案。

这些是我正在使用的句子的示例:

Es (duftete) nach Erde und Pilze
die [Wände] waren mit Moos überzogen.
Ihr zerrissenes [Gewand] war wieder wie neu
Er saß da wie verzaubert und schaute sie an und konnte seine Augen nicht {mehr} von ihr abwenden
Da sie durchscheinend waren, sahen sie aus wie aus rosa [Glas], das von innen erleuchtet ist.

这是我写的来排序的:

def getWordsSelected (sentence):
    #the parameter sentence gets a list with the previous sentence sample showed
    global WordsDictionary
    WordsDictionary = {}

    verbDict = {}
    subsDict = {}
    adjDict = {}
    
    for wordSentenceToSearch in sentence :
        #SUBSTANTIVE 

        startSubstantive = wordSentenceToSearch.find("[")
        endSubstantive = wordSentenceToSearch.find("]")
        substringSubstantive = wordSentenceToSearch[startSubstantive:endSubstantive]
        wordToSearchSubstantive = substringSubstantive.strip("[]")

        
        subsDict [wordToSearchSubstantive] = [wordSentenceToSearch]
        subsDict.setdefault(wordToSearchSubstantive, []).append("substantive")

    for wordSentenceToSearch in sentence :

        #VERB
        startVerb = wordSentenceToSearch.find("(")
        endVerb = wordSentenceToSearch.find(")")
        substringVerb = wordSentenceToSearch[startVerb:endVerb]
        wordToSearchVerb = substringVerb.strip("()")

       
        verbDict [wordToSearchVerb] = [wordSentenceToSearch]
        verbDict.setdefault(wordToSearchVerb, []).append("Verb")
        
    for wordSentenceToSearch in sentence :

        #ADJ

        startADJ = wordSentenceToSearch.find("{")
        endADJ = wordSentenceToSearch.find("}")
        substringADJ = wordSentenceToSearch[startADJ:endADJ]
        wordToSearchADJ = substringADJ.strip(r"{}")

       
        adjDict [wordToSearchADJ] = [wordSentenceToSearch]
        adjDict.setdefault(wordToSearchADJ, []).append("ADJ")

    print(subsDict)
    print(verbDict)
    print(adjDict)

这几乎可行,但结果是这样的:

{'': ['Er saß da wie verzaubert und schaute sie an und konnte seine Augen nicht {mehr} von ihr abwenden', 'substantive'], 'Wände': ['die [Wände] waren mit Moos überzogen.', 'substantive'], 'Gewand': ['Ihr zerrissenes [Gewand] war wieder wie neu', 'substantive'], 'Glas': ['Da sie durchscheinend waren, sahen sie aus wie aus rosa [Glas], das von innen erleuchtet ist.', 'substantive']}

在上面的字典中,它应该只显示实词,除了第一个元素之外,它几乎都是这样做的;它添加了突出显示的单词“mehr”的句子,这不是一个实质词(这就是为什么它不添加任何关键字,因为它没有识别任何带有参数的内容来限定为实质词,但它确实得到了由于某种原因它在那里)

{'duftete': ['Es (duftete) nach Erde und Pilze', 'Verb'], '': ['Da sie durchscheinend waren, sahen sie aus wie aus rosa [Glas], das von innen erleuchtet ist.', 'Verb']}

这是动词列表,它与 duftete(示例中唯一的动词)搭配得很好,但它再次在没有任何押韵或原因的情况下夹在另一个句子中。

{'': ['Da sie durchscheinend waren, sahen sie aus wie aus rosa [Glas], das von innen erleuchtet ist.', 'ADJ'], 'mehr': ['Er saß da wie verzaubert und schaute sie an und konnte seine Augen nicht {mehr} von ihr abwenden', 'ADJ']}

最后,形容词和副词类别(它们必须在同一个列表中)还添加了

Glas
的句子,这是一个实词,不应该在那里,因为它不(也不应该)识别任何参数为了实现这一点。

那么,这里发生了什么?为什么它添加句子而没有任何(明显的)逻辑解释?最重要的是,我可以做些什么来解决这个问题,以便对句子进行适当的排序

python list dictionary sorting
1个回答
0
投票

这是一个可行的解决方案。正如我在评论中所说,使用正则表达式可以更轻松地检索“突出显示”的单词。请注意,使代码更加灵活(添加新类别)同时避免重复

if ...
语句将非常容易(通过将单词类别分隔符存储在字典中,并用一本字典的字典替换 3 个字典)。

import re

sentences = [
    "Es (duftete) nach Erde und Pilze",
    "die [Wände] waren mit Moos überzogen.",
    "Ihr zerrissenes [Gewand] war wieder wie neu",
    "Er saß da wie verzaubert und schaute sie an und konnte seine Augen nicht {mehr} von ihr abwenden",
    "Da sie durchscheinend waren, sahen sie aus wie aus rosa [Glas], das von innen erleuchtet ist.",
]


def getWordsSelected(sentences):
    # the parameter sentences is a list of the previous sentences sample showed

    verbDict = {}
    subsDict = {}
    adjDict = {}

    for wordSentenceToSearch in sentences:
        # SUBSTANTIVE
        if (substantive := re.findall(r'\[([^]]*)', wordSentenceToSearch)):
            subsDict.setdefault(substantive[0], []).append((wordSentenceToSearch, "substantive"))

        # VERB
        if (verb := re.findall(r'\(([^)]*)', wordSentenceToSearch)):
            verbDict.setdefault(verb[0], []).append((wordSentenceToSearch, "verb"))

        # ADJ
        if (adj := re.findall(r'\{([^}]*)', wordSentenceToSearch)):
            adjDict.setdefault(adj[0], []).append((wordSentenceToSearch, "adjective"))

    print(subsDict)
    print(verbDict)
    print(adjDict)

输出:

getWordsSelected(sentences)
{'Wände': [('die [Wände] waren mit Moos überzogen.', 'substantive')], 'Gewand': [('Ihr zerrissenes [Gewand] war wieder wie neu', 'substantive')], 'Glas': [('Da sie durchscheinend waren, sahen sie aus wie aus rosa [Glas], das von innen erleuchtet ist.', 'substantive')]}
{'duftete': [('Es (duftete) nach Erde und Pilze', 'verb')]}
{'mehr': [('Er saß da wie verzaubert und schaute sie an und konnte seine Augen nicht {mehr} von ihr abwenden', 'adjective')]}
© www.soinside.com 2019 - 2024. All rights reserved.