Python 用于检测列表中的专有名词的正则表达式
我有一个程序,显示文本中单词的频率列表(标记化文本),但我想要 首先:检测文本中的专有名词并将它们附加到另一个列表中(Cap_名词) 第二:将字典中没有的名词附加到另一个列表中(错误) 稍后,我想为发现的这些错误创建一个频率列表,并为发现的专有名词创建另一个频率列表 我检测专有名词的想法是找到以大写字母开头的项目,并将它们追加到此列表中,但我的正则表达式似乎无法执行此任务 有人能帮我吗?我的代码如下Python 用于检测列表中的专有名词的正则表达式,python,regex,word-frequency,Python,Regex,Word Frequency,我有一个程序,显示文本中单词的频率列表(标记化文本),但我想要 首先:检测文本中的专有名词并将它们附加到另一个列表中(Cap_名词) 第二:将字典中没有的名词附加到另一个列表中(错误) 稍后,我想为发现的这些错误创建一个频率列表,并为发现的专有名词创建另一个频率列表 我检测专有名词的想法是找到以大写字母开头的项目,并将它们追加到此列表中,但我的正则表达式似乎无法执行此任务 有人能帮我吗?我的代码如下 from collections import defaultdict import re im
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+")
看
详细信息
-一个可选的非捕获组,匹配1个或0个出现的1+字字符,后跟(?:\w+['')?
或'
'
-1个或多个单词字符\w+
-0次或更多重复(?:-(?:\w+[''])?\w+*
-一个可选的非捕获组,匹配1次或0次出现的1+字字符,后跟-(?:\w+['')?
或'
'
-1个或多个单词字符\w+
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”,我说在字符串开头找到一个大写字母单词