复合名词与基本名词的分离(二)

2024-10-03 09:07:44 发布

您现在位置:Python中文网/ 问答频道 /正文

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

我有一个清单是这样的:

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

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

^{pr2}$

不过,我意识到,这项法规限制性太强了,因为它还将“枕头”从列表中删除。在

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

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

Tags: 答案代码namebox单词workballbasket
2条回答

你需要找出减去匹配后剩下的单词是否是另一个单词。在某些情况下,我想词源不匹配。例如,我认为包括另一个单词加上“is”“where”“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

对于一般的单词,判断它是否是复合词的最简单的方法就是将它切成两半,看看这两半是否都是单词。您必须使用不同的切分点重复测试,因此运行时间与单词的长度成正比。对于任何英语单词,它都应该相当快,而不是189,000 character long chemical names。在

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

输出:

^{pr2}$

相关问题 更多 >