0

次のようなExcelスプレッドシートがあります。

Row1 :           some text
some other row : "ABC Col" "DEF Col" "GHI Col" "JKL Col"
following rows : more text

ABCとJKLを含む行を見つけようとしています。渡す文字列が正確な列見出しと一致しない場合があることに注意してください。

私はxlrd次のようなことを使用して実行しています:

setOfheadings = set(['ABC', 'JKL'])
found_header = False
for i in range(1,sheet.nrows):
    if ((not found_header)):
        setOfRowValues = set([element.upper() for element in sheet.row_values(i)])
        if len(setOfheadings.intersection(setOfRowValues)) == len(setOfheadings):
            (found_header, header_row) = (True,i)

'ABC'はスプレッドシートの'ABCCol'と完全には一致しないため。失敗します。setOfheadingsmyに完全一致が含まれている場合に機能します。

設定された交差点で正規表現の一致を行う方法についてのアイデアはありますか?

4

2 に答える 2

0

この種の問題は、CSで最も困難な問題の1つであるNLPに関連しています。Pythonには、NLTK(Natural Language Toolkit)と呼ばれるNLP関連の強力なモジュールがあります。

これを行う1つの方法は、 n-gramなどのアルゴリズムを使用して、必要なものから取得するものまでの距離を計算することですが、この種のあいまいな比較を行うたびに、誤検知が発生するリスクがあります。

于 2012-03-08T22:24:02.377 に答える
0

これを行う1つの方法があります。機能:列と行を反復処理するコードから、不正確な一致の定義を除外します。非テキストデータでのクラッシュを回避します。おそらく望ましい行が見つかったら、ベールアウトします。

targets = ('ABC', 'JKL')

def fuzzy_match(target, some_text):
    return target in some_text # or something fancier

found_header = False    
for i in xrange(1, sheet.nrows):
    row_text = [
        v.upper()
        for v, t in zip(sheet.row_values(i), sheet.row_types(i))
        if t == xlrd.XL_CELL_TEXT # avoid non-text cells; see note below
        ]
    found_header = all(
        any(fuzzy_match(target, item) for item in row_text)
        for target in targets
        )
    if found_header:
        header_row = i
        break

非テキストセルを回避するコードはxlrd固有です。それを行うためのより一般的な方法は次のとおりです。

for v in sheet.row_values(i)
if isinstance(v, basestring)
于 2012-03-09T10:02:43.187 に答える