4

会社名のリストがあり、会社名に言及している URL のリストがあります。

最終的な目標は、URL を調べて、URL に記載されている企業のうちどれだけが私のリストに含まれているかを調べることです。

URL の例: http://www.dmx.com/about/our-clients

各 URL の構造は異なるため、正規表現検索を行って会社名ごとに個別の文字列を作成する良い方法がありません。

URLの内容全体に対して、リストから各企業を検索するforループを構築したいと考えています。しかし、レーベンシュタインは、短い文字列と大きなテキスト本体よりも、2 つの小さな文字列の方が優れているようです。

この初心者はどこを見るべきですか?

4

2 に答える 2

5

「あいまい」マッチングが必要なようには思えません。そして、あなたが「url」と言うとき、あなたは「urlが指すアドレスのウェブページ」を意味すると思います。Pythonの組み込みの部分文字列検索機能を使用するだけです。

>>> import urllib2
>>> webpage = urllib2.urlopen('http://www.dmx.com/about/our-clients')
>>> webpage_text = webpage.read()
>>> webpage.close()
>>> for name in ['Caribou Coffee', 'Express', 'Sears']:
...     if name in webpage_text:
...         print name, "found!"
... 
Caribou Coffee found!
Express found!
>>> 

文字列の大文字と小文字の不一致が心配な場合は、すべて大文字に変換してください。

>>> webpage_text = webpage_text.upper()
>>> for name in ['CARIBOU COFFEE', 'EXPRESS', 'SEARS']:
...     if name in webpage_text:
...         print name, 'found!'
... 
CARIBOU COFFEE found!
EXPRESS found!
于 2011-05-25T01:01:10.387 に答える
3

なんらかの方法で名前を正規化するのが理にかなっているかもしれないというsenderleの回答に追加します(たとえば、すべての特殊文字を削除してから、それをwebpage_textと文字列のリストに適用します。

def normalize_str(some_str):
    some_str = some_str.lower()
    for c in """-?'"/{}[]()&!,.`""":
        some_str = some_str.replace(c,"")
    return some_str

これが十分でない場合は、difflibに移動して次のようなことを行うことができます。

for client in normalized_client_names:
    closest_client = difflib.get_closest_match(client_name, webpage_text,1,0.8)
    if len(closest_client) > 0:
         print client_name, "found as", closest_client[0]

私が選んだ任意のカットオフ(Ratcliff / Obershelp)の比率0.8は、寛大すぎるか厳しいかもしれません。少し遊んでください。

于 2011-05-25T01:22:37.383 に答える