2017-01-30 17 views
1

私はドメイン名とページタイトルからHTMLで会社名を解析するのに苦労しています。のは、私のドメインがあるとしましょう:Python - ドメイン名とページタイトルからの会社名の解析

http://thisismycompany.com

とページタイトルです:

This is an example page title | My Company

私の仮説は、私はすべてを小文字にして取り除いた後、これらから最長共通部分文字列に一致する場合ということですが、英数字で、これは会社名になる可能性が非常に高いです。

したがって、最も長い共通部分文字列(Link to python 3 code)はmycompanyを返します。この部分文字列を元のページのタイトルに戻して、空白と文字の正しい場所を取得できるようにするにはどうすればよいですか。

答えて

1

これはregexを使用して実行可能かどうかを考えましたが、通常の文字列操作/比較を使用する方が簡単だと思いました。これは時間の影響を受けやすいタスクのようには見えないからです。

def find_name(normalized_name, full_name_container): 
    n = 0 
    full_name = '' 
    for i in range(0, len(full_name_container)): 
    if n == len(normalized_name): 
     return full_name 

    # If the characters at the current position in both 
    # strings match, add the proper case to the final string 
    # and move onto the next character 
    if (normalized_name[n]).upper() == (full_name_container[i]).upper(): 
     full_name += full_name_container[i] 
     n += 1 

    # If the name is interrupted by a separator, add that to the result 
    elif full_name_container[i] in ['-', '_', '.', ' ']: 
     full_name += full_name_container[i] 

    # If a character is encountered that is definitely not part of the name 
    # Re-start the search 
    else: 
     n = 0 
     full_name = '' 

    return full_name 

print(find_name('mycompany', 'Some stuff My Company Some Stuff')) 

"My Company"が印刷されます。空白やカンマのような、正規化された名前を中断する可能性のある項目のリストをハードコーディングすると、おそらく改善する必要があるでしょう。

+1

恐ろしいです。ありがとう。このメソッドは、実際に私が最初に気にしていた実装ですが、動作させることができませんでした。その間、私は別の実装も見つけました。私はそれを答えとして加えてあなたと他の人がそれをチェックすることができます。 – Lexxxxx

1

タイトルの可能なすべての部分文字列のリストを生成することによって解決しました。これをマッチと照合すると、私は最も長い共通部分文字列関数から得ました。

def get_all_substrings(input_string): 
    length = len(input_string) 
    return set([input_string[i:j+1] for i in range(length) for j in range(i,length)]) 

longest_substring_match = 'mycompany' 
page_title = 'This is an example page title | My Company' 

for substring in get_all_substrings(page_title): 
    if re.sub('[^0-9a-zA-Z]+', '', substring).lower() == longest_substring_match.lower(): 
     match = substring 
     break 

print(match) 

編集:source used

+1

私はこれがよりよい解決策であるかもしれないと思う。おそらく、私よりもはるかに多くのケースに当てはまります。しかし、もっと簡単な例では私のほうが効率的かもしれません。 – FreakJoe

+1

私は同意します。もう1つの改善点は、両方のループを結合し、一致するものが見つかったときにそれを中断させることです。最後のものが当然ながら一致するものでない限り、すべてではなく部分文字列が少なくなることを意味します – Lexxxxx

関連する問題