如何构建一个简单的分词器

我想知道如何构建一个非常简单的标记器。给定字典 d(在本例中为列表)和句子 s,我想返回该句子的所有可能标记(=单词)。这是我尝试过的:

l = ["the","snow","ball","snowball","is","cold"]
sentence = "thesnowballisverycold"

def subs(string, ret=['']):
    if len(string) == 0:
        return ret
    head, tail = string[0], string[1:]
    ret = ret + list(map(lambda x: x+head, ret))
    return subs(tail, ret)
    
print((list(set(subs(sentence))&set(l))))

但这会返回:

["snow","ball","cold","is","snowball","the"]

我可以比较子字符串,但必须有更好的方法来做到这一点,对吗?我想要的是:

["the","snowball","is","cold"]

回答

您可以在此处使用正则表达式:

import re
l = ["the","snow","ball","snowball","is","cold"]
pattern = "|".join(sorted(l, key=len, reverse=True))
sentence = "thesnowballisverycold"
print( re.findall(pattern, sentence) )
# => ['the', 'snowball', 'is', 'cold']

请参阅Python 演示。

模式看起来像snowball|snow|ball|cold|the|is,在线查看正则表达式演示。诀窍是确保从最长到最短列出所有替代方案。请参阅正则表达式运算符的顺序 (..|.. ... ..|..)。该sorted(l, key=len, reverse=True)部分l按长度降序对项目进行排序,并"|".join(...)创建交替模式。


以上是如何构建一个简单的分词器的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>