2012-12-30 10 views
29

NLTKを使用していくつかの古典的なテキストを分析していますが、文章でテキストをトークン化するのに問題があります。例えば、ここで私はMoby Dickからスニペットのために得るものです:NLTK文トークナイザを調整する方法

import nltk 
sent_tokenize = nltk.data.load('tokenizers/punkt/english.pickle') 

''' 
(Chapter 16) 
A clam for supper? a cold clam; is THAT what you mean, Mrs. Hussey?" says I, "but 
that's a rather cold and clammy reception in the winter time, ain't it, Mrs. Hussey?" 
''' 
sample = 'A clam for supper? a cold clam; is THAT what you mean, Mrs. Hussey?" says I, "but that\'s a rather cold and clammy reception in the winter time, ain\'t it, Mrs. Hussey?"' 

print "\n-----\n".join(sent_tokenize.tokenize(sample)) 
''' 
OUTPUT 
"A clam for supper? 
----- 
a cold clam; is THAT what you mean, Mrs. 
----- 
Hussey? 
----- 
" says I, "but that\'s a rather cold and clammy reception in the winter time, ain\'t it, Mrs. 
----- 
Hussey? 
----- 
" 
''' 

私はメルヴィルの構文は少し日付であることを考えると、ここで完璧を期待していませんが、NLTKは、末端に二重引用符を処理することができるはずです「Mrs.」のようなタイトルしかし、トークナイザは、教師なしのトレーニングアルゴの結果であるため、どのようにそれを操作するのか把握することはできません。

誰かが良いsentence tokenizerのための推薦を持っていますか?私は、自分のパーサを訓練するよりも、簡単にヒューリスティックで、ハックすることができます。

答えて

40

from nltk.tokenize.punkt import PunktSentenceTokenizer, PunktParameters 
punkt_param = PunktParameters() 
punkt_param.abbrev_types = set(['dr', 'vs', 'mr', 'mrs', 'prof', 'inc']) 
sentence_splitter = PunktSentenceTokenizer(punkt_param) 
text = "is THAT what you mean, Mrs. Hussey?" 
sentences = sentence_splitter.tokenize(text) 

文は以下のようになります。

['is THAT what you mean, Mrs. Hussey?'] 

更新:文の最後の単語にアポストロフィや引用符が添付されていると、これは機能しません(Hussey? 'など)。したがって、この周りに間に合わせとウェイは文末記号に続くアポストロフィと引用符の前にスペースを置くことである(!?):

text = text.replace('?"', '? "').replace('!"', '! "').replace('."', '. "') 
+0

ああ、よく知っておいてください。不思議なことに、私の質問であなたの解決策を通して完全な文を実行すると、これは機能しません。どんな考え? –

+0

答えにもう少し詳しい情報を追加しました。 – vpekar

+3

私は一般的に「感謝」のコメントを避けていますが、ここには本当にあります。ありがとう! – Private

7

realign_boundariesパラメータをTrueに設定することによって、PunktSentenceTokenizer.tokenizeメソッドに残りの文章に「ターミナル」二重引用符を含めるように指示できます。例については、以下のコードを参照してください。

Mrs. Husseyのようなテキストが2つの文に分割されないようにする明確な方法はわかりません。しかし、ここでは、その後sent_tokenize.tokenizeと文章にテキストを分割

    • Mrs._HusseyMrs. Husseyのすべての出現を狂わせるハック、各文について、その後
    • は、あるMrs. Hussey
    に戻っMrs._Hussey unmangles

    私はもっと良い方法を知りたがっていますが、これはピンチで動作する可能性があります。


    import nltk 
    import re 
    import functools 
    
    mangle = functools.partial(re.sub, r'([MD]rs?[.]) ([A-Z])', r'\1_\2') 
    unmangle = functools.partial(re.sub, r'([MD]rs?[.])_([A-Z])', r'\1 \2') 
    
    sent_tokenize = nltk.data.load('tokenizers/punkt/english.pickle') 
    
    sample = '''"A clam for supper? a cold clam; is THAT what you mean, Mrs. Hussey?" says I, "but that\'s a rather cold and clammy reception in the winter time, ain\'t it, Mrs. Hussey?"'''  
    
    sample = mangle(sample) 
    sentences = [unmangle(sent) for sent in sent_tokenize.tokenize(
        sample, realign_boundaries = True)]  
    
    print u"\n-----\n".join(sentences) 
    

    あなたがそうのように、トークナイザに略語のリストを指定する必要があり利回り

    "A clam for supper? 
    ----- 
    a cold clam; is THAT what you mean, Mrs. Hussey?" 
    ----- 
    says I, "but that's a rather cold and clammy reception in the winter time, ain't it, Mrs. Hussey?" 
    
  • +0

    を参照してください。 –

    +0

    更新:この回答の一部を上記のものと結びました –

    2

    は、だから私は同様の問題を持っていたvpekarのソリューションを試してみました上記。

    おそらく鉱山はある種の縁の場合ですが、私は置換えを適用した後も同じような動作を観察しましたが、句読点をそれらの前に置かれた引用符で置き換えようとしたとき、私は探していた出力を得ました。おそらく、MLAへの遵守の欠如は、元の見積もりを単一の文として保持するより重要ではない。

    より明確にする:

    text = text.replace('?"', '"?').replace('!"', '"!').replace('."', '".') 
    

    あなたはいつも戻って、それがカウントどこにこれらの変更を元に戻すことができてもMLAが重要な場合。

    24

    NLTKの事前にトレーニングされた英語のセンテンストークナイザを変更して、より多くの略語を認識させることができます。これは、_params.abbrev_typesに追加します。略語は、最終的な期間なしで指定しなければならないが、上記'i.e'のように任意の内部の期間を含むないこと

    extra_abbreviations = ['dr', 'vs', 'mr', 'mrs', 'prof', 'inc', 'i.e'] 
    sentence_tokenizer = nltk.data.load('tokenizers/punkt/english.pickle') 
    sentence_tokenizer._params.abbrev_types.update(extra_abbreviations) 
    

    注:例えば。他のトークナイザのパラメータの詳細については、the relevant documentation.

    +1

    を参照してください。新しいトークナイザを作成するだけであれば、英語トークナイザの既存の機能をすべて使用することはできません。 –

    +0

    それは私のために働いていないようでしたが、トップの回答はしました。 – Alter

    関連する問題