首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python有没有soundex函数?

python有没有soundex函数?
EN

Stack Overflow用户
提问于 2016-02-15 15:06:25
回答 3查看 13.4K关注 0票数 4

python有soundex函数吗?如果没有,你将如何编写soundex代码?

代码语言:javascript
复制
Soundex
Code    Letters 
1   B, F, P, V  
2   C, G, J, K, Q, S, X, Z  
3   D, T    
4   L   
5   M, N    
6   R   
SKIP   A, E, H, I, O, U, W, Y, H, W, and Y

例如:

Jackson = J250

华盛顿= W252

Clement = C455

阿什克拉夫特= A261

Wu = W000

EN

回答 3

Stack Overflow用户

发布于 2017-01-01 20:11:39

是的,你可以使用Fuzzy,这是一个实现了一些语音算法的python库。

代码语言:javascript
复制
sudo pip install fuzzy

>>> import fuzzy
>>> soundex = fuzzy.Soundex(4)
>>> soundex("Jackson")
'J250'
>>> soundex("Washington")
'W252'
>>> soundex("Clement")
'C453'
>>> soundex("Ashcraft")
'A261'
>>> soundex("Wu")
'W000'
票数 4
EN

Stack Overflow用户

发布于 2017-08-04 22:02:29

你可以用水母

代码语言:javascript
复制
sudo pip install jellyfish

print "Soundex\t\t=", jellyfish.soundex("Ala ma kaca")
>Soundex                = A452
#...
>Metaphone              = AL M KK
>NYSIIS                 = AL
>Match rating codex     = ALMKC
票数 3
EN

Stack Overflow用户

发布于 2021-04-21 22:27:56

直接使用下面的soundex()函数,不需要安装任何软件包!

取自package Jellyfish > _jellyfish.py

代码片段

示例

代码语言:javascript
复制
print(soundex('kent')) # K530
print(soundex('Paul')) # P400
print(soundex('amnesty')) # A523

代码

代码语言:javascript
复制
import unicodedata
def soundex(s):

    if not s:
        return ""

    s = unicodedata.normalize("NFKD", s)
    s = s.upper()

    replacements = (
        ("BFPV", "1"),
        ("CGJKQSXZ", "2"),
        ("DT", "3"),
        ("L", "4"),
        ("MN", "5"),
        ("R", "6"),
    )
    result = [s[0]]
    count = 1

    # find would-be replacment for first character
    for lset, sub in replacements:
        if s[0] in lset:
            last = sub
            break
    else:
        last = None

    for letter in s[1:]:
        for lset, sub in replacements:
            if letter in lset:
                if sub != last:
                    result.append(sub)
                    count += 1
                last = sub
                break
        else:
            if letter != "H" and letter != "W":
                # leave last alone if middle letter is H or W
                last = None
        if count == 4:
            break

    result += "0" * (4 - count)
    return "".join(result)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35403335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档