2

だから私がやろうとしているのは、文字列「キーワード」を "<b>keyword</b>" より大きな文字列に置き換えることです。

例:

myString = "こんにちは。あなたはその人をその仕事に就かせるべきです。こんにちは、こんにちは。"

キーワード = 「こんにちは」

私が望む結果は次のようになります。

result = "<b>HI</b> there. You should higher that person for the job. <b>Hi</b> <b>hi</b>."

ユーザーがキーワードを入力するまで、どのキーワードかはわかりません。また、クエリが実行されるまでコーパス (myString) もわかりません。

ほとんどの場合は機能する解決策を見つけましたが、誤検知がいくつかあり、 namely it would return "<b>hi<b/>gher"これは私が望んでいるものではありません。また、元のテキストの大文字と小文字を維持しようとしており、大文字と小文字に関係なく照合が行われることに注意してください。したがって、キーワードが「こんにちは」の場合は、置換する必要があります HI with <b>HI</b> and hi with <b>hi</b>.

私が最も近いのは、これのわずかに派生したバージョンを使用することです: http ://code.activestate.com/recipes/576715/ しかし、文字列の2番目のパスを実行してすべてのfalseを修正する方法をまだ理解できませんでした上記のポジティブ。

または、NLTK の WordPunctTokenizer (句読点のようなものを単純化します) を使用しますが、逆の機能がなく、myString の元の句読点を保持したい場合、文を元に戻す方法がわかりません。本質的に、すべてのトークンを連結しても元の文字列は返されません。たとえば、元のテキストに「7 - 7」があった場合、トークンを元のテキストに再グループ化するときに、「7 - 7」を「7-7」に置き換えたくありません。

それが十分に明確であることを願っています。簡単な問題のように思えますが、思ったより難しい問題でした。

4

4 に答える 4

0

最善の解決策は正規表現だと思います...

import re
def reg(keyword, myString) :
   regx = re.compile(r'\b(' + keyword + r')\b', re.IGNORECASE)
   return regx.sub(r'<b>\1</b>', myString)

もちろん、最初にキーワードを「正規表現セーフ」にする必要があります (正規表現の特殊文字を引用符で囲みます)。

于 2009-05-04T04:06:50.260 に答える
-1

これは、細かな検討委員会からの 1 つの提案です。:-)

myString = "HI there. You should higher that person for the job. Hi hi."

myString.replace('higher','hire')
于 2009-07-20T19:08:31.517 に答える