1

そこで、段落を文、単語、文字に分割するセンテンス トークナイザーを作成しました。これらはそれぞれデータ型です。しかし文系は二段式です。. .' それを捨てて、一度に1文字ずつ行くのを感じますが、スペースのない「...」であれば問題なく動作します。

そのため、出力は少しつなぎ合わされていますが、二次処理を行うことができれば、完全に機能します。それが私の質問の出番です...途中で何かを失うことなく、文末の句読点のない各文を前の文に追加できるシステムを書く方法がわかりません。

出力がどのように見えるか、およびどのように表示する必要があるかの例を次に示します。

接合されたいくつかの文...

そして続きがあります

これは米国が混同することはできません

その中で

最後の文...

略語が文を終了しました!

そのため、通常の文末区切り文字で終わらない文オブジェクト、つまり「.」、「?」、「!」次の文に追加する必要があります...実際の文末区切り文字を持つ文が存在するまで。これを難しくしているもう1つのことは、「. . .' 文の終わりではなく、継続としてカウントされます。したがって、それも追加する必要があります。

これが必要な方法です:

つなぎ合わされた…そして続きのある文。

これは米国が混同することはできません

その最後の文では...略語が文を終わらせました!

これが私が使っていたコードです:

 last = []  
 merge = []
 for s in stream:
        if last:
           old = last.pop()
           if '.' not in old.as_utf8 and '?' not in old.as_utf8 and '!' not in old.as_utf8:

               new = old + s 
               merge.append(new)
           else:
               merge.append(s)
          last.append(s)

そのため、この方法にはいくつかの問題があります...

  1. 1つの文を別の文に追加するだけですが、追加する必要がある文が2つまたは3つある場合は追加しません。

  2. 句読点が含まれていない場合は、最初の文が削除されます。

  3. ' には対応していません。. .' 続きとして。私はこれについて何も書いていないことを知っています。それは、「.」の数を数えることができたので、省略形で終わる文でその問題にアプローチする方法が完全にわからないためです。が文の中にありますが、「USA」は 3 ピリオドとしてカウントされるため、実際には 'USA' によって破棄されます。

だから私は__add__文クラスにメソッドを書いたので、あなたはそれを行うことができ、それはsentence + sentence一方を他方に追加する方法として機能します。

これについて何か助けていただければ幸いです。不明な点がありましたらお知らせください。可能な限り対応させていただきます。

4

3 に答える 3

2

この「アルゴリズム」は、次のような入力で正しく機能するよう、行末に依存せずに入力を理解しようとします。

born in the U.
S.A.

このコードは、ステート マシンに統合するのに適しています。ループは、現在のフレーズのみを記憶し、完成したフレーズをリストに「プッシュ」して、一度に 1 語ずつ読み込んでいきます。空白で分割するのは良いことです。

ケース#5のあいまいさに注意してください:これは確実に解決することはできません(そして、行末にもそのようなあいまいさがある可能性があります。おそらく両方を組み合わせる...)

# Sample decoded data
decoded = [ 'Some', 'sentence', 'that', 'is', 'spliced.', '.', '.',
    'and', 'has', 'a', 'continuation.',
    'this', 'cannot', 'be', 'confused', 'by', 'U.', 'S.', 'A.', 'or', 'U.S.A.',
    'In', 'that', 'last', 'sentence...',
    'an', 'abbreviation', 'ended', 'the', 'sentence!' ]

# List of phrases
phrases = []

# Current phrase
phrase    = ''

while decoded:
    word = decoded.pop(0)
    # Possibilities:
    # 1. phrase has no terminator. Then we surely add word to phrase.
    if not phrase[-1:] in ('.', '?', '!'):
        phrase += ('' if '' == phrase else ' ') + word
        continue
    # 2. There was a terminator. Which?
    #    Say phrase is dot-terminated...
    if '.' == phrase[-1:]:
        # BUT it is terminated by several dots.
        if '..' == phrase[-2:]:
            if '.' == word:
                phrase += '.'
            else:
                phrase += ' ' + word
            continue
        # ...and word is dot-terminated. "by U." and "S.", or "the." and ".".
        if '.' == word[-1:]:
            phrase += word
            continue
        # Do we have an abbreviation?
        if len(phrase) > 3:
            if '.' == phrase[-3:-2]:
                # 5. We have an ambiguity, we solve using capitals.
                if word[:1].upper() == word[:1]:
                    phrases.append(phrase)
                    phrase = word
                    continue
                phrase += ' ' + word
                continue
        # Something else. Then phrase is completed and restarted.
        phrases.append(phrase)
        phrase = word
        continue
    # 3. Another terminator.
        phrases.append(phrase)
        phrase = word
        continue

phrases.append(phrase)

for p in phrases:
    print ">> " + p

出力:

>> Some sentence that is spliced... and has a continuation.
>> this cannot be confused by U.S.A. or U.S.A.
>> In that last sentence... an abbreviation ended the sentence!
于 2013-06-21T22:51:25.863 に答える