这个标题非常棘手。
我正在尝试解决一个场景, 想象一下,调查发送给XXXXX的人数,询问他们最喜欢的足球俱乐部是什么。 从回复中可以看出,虽然很多人都是同一个俱乐部的最爱,但他们都以不同的方式“表达”了它。 例如,
对曼彻斯特联队来说,有些变化包括......
所有人显然都是同一个俱乐部,但是,如果使用一种简单的技术,只是试图获得一个提取字符串匹配,每个都是一个单独的结果。
现在,如果我们进一步复杂化这个场景,让我们说,由于不同俱乐部(例如曼城,如M.市,曼城等)的庞大数量,再次困扰着这个问题,它不可能手动“输入”这些差异,并使用它来创建自定义过滤器,使转换器所有Man U - >曼联,曼联。 >曼彻斯特联队等,但我们想要自动化这个过滤器,寻找最可能的匹配并相应地转换数据。
我正在尝试用Python(来自.cvs文件)执行此操作,但是欢迎任何伪答案,这些答案概述了解决此问题的好方法。
编辑:一些其他信息 这不是在一系列俱乐部中运作,我们的想法是“聚集”我们在一起的俱乐部。 假设没有拼写错误。 没有假设有多少俱乐部的长度 调查清单很长。足够长,以至于它不保证手动执行此操作(1000次查询)
答案 0 :(得分:1)
Google Refine会这样做,但我会假设您想要自己动手。
注意,difflib内置于Python中,并具有许多功能(包括消除垃圾元素)。我从那开始。
您可能不希望以完全自动化的方式进行此操作。我会做这样的事情:
# load corrections file, mapping user input -> output
# load survey
import difflib
possible_values = corrections.values()
for answer in survey:
output = corrections.get(answer,None)
if output = None:
likely_outputs = difflib.get_close_matches(input,possible_values)
output = get_user_to_select_output_or_add_new(likely_outputs)
corrections[answer] = output
possible_values.append(output)
save_corrections_as_csv
答案 1 :(得分:0)
在我看来,您可以将其中的许多转换为标准形式,方法是将字符串缩小,将其封装,删除所有标点符号,然后比较每个单词的开头。
如果您有所有实际俱乐部名称的列表,您也可以直接与之比较;对于与任何实际团队的第一个字母不匹配的字符串,您可以尝试与任何实际匹配的返回字符串进行lexigraphical比较。
它并不完美,但它应该让你99%的方式。
import string
def words(s):
s = s.lower().strip(string.punctuation)
return s.split()
def bestMatchingWord(word, matchWords):
score,best = 0., ''
for matchWord in matchWords:
matchScore = sum(w==m for w,m in zip(word,matchWord)) / (len(word) + 0.01)
if matchScore > score:
score,best = matchScore,matchWord
return score,best
def bestMatchingSentence(wordList, matchSentences):
score,best = 0., []
for matchSentence in matchSentences:
total,words = 0., []
for word in wordList:
s,w = bestMatchingWord(word,matchSentence)
total += s
words.append(w)
if total > score:
score,best = total,words
return score,best
def main():
data = (
"Man U",
"Man. Utd.",
"Manch Utd",
"Manchester U",
"Manchester Utd"
)
teamList = (
('arsenal',),
('aston', 'villa'),
('birmingham', 'city', 'bham'),
('blackburn', 'rovers', 'bburn'),
('blackpool', 'bpool'),
('bolton', 'wanderers'),
('chelsea',),
('everton',),
('fulham',),
('liverpool',),
('manchester', 'city', 'cty'),
('manchester', 'united', 'utd'),
('newcastle', 'united', 'utd'),
('stoke', 'city'),
('sunderland',),
('tottenham', 'hotspur'),
('west', 'bromwich', 'albion'),
('west', 'ham', 'united', 'utd'),
('wigan', 'athletic'),
('wolverhampton', 'wanderers')
)
for d in data:
print "{0:20} {1}".format(d, bestMatchingSentence(words(d), teamList))
if __name__=="__main__":
main()
运行样本数据让你
Man U (1.9867767507647776, ['manchester', 'united'])
Man. Utd. (1.7448074166742613, ['manchester', 'utd'])
Manch Utd (1.9946817328797555, ['manchester', 'utd'])
Manchester U (1.989100008901989, ['manchester', 'united'])
Manchester Utd (1.9956787398647866, ['manchester', 'utd'])
答案 2 :(得分:0)
请使用以下答案编辑您的问题:
你说“我们想要自动化这个过滤器,寻找最可能的匹配” - 匹配什么?您是否有所有可能的足球俱乐部的标准名称列表,或者每个名称的许多变体是否需要聚集以创建这样的列表?
有多少个俱乐部?
有多少调查回复?
执行非常轻量级的规范化后(用空格替换.
,去掉前导/尾随空格,用空格替换空格的运行,转换为小写[按此顺序])并计算,有多少独特的响应你有吗?
您的重点似乎是标准名称的缩写。你需要应对昵称吗?枪手 - >阿森纳,马刺 - >托特纳姆热刺足球俱乐部?缩略语(WBA - > West Bromwich Albion)?拼写错误,键盘错误,短信方言,......?一般来说,您对数据进行了哪些研究以及结果如何?
你说“”“不可能手动”输入“这些差异”“ - 是否可以”输入“某些”差异“,例如如上所述应对昵称?
您在此练习中取得成功的标准是什么?您将如何衡量它?