Python天真的字符串令牌匹配器

时间:2018-09-11 17:03:20

标签: python string string-matching

我写了一个非常幼稚的令牌字符串搜索匹配器。不过,这有点天真,因为使用以下代码,由于'a r i z o n a'的标记方式,它会带回艺术家列表中的所有艺术家。

import collections
import re

def __tokenised_match(artist, search_artist):
        matches = []
        if len(re.split(r'[\\\s/-]', search_artist)) > 1:
            a = [artist.sanitisedOne, search_artist]
            bag_of_words = [ collections.Counter(re.findall(r'\w+', words)) for words in a]
            sumbags = sum(bag_of_words, collections.Counter())
            print(sumbags)
            for key, value in sumbags.items():
                if len(re.findall(r'\b({k})\b'.format(k=key), search_artist)) > 0 and value > 1:
                    matches.append(artist)

        if len(matches):
            return matches


artists = [
{ 'artist': 'A R I Z O N A', 'sanitisedOne': 'a r i z o n a'},
{ 'artist': 'Wutang Clan', 'sanitisedOne': 'wutang clan'}
]

search_artist = 'a r i z o n a'

for artist in artists:
    print(__tokenised_match(artist, search_artist))

这将创建一个像这样的sumbags:

  

Counter({'a':4,'r':2,'i':2,'z':2,'o':2,'n':2})

     

Counter({'a':2,'wutang':1,'clan':1,'r':1,'i':1,'z':1,'o':1,'n ':1})

这是一种边缘保护套,但我想知道如何才能抵抗这种边缘保护套。匹配“ wutang clang”会很好,但是当它像这样的单个字母时……有点多了,由于匹配两次,会带回每个艺术家。

1 个答案:

答案 0 :(得分:2)

基本问题是您仅在一次比赛中就返回成功。对于名称中具有容易匹配的标记的任何艺术家,这都会损害您的准确性。我们可以调整您的算法以匹配一定百分比的单词,或进行字母组合,交集/交集比率,但是...

我建议您使用更强大的功能,例如string similarity,在Python代码中很容易找到。已经打包好了,比编写自己的解决方案容易得多。