ngram を作成するときに #textblobに&のような短縮形を分割しないように指示する方法はありますか? 技術的には 2 つの別個の単語であることはわかっていますが、1 つの単語として維持したいと考えています。let's
let
's
1 に答える
4
ここには 2 つのオプションがあるようです。
- TextBlob で使用されるトークナイザーを変更します。
- トークンを後処理します。
後者は簡単ですが、遅くなります。
パターンの変更
TextBlob は nltk トークナイザーを受け入れます。私はそれらに精通しているので、それを使用します。nltk の WordPunctTokenizer は、次のパターンの RepexpTokenizer です"\\w+|[^\\w\\s]+"
。
>>> nltk.tokenize.RegexpTokenizer("\\w+|[^\\w\\s]+").tokenize("Let's check this out.")
['Let', "'", 's', 'check', 'this', 'out', '.']
選言の前は\w+
であり、単語の文字を示します。論理和の後には があり[^\w\s]
、これは文字または空白文字以外のもの、つまり句読点に一致します。
単語に含め'
て を取得する"let's"
場合は、その文字を選言の単語文字部分に追加するだけです。
>>> nltk.tokenize.RegexpTokenizer("[\\w']+|[^\\w\\s]+").tokenize("Let's check this out.")
["Let's", 'check', 'this', 'out', '.']
後処理
ただし、正規表現のアプローチは完璧ではありません。TextBlob のビルトイン トークナイザーは、正規表現でハッキングできるものよりも少し優れているのではないかと思います。厳密に短縮形を 1 つのトークンとして取りたい場合は、TextBlob の出力を後処理することをお勧めします。
>>> tokens = ["Let", "'s", "check", "this", "out", "."]
>>> def postproc(toks):
... toks_out = []
... while len(toks) > 1:
... bigram = toks[:2]
... if bigram[1][0] == "'":
... toks_out.append("".join(bigram))
... toks = toks[2:]
... else:
... toks_out.append(bigram[0])
... toks = toks[1:]
... toks_out.extend(toks)
... return toks_out
...
>>> postproc(tokens)
["Let's", 'check', 'this', 'out', '.']
したがって、修正したいものは正確に修正されますが、後処理全体がコードの実行時間を追加します。
于 2015-05-30T20:09:35.523 に答える