我有一个句子列表,我想对它们进行排序,以便每个新句子一次只引入一个新单词。我想我越来越近了,但是我看到的错误是每次新单词的数量只会增加。 例如,第一次循环时,将带有一个新单词的句子添加到列表中。在下一个循环中,将具有两个新单词的句子添加到列表中,依此类推。但是,这不是我想要的。 相反,我希望每个新循环都用一个新单词添加句子,而不要增加到两个新单词。 我已经调试了几个小时,进行了重构和重新运行,却一无所获。 有帮助吗?
commonSentenceList = list()
alreadySeenWordList = list()
sentenceAndNewWordCountDict = {}
import operator as op
def internalComp(sortedDic, sentenceList, wordList):
toDelete = list()
newOutputDict = {}
secondaryOutputDict = {}
#this loop is the part that is not working -> each new call should re order and find a new 1 and a new 0, not increase the number every time
for x in sortedDic:
sentenceString = x[0]
if sentenceString not in sentenceList:
tempCounter = 0
for word in sentenceString.split():
if word not in wordList:
tempCounter += 1
newOutputDict[sentenceString] = tempCounter #this dictionary stores sentence and number of new words compared to known word list
counter = 0
for key, value in newOutputDict.items():
if value is 0:
#here should first check to make sure not dup sentence
#print(key)
#print(value)
toDelete.append(key)
sentenceList.append(key)
counter +=1
for x in key.split():
if x not in wordList:
wordList.append(x)
if counter is 0:
for key, value in newOutputDict.items():
if value is 1:
toDelete.append(key)
sentenceList.append(key)
counter +=1
for x in key.split():
if x not in wordList:
wordList.append(x)
for x in toDelete:
newOutputDict.pop(x)
return sorted(newOutputDict.items(), key=op.itemgetter(1))
def travelingSalesman(ListOfSortedSentenceAndScore, sentencesOnlyList, wordList, outputDict):
#sentencesOnlyList is preloaded with one sentence
#wordList is preloaded with each word in the sentencesOnlyList
while any(ListOfSortedSentenceAndScore):
#return: each element includes sentence and number of new words
ListOfSortedSentenceAndScore = internalComp(ListOfSortedSentenceAndScore, sentencesOnlyList, wordList)
sorted_sentenceDataRelativeScoreDict = [('यह बहुत है।', 0), ('यह एक महानदी है।', 6.738544474393532e-05), ('यह मुमकिन है।', 6.738544474393532e-05), ('यह तस्करों का अड्डा है।', 0.00026954177897574127), ('मिशन कामयाब रहा', 0.00097574127), ('ज़ोकर बहुत बौना था', 0.00026954177897574127), ('यह एक टेढ़ा विचार था', 0.00026954177897574127), ('यह निराली हरकत थी।', 0.00026954177897574127), ('पर्यटक टूर पर था।', 0.000269897574127), ('पहिया ढीला था।', 0.00026954177897574127), ('प्रदर्शनी हाउसफुल थी।', 0.00026954177897574127), ('वह फुरसत में खेलेंगे।', 0.00026954177897574127), ('मेट्रो भूमिगत है।', 0.000227), ('कढ़ी में बहुत मसाला था।', 0.00026954177897574127), ('मीनार बहुत ऊँची थी।', 0.00026954177897574127), ('यह एक रेतीला तुफान था।', 0.00026954177897574127), ('यह एक कोरा चेक है', 0.000636119), ('इस उत्पाद में एक खराबी है', 0.0004043126684636119), ('यह एक खोटा सिक्का है', 0.0004043126684636119), ('चरवाहा बहुत चालाक था', 0.0004043126684636119), ('छत पर एक कौआ था', 0.000684636119), ('झाड़ी में एक झींगुर था', 0.000404312668463)]
travelingSalesman(sorted_sentenceDataRelativeScoreDict, commonSentenceList, alreadySeenWordList, sentenceAndNewWordCountDict)
print(commonSentenceList)
在我看来,在internalComp中,第一个循环将基于每个先前的句子迭代来重新创建newOutputDict。但这似乎并非如此。相反,似乎tempCounter不会重置,而是保存来自循环第一个实例的新单词数。
答案 0 :(得分:0)
您的循环依赖于“ internalComp”,从而逐步达到终止条件。
while condition:
internalComp()
为向您证明该数据集没有取得进展,请将其添加到您现有的“ for x in toDelete”中
if toDelete:
for x in toDelete:
newOutputDict.pop(x)
else:
print ('toDelete was empty')
raise Exception('internalComp made no progress. infinite loop may result')
或者将其添加到travelingSalesman循环中:
print (len(ListOfSortedSentenceAndScore))
虽然这在您以前的一些测试案例中可能奏效,但您还是很幸运。如果您不能保证进度,最终将找到一个触发无限循环的数据集。唯一安全的方法是确保internalComp始终消除至少一个。
我相信您在wordList上遇到实现错误,在其中检查所有单词是否都在一个空列表中(不是),然后构建一个单词列表。相反,当您发现一个新单词时,应立即将其添加到wordList中。但是,如果不能确保internalComp取得进展,则修复错误只会减少找到无限循环数据集的机会。