0

正規表現を使用して、単語の文字列を単語のリストに分割しようとしています。私はまだ正規表現の初心者です。

私はnltk.regex_tokenizeを使用しています。これは、近い結果をもたらしますが、私が望むものとはまったく異なります。

これは私がこれまでに持っているものです:

>>> import re, codecs, nltk
>>> sentence = "détesté Rochard ! m'étais à... 'C'est hyper-cool.' :) :P"    
>>> pattern = r"""(?x)
    #words with internal hyphens
    | \w+(-\w+)*
    #ellipsis
    | \.\.\.
    #other punctuation tokens
    | [][.,;!?"'():-_`]
    """ 
>>> nltk.regexp_tokenize(sentence.decode("utf8"), pattern)
[u'd\xe9test\xe9', u'Rochard', u'!', u'm', u"'", u'\xe9tais', u'\xe0', u'qu', u"'", u'on', u'...', u"'", u'C', u"'", u'est', u'hyper-cool', u'.', u"'", u':', u')', u':', u'P']

次のような出力が必要です。

[u'd\xe9test\xe9', u'Rochard', u'!', u"m'", u'\xe9tais', u'\xe0', u"qu'", u'on', u'...', u"'", u"C'", u'est', u'hyper-cool', u'.', u"'", u':)', u':P']

「絵文字」の回避策があるので、私が最も懸念しているのは引用符です。

4

1 に答える 1

1

目的の出力が入力文と一致していないようです

  1. [u"qu'", u'on']: この 2 つの一致が、あなたの文からどこから判断されたのかわかりません
  2. Why u'.'was not part of u'hyper-cool'(単語の一部として句読点が必要だと仮定します。
  3. u"'"の一部ではなかった理由u"C'"。(単語の一部として句読点が必要であると仮定します。

また、正規表現を分割したいだけの場合、行を分割する以外に nltk を使用している理由はありますか? 私は経験がないnltkので、単なるregex解決策を提案します。

>>> sentence
u"d\xe9test\xe9 Rochard ! m'\xe9tais \xe0... 'C'est hyper-cool.' :) :P"
>>> pattern=re.compile(
    u"(" #Capturing Group
    "(?:" #Non Capturing
    "[\.\.\.\]\[\.,;\!\?\"\'\(\):-_`]?" #0-1 punctuation
    "[\w\-]+"                           #Alphanumeric Unicode Word with hypen
    "[\.\.\.\]\[\.,;\!\?\"\'\(\):-_`]?" #0-1 punctuation
    ")"
    "|(?:[\.\.\.\]\[\.,;\!\?\"\'\(\):-_`]+)" #1- punctuation
     ")",re.UNICODE)
>>> pattern.findall(sentence)
[u'd\xe9test\xe9', u'Rochard', u'!', u"m'", u'\xe9tais', u'\xe0.', u'..', u"'C'", u'est', u'hyper-cool.', u"'", u':)', u':P']

これがうまくいくかどうかを確認してください

Capturing Group、Non-Capturing Group、Character Class、Unicode Match、および findall に関する詳細情報が必要な場合は、python のreパッケージをざっと見てみることをお勧めします。また、このシナリオで文字列を複数行に継続する方法が適切かどうかもわかりません。文字列を複数行に分割する方法 (複数行の文字列ではない) の詳細については、こちらを参照してください

于 2011-12-17T07:55:05.927 に答える