2

今回のタイトルはかなり難しかったです。

あるシナリオを解決しようとしています。XXXXX 人に調査が送信され、お気に入りのサッカー クラブはどこかを尋ねられたと想像してください。返信から、多くが同じクラブのお気に入りである一方で、彼らはすべて異なる方法でそれを「表現」していることは明らかです. 例えば、

マンチェスター・ユナイテッドの場合、いくつかのバリエーションには...

  • マンユー
  • マン・ユナイテッド
  • マン・ユナイテッド
  • マンチェスター大学
  • マンチェスター・ユナイテッド

すべてが同じクラブであることは明らかですが、抽出文字列の一致を取得しようとする単純な手法を使用すると、それぞれ別の結果になります。

ここで、シナリオをさらに複雑にする場合、さまざまなクラブ (例: マン シティ、M. シティ、マンチェスター シティなど) が非常に多いため、この問題に再び悩まされ、手動で「入力」することは不可能であるとしましょう。これらの差異を使用して、すべての Man U -> Manchester United、Man Utd のコンバーターなどのカスタム フィルターを作成します。> マンチェスター・ユナイテッドなど。しかし、代わりに、このフィルターを自動化し、最も可能性の高い一致を探して、それに応じてデータを変換したいと考えています。

私はPythonで(.cvsファイルから)これをやろうとしていますが、これを解決するための良いアプローチを概説する疑似回答を歓迎します.

編集: いくつかの追加情報 これは、クラブのセット リストから機能しているのではありません。スペルミスがないことを前提としています。クラブ数の推定長さはありません。調査リストは長いです。これを手動で行うことを保証しないほど長い (数千のクエリ)

4

3 に答える 3

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
于 2011-02-27T16:08:00.173 に答える
0

これらの多くは、文字列を小文字化し、句読点をすべて削除し、各単語の先頭を比較することで、標準形式に変換できるように思えます。

すべての実際のクラブ名のリストがあれば、それと直接比較することもできます。また、最初の n 文字が実際のチームと一致しない文字列については、実際に一致する返された文字列に対して辞書式の比較を試みることができます。

完璧ではありませんが、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'])
于 2011-02-27T16:05:38.727 に答える
0

質問を編集して、次の回答を入力してください。

「このフィルターを自動化して、最も可能性の高い一致を探したい」とあなたは言います-何に一致しますか?? 可能性のあるすべてのサッカー クラブの標準的な名前のリストはありますか?それとも、そのようなリストを作成するには、各名前のさまざまなバリエーションをクラスター化する必要がありますか?

クラブはいくつ?

アンケートの回答数は?

非常に軽い正規化 (.スペースで置き換え、先頭/末尾の空白を削除し、一連の空白を単一のスペースで置き換え、[その順序で] 小文字に変換) を実行して数えた後、固有の応答はいくつありますか?

あなたの焦点は、標準名の略語にあるようです。ガナーズ -> アーセナル、スパーズ -> トッテナム ホットスパーなどのニックネームに対処する必要がありますか? 頭字語 (WBA -> ウェスト ブロムウィッチ アルビオン)? スペルの間違い、キーボードの間違い、SMS の方言などはどうですか? 一般的に、データのどのような研究を行い、その結果はどうでしたか?

あなたは「「これらの差異を手動で「入力」することは不可能です」」と言います--たとえば、上記のニックネームに対処するために、いくつかの「差異」を「入力」することは可能/許容されますか?

この演習の成功の基準は何ですか?また、それをどのように測定しますか?

于 2011-02-27T22:33:02.620 に答える