18

ドキュメントから文のリストを抽出しました。この文のリストを前処理して、より意味のあるものにしています。次の問題に直面しています

のような文があります。"more recen t ly the develop ment, wh ich is a po ten t "

このような文章を辞書を引いて直したいのですが?不要なスペースを削除します。

最終的な出力は"more recently the development, which is a potent "

これは、テキストの前処理における単純な作業だと思いますか? そのようなアプローチを探すには、いくつかの指針が必要です。ありがとう。

4

7 に答える 7

8

単語またはテキストのセグメンテーションをご覧ください。問題は、文字列を単語のグループに分割する可能性が最も高いものを見つけることです。例:

 thequickbrownfoxjumpsoverthelazydog

もちろん、最も可能性の高いセグメンテーションは次のとおりです。

 the quick brown fox jumps over the lazy dog

これは、 Google Ngramコーパスを使用した問題のプロトタイプ ソース コードを含む記事です。

このアルゴリズムが機能するための鍵は、世界に関する知識へのアクセスです。この場合、ある言語の単語の頻度です。ここの記事で説明されているアルゴリズムのバージョンを実装しました。

使用例:

$ python segmentation.py t hequi ckbrownfoxjum ped
thequickbrownfoxjumped
['the', 'quick', 'brown', 'fox', 'jumped']

データを使用すると、これでも並べ替えることができます。

$ python segmentation.py lmaoro fll olwt f pwned
lmaorofllolwtfpwned
['lmao', 'rofl', 'lol', 'wtf', 'pwned']

このアルゴリズムは非常に遅いことに注意してください。これは典型的なものです。

NLTK を使用した別のアプローチ:

あなたの問題に関しては、単一の文字列を取得するために必要なすべての文字列部分を連結し、その上でセグメンテーション アルゴリズムを実行することができます。

于 2013-10-30T06:20:54.790 に答える
4

あなたの目標はテキストを改善することであり、必ずしも完全にすることではありません。したがって、あなたが概説するアプローチは私の意見では理にかなっています。私はそれをシンプルに保ち、「貪欲な」アプローチを使用します。最初のフラグメントから始めて、結果が辞書にある限り、それに断片を貼り付けます。結果がそうでない場合は、これまでに持っていたものを吐き出して、次のフラグメントからやり直してください。はい、ときどき、 のようなケースで間違いを犯すことがありますthe me thod。したがって、これを頻繁に使用する場合は、より洗練されたものを探すことができます。ただし、おそらくそれで十分です。

主に必要なのは大きな辞書です。頻繁に使用する場合は、フラグメントが実際の単語の始まりであるかどうかをすぐに確認できるように、「接頭辞ツリー」(別名trie ) としてエンコードします。nltk はTrie 実装を提供します。

この種の誤った単語区切りには一貫性がないため、現在のドキュメントで既に処理されている単語で辞書を拡張することもできます。以前に完全な単語を見たことがあるかもしれませんが、今では分割されています。

于 2013-11-01T23:28:45.400 に答える
2

これは本当に基本的なものです:

chunks = []
for chunk in my_str.split():
    chunks.append(chunk)
    joined = ''.join(chunks)
    if is_word(joined):
        print joined,
        del chunks[:]

# deal with left overs
if chunks:
    print ''.join(chunks)

実装に使用できる有効な単語のセットがどこかにあると思いますis_word。また、句読点を確実に処理する必要があります。これを行う1つの方法は次のとおりです。

def is_word(wd):
    if not wd:
        return False
    # Strip of trailing punctuation. There might be stuff in front
    # that you want to strip too, such as open parentheses; this is
    # just to give the idea, not a complete solution.
    if wd[-1] in ',.!?;:':
        wd = wd[:-1]
    return wd in valid_words
于 2013-10-30T06:37:39.323 に答える
2

単語の辞書を反復処理して、最適なものを見つけることができます。一致が見つからない場合は単語を追加します。

def iterate(word,dictionary):
   for word in dictionary:
      if words in possibleWord:
        finished_sentence.append(words)
        added = True
      else:
        added = False
      return [added,finished_sentence]
sentence = "more recen t ly the develop ment, wh ich is a po ten t "
finished_sentence = ""
sentence = sentence.split()
for word in sentence:
  added,new_word = interate(word,dictionary)
  while True:   
    if added == False:
      word += possible[sentence.find(possibleWord)]
      iterate(word,dictionary)
    else:
      break
  finished_sentence.append(word)

これはうまくいくはずです。変数については、すべての英単語dictionaryの txtファイルをダウンロードし、プログラムで開きます。

于 2013-11-20T18:23:55.530 に答える