1

特定の単語を識別して数えようとしています。識別子ごとにカウントを保存する必要があります。

たとえば、ドキュメントには次のような内容が含まれる場合があります。

risk risk risk free interest rate 

asterisk risk risk 

market risk risk [risk

*アスタリスクではなく「リスク」を数える必要があります。他のリスク関連の単語がある可能性があるため、上記の例に固​​執しないでください。私が見つけなければならないのは「リスク」です。リスクが < [ ( または . ! * > ] ) などで終わるか始まる場合は、それもカウントする必要があります。しかし、リスクワードがアスタリスクのような単語の構成要素である場合、それを数えるべきではありません。

これが私がこれまでに持っているものです。ただし、リスクだけでなく、アスタリスクと [リスクのカウントも返します。正規表現を使用しようとしましたが、エラーが発生し続けます。さらに、私はPythonの初心者です。誰かが何か考えがあれば、私を助けてください!!^^ ありがとう。

from collections import defaultdict
word_dict=defaultdict(int)

for line in mylist:
    words=line.lower().split()  # converted all words to lower case
    for word in words:
        word_dict[word]+=1

for word in word_dict:
    if 'risk' in word:
       word, word_dict[word]
4

3 に答える 3

2

実際、正規表現を使用してこれを行うのは非常に簡単です。

import re
haystack = "risk asterisk risk brisk risk"
prog = re.compile(r'\brisk\b')
result = re.findall(prog, haystack)
print len(result)

これは「3」を出力します。

\b 正規表現は、行末/行頭を含む任意の単語区切り文字を意味します。

于 2012-09-01T00:09:58.850 に答える
2

正規表現(?<![a-zA-Z])risk(?![a-zA-Z])は、前後に別の文字がない場合、「risk」と一致する必要があります。例えば:

>>> len(re.findall('(?<![a-zA-Z])risk(?![a-zA-Z])','risk? 1risk asterisk risky'))
2

この re の内訳は次のとおりです。

  • (?<![a-zA-Z])この否定的な後読みアサーションは[a-zA-Z]、文字に一致するだけの一致 for が前にない場合にのみ一致が発生することを示しています。
  • riskこれは「リスク」に一致する中心的な re です。ここには派手なものはありません...
  • (?![a-zA-Z])これは最初の部分に似ています。これは、文字が続かない場合にのみ一致を発生させる否定的な先読みアサーションです。

たとえば、"1risk" のように数字の前にあるものも照合したくないとします。[a-zA-Z]re の部分を に変更するだけ[a-zA-Z0-9]です。例えば。:

>>> len(re.findall('(?<![a-zA-Z0-9])risk(?![a-zA-Z0-9])','risk? 1risk asterisk risky'))
1

更新: How to replace words, count a word, and save the count という 質問に答えて、あなたが求めているものを手に入れました。私が示したのと同じタイプの構造を使用できますが、これらの単語をすべて含めるように変更されています。

  • 危険
  • 危険を冒した
  • より危険な
  • 最も危険な
  • 危険な
  • リスク
  • 危険を冒す
  • リスク
  • リスキーな

元の re を変更するには、いくつかの方法があります。最も直感的なのは、おそらく re OR|を使用して否定先読みに追加し\-、「リスクフリー」などでの一致を防ぐことです。例えば:

>>> words = '|'.join(["risk","risked","riskier","riskiest","riskily","riskiness","risking","risks","risky"])
>>> len(re.findall('(?<![a-zA-Z])(%s)(?![a-zA-Z\-])' % words, 'risk? 1risk risky risk-free'))
3
于 2012-09-01T00:17:48.833 に答える
0
if 'risk' == word:
    print word, word_dict[word]
于 2012-09-01T00:04:09.023 に答える