Python 如何找到特定类型的单词并进行计数
我试图识别一个特定的单词,然后数一数。我需要保存每个标识符的计数 例如,文档可能包含以下内容:Python 如何找到特定类型的单词并进行计数,python,Python,我试图识别一个特定的单词,然后数一数。我需要保存每个标识符的计数 例如,文档可能包含以下内容: risk risk risk free interest rate asterisk risk risk market risk risk [risk *我需要计算“风险”而不是星号。可能还有其他与风险相关的词,所以不要坚持上面的例子。我需要找到的是“风险”。如果风险以])等结束或开始。。我也要数一数。但如果风险词是星号这样的词的一个组成部分,那么我就不应该把它计算在内 这是我到目前为止所拥
risk risk risk free interest rate
asterisk risk risk
market risk risk [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]
使用正则表达式实际上很容易做到这一点:
import re
haystack = "risk asterisk risk brisk risk"
prog = re.compile(r'\brisk\b')
result = re.findall(prog, haystack)
print len(result)
这将输出“3”
\b regexp表示任何单词分隔符,包括行尾/行首。使用正则表达式实际上很容易做到这一点:
import re
haystack = "risk asterisk risk brisk risk"
prog = re.compile(r'\brisk\b')
result = re.findall(prog, haystack)
print len(result)
这将输出“3”
\b regexp表示任何单词分隔符,包括行尾/行首。正则表达式
(?如果前面或后面没有其他字母,则应与“risk”匹配。例如:
>>> len(re.findall('(?<![a-zA-Z])risk(?![a-zA-Z])','risk? 1risk asterisk risky'))
2
>>> 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
更新:
在回答你的问题时,我现在明白了你的要求。你可以使用我向你展示的相同类型的结构,但经过修改以包含以下所有单词:
- 风险
- 冒险
- 危险的
- 危险的
- 冒险地
- 危险性
- 冒险
- 风险
- 危险的
有两种方法可以修改原始re;最直观的方法可能是只使用re或\
并将\-
添加到负面前瞻中,以防止匹配“无风险”等。例如:
>>> len(re.findall('(?<![a-zA-Z])risk(?![a-zA-Z])','risk? 1risk asterisk risky'))
2
>>> 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
加入([“风险”、“有风险的”、“更高的”、“最有风险的”、“有风险的”、“有风险的”、“有风险的”、“有风险的”、“有风险的”、“有风险的”、“有风险的”、“有风险的”))
>>>len(re.findall)(“(?正则表达式”)如果前面或后面没有其他字母,则应与“risk”匹配。例如:
>>> len(re.findall('(?<![a-zA-Z])risk(?![a-zA-Z])','risk? 1risk asterisk risky'))
2
>>> 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
更新:
在回答你的问题时,我现在明白了你的要求。你可以使用我向你展示的相同类型的结构,但经过修改以包含以下所有单词:
- 风险
- 冒险
- 危险的
- 危险的
- 冒险地
- 危险性
- 冒险
- 风险
- 危险的
有两种方法可以修改原始re;最直观的方法可能是只使用re或\
并将\-
添加到负面前瞻中,以防止匹配“无风险”等。例如:
>>> len(re.findall('(?<![a-zA-Z])risk(?![a-zA-Z])','risk? 1risk asterisk risky'))
2
>>> 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
加入([“风险”、“有风险的”、“更高的”、“最有风险的”、“有风险的”、“有风险的”、“有风险的”、“有风险的”、“有风险的”、“有风险的”、“有风险的”、“有风险的”))
>>>len(关于findall(“(?”如果风险以<[(或)!*>]之类的结尾或开头),等等。我也需要计算它。”…这样做吗?@Levon:当然不是,如果你想这样,你最好使用regular express。所以你的解决方案不起作用。这不是我想要的,而是OP需要帮助的。“如果风险以<[(或!*>])等结束或开始,我也需要计算。"…这能做到吗?@Levon:当然不能,如果你想这样做,你最好使用regular express。所以你的解决方案不起作用。这不是我想要的,这是OP要求帮助的。谢谢你的帮助。但是,可能有太多不同的词包含风险。因此,我想我无法编译。我将发布一个更详细的问题解释清楚。对不起。你是在计算任何单词出现的次数吗?你可以做r'\b[a-zA-Z]+\然后对结果数组进行排序,并对其进行分析以删除重复项。@Jimmy您可以修改正则表达式:r'\w+'
。如果还不够,您可以查看各种nltk标记器。您也可以不发布新的标记器。哦,我明白了。对不起,我是一个初学者,所以我想我必须在有新标记器时发布一个。我下一步会这样做我。谢谢你的帮助。但是,可能有太多不同的单词包含风险。因此,我想我不能只编译。我将发布一个问题,并给出更清楚的解释。对不起。那么你在尝试计算任何单词的出现次数?你可以做r'\b[a-zA-Z]+\然后对结果数组进行排序,并对其进行分析以删除重复项。@Jimmy您可以修改正则表达式:r'\w+'
。如果还不够,您可以查看各种nltk标记器。您也可以不发布新的标记器。哦,我明白了。对不起,我是一个初学者,所以我想我必须在有新标记器时发布一个。我下一步会这样做我。我需要对一个文件使用这个表达式并搜索所有的风险。那么,我如何使用findall函数来做到这一点呢?我不能用一个文件名来代替文本。我还需要找到所有的风险词,所以我不需要使用…in…?好吧,你可以做很多事情。如果你知道这个文件很小,你可以把整个文件读到一个string并在上面使用re。(如果文件太大,不建议使用b/c…糟糕的事情。)更安全的做法是打开文件,循环行,并在每行上使用findall。然后,您可以将每行找到的数字相加,得到“风险”的数字它在整个文件中。我需要对一个文件使用该表达式并搜索所有风险。那么,我如何使用findall函数来做到这一点呢?我不能用文件名代替文本。我还需要查找所有风险词,所以我不需要使用…in…?嗯,你可以做很多事情。如果你知道文件很小,你可以在将整个文件转换为一个字符串,并在该字符串上使用re。(如果文件太大,则不建议使用b/c…。更安全的做法是打开文件,在行上循环,并在每行上使用findall。然后,您可以将每行找到的数字相加,以获得整个文件中的“风险”数。可能重复的可能重复