通过文本文件中的输入来查找字母中的多个单词

时间:2019-03-18 20:02:28

标签: python set permutation

我是python的新手(或多或少),并且正在为一项任务而苦苦挣扎,在该任务中,我需要通过用户输入或更好/更简便的方式(最好是较长的句子,例如“我们彼此见面”)输入一个句子昨天”,但无所谓)。然后遍历所有字母,找到所述单词的所有可能字母组合,并在包含数千个单词的文件(约4 mb文件)中找到与之匹配的单词,每个单词位于单独的一行,如下所示:

fun
dog
whatever
coffee
cup

我选择了itertools.permutations,并尝试了使用setintersection。 事不宜迟,到目前为止,这是我的代码:

from itertools import permutations


def alpha_check():
    """check whether a sentence consists of only letters"""
    sentence = str.lower(input('Type something in: '))
    while not sentence.replace(' ', '').isalpha():
        print(f"You typed in {sentence!s}. Only letters A-Z allowed, not case sensitive.")
        sentence = input("Please, type something again: ")
    return sentence


def file_iter(sentence: str):

    my_set = set(line.strip() for line in open('file.txt'))
    word_list = set(sentence.split())
    for x in word_list:
        temp = list(permutations(x))
        for f in temp:
            print(''.join(f), end=' ') # gets rid of commas etc.
        inters = my_set.intersection(f)
        return inters


print(file_iter(alpha_check()))

Alpha检查目前对我不感兴趣,我只想让这个怪物工作。当前,它会输出如下内容,假设提示后我输入"map lake"

Type something in: map lake
lake laek lkae lkea leak leka alke alek akle akel aelk aekl klae klea kale kael kela keal elak elka ealk eakl ekla ekal {'l', 'e', 'a', 'k'}

,预期的输出将是maplake排列,然后在输入和文件内找到交集。 我在SO和Google上搜索了很多。找到了很多信息,但无论如何我都无法完成这项工作。这是我想出的最好的。 另外,我并没有寻求完整的解决方案,只是寻求帮助以了解我在做什么错以及如何解决此问题。线索,技巧等 谢谢!

更新

def file_iter(sentence):
    new_sentence = []
    my_set = set(line.strip() for line in open('file.txt'))
    word_list = sentence.split()
    for words in word_list:
        permutation = list(permutations(words))
        permute_set = my_set.intersection(["".join(word) for word in permutation])
        new_sentence += permute_set.union(word_list)

    return print(' '.join(set(new_sentence)))

这将在下面提供输出:

Type something in: we met each other
toher ache we haec throe other tem each theor ew met thore

如何将它们改成不同的句子?遵循以下原则:

we toher met ache
ew tem haec thore 

1 个答案:

答案 0 :(得分:0)

我假设通过“找到所说单词的所有可能字母组合”实际上是指排列。如果是这种情况,您要做的就是将字典中的大单词列表存储为字典,将排序后的字母作为键,并将相应单词(字谜)的列表作为值。

然后,您可以遍历句子中的单词,并在词典中找到条目(使用单词的排序字母)以获取所有字谜。

排序的字母(wordKey)可以用作彼此字谜的单词的组标识符。所有字谜都将在字典中产生一个键,因此您无需为排列打扰。

  • 湖-(排序字母)-> aekl:[湖,泄漏,kale]
  • 泄漏-(排序字母)-> aekl:[湖,泄漏,kale]
  • kale-(排序字母)-> aekl:[湖,泄漏,kale]

    每个单词都到达词典中所属的字谜组

这是一个示例,您可以从以下位置构建解决方案:

anagrams = dict()
for word in open("/usr/share/dict/words").read().split("\n"):
    wordKey = "".join(sorted(word.lower()))
    anagrams.setdefault(wordKey,[]).append(word)

sentence = "We met each other yesterday"
for word in sentence.split():
    wordKey = "".join(sorted(word.lower()))
    print(word, anagrams.get(wordKey,[word]))

基于笔记本电脑上的235K单词词典,这将产生以下输出:

We ['we']
met ['met']
each ['ache', 'each', 'haec']
other ['other', 'thore', 'throe', 'toher']
yesterday ['yesterday']

请注意,您的解决方案即将开始工作。

  • f中的my_set.intersection(f)变量应为temp 因为f只是最后的排列。
  • 另外f可能没有包含您所期望的内容。 由于permutation(x)x视为列表,因此会产生结果 (temp),它是一个列表列表,而不是字符串列表。
  • 因此,如果将其更改为my_set.intersection([ "".join(f) for f in temp]),则可能会起作用。
  • 这是一个很好的例子,说明了如何为您的名称选择有意义的名称 变量有助于避免错误。
  • 我还想知道是否仅处理完inters 句子集合中的第一个单词确实是您打算要做的。
  • 打印结果的最后一部分也是可疑的,因为这意味着您实际上发现了与个人的交集 单词“泄漏”的字母。这表明您的文件 包含单个字母的单词,或者您没有用 适当的编码(例如,以ascii格式读取的unicode)。你应该打印 len(my_set)或要创建的前几项list(my_set)[:25] 确保您那里有单词而不是字母。

[UPDATE] ”将输出显示为单个单词列表:

sentence = "We met each other yesterday"
result = []
for word in sentence.split():
    wordKey = "".join(sorted(word.lower()))
    result += anagrams.get(wordKey,[]) + [word]
print(" ".join(set(result)))

# thore each other haec we met throe toher yesterday ache

[UPDATE2] 时髦的句子

如果要处理结果并构建可以使用字谜组成的所有句子,则需要遍历每个单词的字谜组,并在每个步骤中“乘”组合:

from itertools import product
from itertools import product
funkySentences = [[]]
for word in sentence.split():
    wordKey        = "".join(sorted(word.lower()))
    alternateWords = anagrams.get(wordKey,[word])
    funkySentences = [ s+[w] for s,w in product(funkySentences,alternateWords) ]

funkySentences = set(" ".join(fs) for fs in funkySentences)   
for fs in funkySentences:
    print(fs)

这将打印:

we met haec throe yesterday
we met haec thore yesterday
we met haec toher yesterday
we met ache toher yesterday
we met haec other yesterday
we met each throe yesterday
we met each toher yesterday
we met ache other yesterday
we met each thore yesterday
we met ache throe yesterday
we met ache thore yesterday
we met each other yesterday

您还可以通过对这些时髦的句子中的每一个应用置换来疯狂地改变单词的顺序:

from itertools import chain,permutations
yodaSentences = chain(*[permutations(fs.split()) for fs in funkySentences])

yodaSentences = set(" ".join(ys) for ys in yodaSentences)
for ys in yodaSentences:
    print(ys)

这将打印(尤达说话):

ache we yesterday met other
other haec we met yesterday
yesterday met throe each we
haec throe yesterday met we
we yesterday met haec toher
yesterday we ache met throe
haec yesterday we other met
other yesterday met haec we
met we haec thore yesterday
each we yesterday other met
we ache yesterday other met
yesterday met toher we each
we met yesterday thore ache
... and many more ....