1

好吧,我之前问过一个问题,我得到了我想要的答案。但是我现在有更多问题。

我有一个这样的列表:

name = ['road', 'roadwork', 'pill', 'pillbox', 'pillow', 'ball',
'football', 'basketball', 'work', 'box', 'foot', 'basket']

下面的代码将带有复合名词的单词与基础单词分开:

for candidate in name:
    for word in name:
        if word != candidate and word in candidate:
            break      
        else:              
            print candidate

但是我意识到代码过于严格,因为它还会从列表中删除“枕头”。

是否有可以生成以下结果的代码:

name = ['road', 'pill', 'pillow', 'ball', 'work', 'box', 'foot', 'basket']
4

2 回答 2

1

对于您的平均单词,确定它是否是复合词的最简单方法是将其切成两半,看看两半是否都是单词。您必须使用不同的截断点重复测试,因此运行时间与单词的长度成正比。对于任何英文单词,除了189,000 个字符长的化学名称之外,它应该相当快。

words = ['road', 'roadwork', 'pill', 'pillbox', 'pillow', 'ball', 'football', 'basketball', 'work', 'box', 'foot', 'basket']

wordSet = set(words)

def isWord(w):
    return w in wordSet

def isCompoundWord(word):
    for idx in range(1, len(word)):
        left = word[:idx]
        right = word[idx:]
        if isWord(left) and isWord(right):
            return True
    return False

nonCompoundWords = [word for word in words if not isCompoundWord(word)]
print nonCompoundWords

输出:

['road', 'pill', 'pillow', 'ball', 'work', 'box', 'foot', 'basket']
于 2013-03-25T16:52:06.137 回答
0

您将需要找出减去匹配项后剩下的单词是否是另一个单词。会有一些情况,我想词源不匹配的地方。例如,我正在考虑包含另一个单词加上“is”的单词,其中“is”没有被用作它的含义。

编辑:例如:

words = ['book','store','bookstore','booking']
li = []
for word in words:
    for test in words:
        if test in word:
            temp = word[len(test):]
            if temp in words and word not in li:
                li.append(word) 

for x in li:
    words.remove(x)
print words
于 2013-03-25T16:10:15.230 回答