0

私は情報検索タスクを行っています。前処理の一環としてやりたい。

  1. ストップワードの削除
  2. トークン化
  3. ステミング (Porter Stemmer)

最初は、トークン化をスキップしました。その結果、次のような用語が得られました。

broker
broker'
broker,
broker.
broker/deal
broker/dealer'
broker/dealer,
broker/dealer.
broker/dealer;
broker/dealers),
broker/dealers,
broker/dealers.
brokerag
brokerage,
broker-deal
broker-dealer,
broker-dealers,
broker-dealers.
brokered.
brokers,
brokers.

それで、トークン化の重要性を実感しました。英語のトークン化のための標準アルゴリズムはありますか? string.whitespace一般的に使用される句読点に基づいています。私が書いた

def Tokenize(text):
    words = text.split(['.',',', '?', '!', ':', ';', '-','_', '(', ')', '[', ']', '\'', '`', '"', '/',' ','\t','\n','\x0b','\x0c','\r'])    
    return [word.strip() for word in words if word.strip() != '']
  1. エラーが出TypeError: coercing to Unicode: need string or buffer, list foundます!
  2. このトークン化ルーチンはどのように改善できますか?
4

2 に答える 2

1

トークン化のための完全なアルゴリズムは 1 つではありませんが、情報検索の目的にはアルゴリズムで十分な場合があります。正規表現を使用して実装する方が簡単です。

def Tokenize(text):
    words = re.split(r'[-\.,?!:;_()\[\]\'`"/\t\n\r \x0b\x0c]+', text)
    return [word.strip() for word in words if word.strip() != '']

略語を適切に処理するなど、さまざまな方法で改善できます。

>>> Tokenize('U.S.')
['U', 'S']

また、ダッシュ ( ) の操作に注意してください-。検討:

>>> Tokenize('A-level')
['A', 'level']

'A'停止リストにまたはが含まれている場合'a'、これは に削減されますlevel

Natural Language Processing with Python、第 3 章、およびNLTKツールキットを確認することをお勧めします。

于 2010-10-31T15:02:03.013 に答える
0

larsman が言及しているように、ntlk には、さまざまなオプションを受け入れるさまざまなトークナイザーがあります。デフォルトの使用:

>>> import nltk
>>> words = nltk.wordpunct_tokenize('''
... broker
... broker'
... broker,
... broker.
... broker/deal
... broker/dealer'
... broker/dealer,
... broker/dealer.
... broker/dealer;
... broker/dealers),
... broker/dealers,
... broker/dealers.
... brokerag
... brokerage,
... broker-deal
... broker-dealer,
... broker-dealers,
... broker-dealers.
... brokered.
... brokers,
... brokers.
... ''')
['broker', 'broker', "'", 'broker', ',', 'broker', '.', 'broker', '/', 'deal',       'broker', '/', 'dealer', "'", 'broker', '/', 'dealer', ',', 'broker', '/', 'dealer', '.', 'broker', '/', 'dealer', ';', 'broker', '/', 'dealers', '),', 'broker', '/', 'dealers', ',', 'broker', '/', 'dealers', '.', 'brokerag', 'brokerage', ',', 'broker', '-', 'deal', 'broker', '-', 'dealer', ',', 'broker', '-', 'dealers', ',', 'broker', '-', 'dealers', '.', 'brokered', '.', 'brokers', ',', 'brokers', '.']

句読点のみのリスト項目を除外したい場合は、次のようにすることができます。

>>> filter_chars = "',.;()-/"
>>> def is_only_punctuation(s):
        '''
        returns bool(set(s) is not a subset of set(filter_chars))
        '''
        return not set(list(i)) < set(list(filter_chars))
>>> filter(is_only_punctuation, words)

戻り値

>>> ['broker', 'broker', 'broker', 'broker', 'broker', 'deal', 'broker', 'dealer', 'broker', 'dealer', 'broker', 'dealer', 'broker', 'dealer', 'broker', 'dealers', 'broker', 'dealers', 'broker', 'dealers', 'brokerag', 'brokerage', 'broker', 'deal', 'broker', 'dealer', 'broker', 'dealers', 'broker', 'dealers', 'brokered', 'brokers', 'brokers']
于 2010-10-31T15:58:21.997 に答える