4

Bodo言語のNLPにpython 2.7を使用しています(Devnagariスクリプトを使用)

ストップ ワードの削除の過程で、改行 ("\n") で区切られたファイルにストップ ワードのリストを作成しました。codecs モジュールを使用してこのファイルを読み取り、リストに変換しました。

raw_txt = codecs.open('stopwords.txt', 'r', 'utf-8')
stopWords = []
while(1):
    line = raw_txt.readline()
    if not line:
        break
    line = u''.join(line.strip())
    stopWords.append(line)

ここで、一致する単語を見つけるために正規表現をコンパイルしました。

def addWordBoundary(word):       
    return u''.join(r"\b" + word + r"\b")

reg = regex.compile(r"(%s)" % "|".join(map(addWordBoundary, stopWords)), regex.UNICODE)

codecs モジュールを使用してコーパス (テキスト ファイル) を文字列と regex.sub() に読み取り、コーデック自体を使用してファイルに書き込みます。しかし、それはいくつかの言葉を逃しました。理由がわかりませんでした。

fl = codecs.open('corpus.txt', 'r', 'utf-8')
rawFile = fl.read()

cleanText = reg.sub('', rawFile, regex.U)

wr = codecs.open('output.txt', 'w', 'utf-8')
wr.write(cleanText)
wr.close()

テスト目的で、これを stopwords.txt と corpus.txt の両方として使用します

म€€するましの€<br>なりफ愛因度 र <br>
<br>なりम##€兄弟<br> जेबजेब カー



output.txt ファイルは空のファイルである必要がありますが、次のものが含まれています。

ロレックス <br><br><br><br><br>

このコードは英語のテキスト (ASCII) に適しているため、utf-8 処理に問題がある可能性があります。提案してください。

4

1 に答える 1

2

提供されたファイル内の一部のストップ ワードは、英数字として定義されていない文字で開始または終了しています。

import unicodedata as ud
for w in stopWords:
    for c in w[0], w[-1]:
        print repr(c), ud.category(c),
    print
u'\u092e' Lo u'\u094b' Mc
u'\u092b' Lo u'\u094b' Mc
u'\ufeff' Cf u'\u094b' Mc
u'\u092e' Lo u'\u092f' Lo
u'\u091c' Lo u'\u092f' Lo
u'\u0905' Lo u'\u092f' Lo
u'\ufeff' Cf u'\u092f' Lo
u'\u0928' Lo u'\u094b' Mc
u'\u092b' Lo u'\u092f' Lo
u'\u0928' Lo u'\u094b' Mc

特に、output.txt に表示されている 2 行は、次の行で始まりますu'\ufeff'

ud.name(u'\ufeff') == 'ZERO WIDTH NO-BREAK SPACE'

これはバイト オーダー マーク (BOM) とも呼ばれ、エンコードを識別するためにファイルの先頭に使用されることがあります。ここでは、編集時に誤ってファイル内に含まれている可能性があります。Python は、ファイルの先頭にある場合は文字を削除するように見えますが、ファイルの他の場所にある場合は削除しません。strip()明らかにそれを削除するには十分ではありません。これらの文字は、入力ファイルから手動で削除する必要があります。

u'\u094b'出力で( DEVANAGARI VOWEL SIGN O ) で終わるものも取得しているため、Python のコピーはこれらを英数字として扱わないようです。

また、一般に、正規表現で正確な文字列と一致させたいre.escape(string)場合、正規表現のメタ文字として扱われる文字が文字列に含まれている場合、正規表現に挿入する前に を使用する必要があります。

于 2013-06-02T20:13:43.400 に答える