-1

さて、私は次の小さな機能を持っています:

def swap(inp):
    inp = inp.split()
    out = ""

    for item in inp:
        ind  = inp.index(item)
        item = item.replace("i am",    "you are")
        item = item.replace("you are", "I am")
        item = item.replace("i'm",     "you're")
        item = item.replace("you're",  "I'm")
        item = item.replace("my",      "your")
        item = item.replace("your",    "my")
        item = item.replace("you",     "I")
        item = item.replace("my",      "your")
        item = item.replace("i",       "you")
        inp[ind] = item

    for item in inp:
        ind  = inp.index(item)
        item = item + " "
        inp[ind] = item

    return out.join(inp)

これは、特に効率的ではありませんが、短い文の仕事を成し遂げます. 基本的には、代名詞などの視点を入れ替えるだけです。これは、「I love you」のような文字列を投げると問題なく、「you love me」が返されますが、次のようなものを投げると:

you love your version of my couch because I love you, and you're a couch-lover.

私は得る:

I love your versyouon of your couch because I love I, and I'm a couch-lover. 

なぜこれが起こっているのか混乱しています。これを避けるために、文字列を明示的にリストに分割しました。完全一致ではなく、リスト項目の一部として検出できるのはなぜですか?

また、同様の別の質問を投稿する必要がないように、わずかに逸脱しています。これに対する解決策がこの機能を壊す場合、コンマ、ピリオド、その他の句読点はどうなりますか?

それはいくつかの非常に驚くべき間違いを犯しました。私の予想される出力は次のとおりです。

I love my version of your couch because you love I, and I'm a couch-lover.

このようにフォーマットした理由は、最終的に item.replace(x, y) 変数をデータベース内の単語に置き換えられるようにしたいからです。

4

3 に答える 3

2

この特定の問題には、正規表現が必要です。基本的に、次の行に沿って:

table = [
    ("I am", "you are"),
    ("I'm",  "you're"),
    ("my",   "your"),
    ("I",    "you"),
]

import re

def swap(s):
    dct = dict(table)
    dct.update((y, x) for x, y in table)
    return re.sub(
        '|'.join(r'(?:\b%s\b)' % x for x in dct),
        lambda m: dct[m.group(0)], 
        s)

print swap("you love your version of my couch because I love you, and you're a couch-lover.")
# I love my version of your couch because you love I, and I'm a couch-lover.

しかし、一般的に、string/re 関数による自然言語処理はせいぜいナイーブです (上記の「you love I」に注意してください)。

于 2012-12-16T11:06:21.487 に答える
1

簡単なコードを次に示します。

def swap(inp):
    inp = inp.split()
    out = []
    d1 = ['i am', 'you are', 'i\'m', 'you\'re', 'my', 'your', 'I', 'my', 'you']
    d2 = ['you are', 'I am', 'you\'re', 'I\'m', 'your', 'my', 'you', 'your', 'I']
    for item in inp:
        itm = item.replace(',','')
        if itm not in d1:
            out.append(item)
        else: out.append(d2[d1.index(itm)])
    return ' '.join(out)

    print(swap('you love your version of my couch because I love you, and you\'re a couch-lover.'))
于 2012-12-16T11:49:24.617 に答える
0

問題は、 と の両方index()replace()部分文字列 (この場合は部分単語) で機能することです。

別の質問に対する私の答えを見てください:辞書による文字列の置換、句読点による合併症

その回答のコードを使用して、問題を解決できます。

于 2012-12-16T10:54:30.617 に答える