Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何找到特定类型的单词并进行计数_Python - Fatal编程技术网

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。然后,您可以将每行找到的数字相加,以获得整个文件中的“风险”数。可能重复的可能重复