7

空白が削除された場合、英語 (または他の西洋言語) の文字列をどのようにトークン化するのだろうか?

質問のきっかけは村上小説「ダンス・ダンス・ダンス」の羊男キャラ

小説では、羊男は次のようなことを言っていると訳されています。

「私たちが言ったように、私たちはできることをします。あなたが望むものにあなたを再接続してみてください」と羊男は言いました。「だけど一人じゃできない。お前も働かなきゃ」

したがって、一部の句読点は保持されますが、すべてではありません。人間が読むには十分ですが、やや恣意的です。

このためのパーサーを構築するための戦略は何ですか? 文字の一般的な組み合わせ、音節数、条件付き文法、先読み/後読み正規表現など?

具体的には、Python に関して、(寛容な) 翻訳フローをどのように構築しますか? 完全な答えを求めるのではなく、あなたの思考プロセスがどのように問題を分解するかを求めているだけです。

私は軽薄な方法でこれを尋ねますが、興味深い (nlp/crypto/frequency/social) 回答が得られるかもしれない質問だと思います。ありがとう!

4

4 に答える 4

4

私は実際に約8か月前に仕事のためにこのようなことをしました. ハッシュテーブルで英単語の辞書を使用しました(O(1)ルックアップ時間)。単語全体に一致する文字ごとに移動します。うまく機能しますが、多くのあいまいさがあります。(お尻はお尻のヒットまたはたわごとのいずれかです)。これらのあいまいさを解決するには、より洗練された文法分析が必要になります。

于 2010-10-03T22:12:20.667 に答える
2

まず第一に、英単語の辞書が必要だと思います。何らかの統計分析のみに依存する方法を試すこともできますが、辞書を使用したほうが良い結果が得られる可能性が高いと思います。

単語を取得したら、次の 2 つのアプローチが考えられます。

単語を文法カテゴリに分類し、正式な文法を使用して文を解析できます-明らかに、一致しない場合や複数の一致が得られる場合があります-場合に備えて文法規則を緩めることができる手法に精通していません一致するものはありませんが、いくつかあるはずです。

一方、英語のテキストの大規模なコーパスを取得して、特定の単語が隣り合っている相対確率を計算するだけで、単語のペアとトリプルのリストを取得できます。そのデータ構造はかなり大きくなるため、単語のカテゴリ (文法および/または意味に基づく) を使用して単純化できます。次に、オートマトンを作成し、単語間の最も可能性の高い遷移を選択します。

もっと多くの可能なアプローチがあると確信しています。前述の 2 つを組み合わせて、規則に重みを付けたある種の文法を構築することもできます。実験するための豊富なフィールドです。

于 2010-10-03T22:16:19.097 に答える
1

これがあなたの役に立つかどうかはわかりませんが、このスペル修正プログラムを何らかの方法で利用できるかもしれません。

于 2010-10-04T00:41:25.060 に答える
1

これは、あなたが与えたようなスニペットから単語を抽出するのにかなりうまくいくと思う、私が書いた簡単なコードです...完全には考えられていませんが、できなければこれらの行に沿った何かがうまくいくと思います事前にパッケージ化されたタイプのソリューションを見つける

 textstring = "likewesaid, we'lldowhatwecan. Trytoreconnectyou, towhatyouwant," said the Sheep Man. "Butwecan'tdoit-alone. Yougottaworktoo."

indiv_characters = list(textstring) #splits string into individual characters

teststring = ''
sequential_indiv_word_list = []

for cur_char in indiv_characters:
    teststring = teststring + cur_char
    # do some action here to test the testsring against an English dictionary where you can API into it to get True / False if it exists as an entry
    if in_english_dict == True:
        sequential_indiv_word_list.append(teststring)
        teststring = ''

#at the end just assemble a sentence from the pieces of sequential_indiv_word_list by putting a space between each word

一致が返されない場合など、解決すべき問題がいくつかあります。これは、文字を追加し続けると一致しないため、明らかに機能しませんが、デモ文字列にはいくつかのスペースが含まれているため、それを使用できますこれらも認識し、これらのそれぞれから自動的にやり直します。

また、句読点を考慮する必要があり、次のような条件を記述します

if cur_char == ',' or cur_char =='.':
   #do action to start new "word" automatically
于 2010-10-04T00:50:08.010 に答える