Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.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_Regex_Word Frequency - Fatal编程技术网

Python 用于检测列表中的专有名词的正则表达式

Python 用于检测列表中的专有名词的正则表达式,python,regex,word-frequency,Python,Regex,Word Frequency,我有一个程序,显示文本中单词的频率列表(标记化文本),但我想要 首先:检测文本中的专有名词并将它们附加到另一个列表中(Cap_名词) 第二:将字典中没有的名词附加到另一个列表中(错误) 稍后,我想为发现的这些错误创建一个频率列表,并为发现的专有名词创建另一个频率列表 我检测专有名词的想法是找到以大写字母开头的项目,并将它们追加到此列表中,但我的正则表达式似乎无法执行此任务 有人能帮我吗?我的代码如下 from collections import defaultdict import re im

我有一个程序,显示文本中单词的频率列表(标记化文本),但我想要 首先:检测文本中的专有名词并将它们附加到另一个列表中(Cap_名词) 第二:将字典中没有的名词附加到另一个列表中(错误)

稍后,我想为发现的这些错误创建一个频率列表,并为发现的专有名词创建另一个频率列表

我检测专有名词的想法是找到以大写字母开头的项目,并将它们追加到此列表中,但我的正则表达式似乎无法执行此任务

有人能帮我吗?我的代码如下

from collections import defaultdict
import re
import nltk
from nltk.tokenize import word_tokenize



with open('fr-text.txt') as f:
    freq = word_tokenize(f.read())

with open ('Fr-dictionary_Upper_Low.txt') as fr:
    dic = word_tokenize(fr.read())


#regular expression to detect words with apostrophes and separated by hyphens    
pat=re.compile(r".,:;?!-'%|\b(\w'|w’)+\b|\w+(?:-\w+)+|\d+") 
reg= list(filter(pat.match, freq))
#regular expression for words that start with a capital letter
patt=re.compile(r"\b^A-Z\b")  
c_n= list(filter(patt.match, freq))

d=defaultdict(int)

#Empty list to append the items not found in the dictionary
errors=[ ]
Cnouns=[ ] #Empty list to append the items starting with a capital letter


for w in freq:
    d[w]+=1
    if w in reg:
        continue
    elif w in c_n:
        Cnouns.append(w)
    elif w not in dic:
        errors.append(w)



for w in sorted(d, key=d.get):
    print(w, d[w])


print(errors)
print(Cnouns)

如果我的代码还有什么问题,请告诉我

至于正则表达式部分,您的模式“有点偏离”。大多数情况下,您会忽略字符类的概念,即与类中定义的集合中的单个字符相匹配的类似于[abc]的模式

用于检测带撇号并用连字符分隔的单词的正则表达式:

pat=re.compile(r"(?:\w+['’])?\w+(?:-(?:\w+['’])?\w+)*") 
看。但是,它也将匹配常规数字或简单单词。为了避免匹配它们,您可以使用

pat=re.compile(r"(?:\w+['’])?\w+(?:-(?:\w+['’])?\w+)+|\w+['’]\w+")

详细信息

  • (?:\w+['')?
    -一个可选的非捕获组,匹配1个或0个出现的1+字字符,后跟
    '
    '
  • \w+
    -1个或多个单词字符
  • (?:-(?:\w+[''])?\w+*
    -0次或更多重复
    • -(?:\w+['')?
      -一个可选的非捕获组,匹配1次或0次出现的1+字字符,后跟
      '
      '
    • \w+
      -1个或多个单词字符
接下来,
reg=list(filter(pat.match,freq))
可能无法执行您需要的操作,因为
re.match
。您很可能希望使用
re.match

reg = list(filter(pat.search, freq))
                      ^^^^^^
以大写字母开头的单词的正则表达式可以写成

patt=re.compile(r"\b[A-Z][a-z]*\b")  
c_n= list(filter(patt.search, freq))


\b
匹配单词边界,
[a-Z]
匹配任何大写ASCII字母,
[a-Z]*
部分匹配0个或多个小写ASCII字母,
\b
确保它们后面有一个单词边界。

r“\b^a-Z\b”
看起来像一个打字错误。你是想写
r“^[A-Z]\b”
在字符串开头找到一个大写字母单词吗?@WiktorStribiżew,是的!这就是我想要的…我会试试这个正则表达式。谢谢。您似乎误解了如何匹配列表或字符范围中的字符<代码>,:;?!-'%最有可能是
[,:;?!'%-]
。还有,
(\w'| w')
应该是什么意思<代码>\w['']?(\w'| w')是指一个包含撇号的单词,如“d'un”或“d'elyse”。您建议检测以大写字母开头的单词的正则表达式不起作用我没有说“start”,我说在字符串开头找到一个大写字母单词