如何根据关键词对不同元素进行排序?
我正在尝试根据每个句子中指定单词的词性来对文本文件中的不同句子进行排序。例如:给定 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”的句子,但“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
的句子,而“Glas”是名词,不应该出现在这里,因为它没有(也不应该)识别出任何参数导致这种情况发生。
那么,这里发生了什么?为什么会添加没有任何(明显)逻辑解释的句子?最重要的是,我该怎么做才能正确地对句子进行排序呢?
1 个回答
这里有一个可行的解决方案。正如我在评论中提到的,使用正则表达式可以更轻松地找到“高亮”的单词。需要注意的是,如果把单词类别的分隔符存储在一个字典里,并用一个字典的字典来替代原来的三个字典,那么代码就会变得更加灵活(可以添加新的类别),同时也能避免重复写if ...
语句。
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')]}
补充:这是我之前提到的改进版本:
import re
def getWordsSelected(sentences):
# the parameter sentences is a list of the previous sentences sample showed
word_categories = {
'verb': '()',
'substantive': '[]',
'adjective': '{}'
}
word_dict = {category: {} for category in word_categories}
for wordSentenceToSearch in sentences:
for category, delimiters in word_categories.items():
if word := re.findall(
fr'{re.escape(delimiters[0])}([^{re.escape(delimiters[1])}]*)',
wordSentenceToSearch
):
word_dict[category].setdefault(word[0], []).append((wordSentenceToSearch, category))
print(word_dict)
输出结果:
{
'verb': {'duftete': [('Es (duftete) nach Erde und Pilze', 'verb')]},
'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')]},
'adjective': {'mehr': [('Er saß da wie verzaubert und schaute sie an und konnte seine Augen nicht {mehr} von ihr abwenden', 'adjective')]}
}