我正在编写一个程序来检测双字母组的搭配(两个单词在一起出现的频率比偶然出现的高,例如:热狗)。为了正确执行此操作,我必须删除所有将存储为它们自己的元素的标点符号,但要保留作为单词一部分的标点符号。例如,bigram ['U.S. flag']应该将句点保留在美国,但['U.S. ,']应该删除逗号。我编写了一个for循环,该循环遍历标点符号的列表,应该删除匹配的元素,但这不会改变任何内容。此外,我使用正则表达式删除了大多数标点符号,但是如果删除句点,则带有句点的单词也会被破坏。任何有效删除这些建议的建议将不胜感激!
到目前为止,这是我的代码:
f = open('Collocations.txt').read()
punctuation = [',', '.', '!', '?', '"', ':', "'", ';', '@', '&', '$', '#', '*', '^', '%', '{', '}']
filteredf = re.sub(r'[,":@#?!&$%}{]', '', f)
f = f.split()
print(len(f))
for i, j in zip (punctuation, f):
if i == j:
ind = f.index(j)
f.remove(f[ind])
print(len(f))
# removes first element in the temp list to prepare to make bigrams
temp = list()
temp2 = list()
temp = filteredf.split()
temp2 = filteredf.split()
temp2.remove(temp2[0])
# forms a list of bigrams
bi = list()
for i, j in zip(temp, temp2):
x = i + " " + j
bi.append(x)
#print(len(bi))
unigrams = dict()
for i in temp:
unigrams[i] = unigrams.get(i, 0) + 1
#print(len(unigrams))
bigrams = dict()
for i in bi:
bigrams[i] = bigrams.get(i, 0) + 1
#print(len(bigramenter code here`
答案 0 :(得分:0)
替换
for i, j in zip (punctuation, f):
if i == j:
ind = f.index(j)
f.remove(f[ind])
使用
while i < len(f)-2:
c1 = f[i]
c2 = f[i+1]
c3 = f[i+2]
if c2 in punctuation and not (c1 in string.ascii_letters and c3 in string.ascii_letters):
f = f[:i+1] + f[i+2:]
i+=1
将保留标有两边字母的标点符号(例如,美国将成为美国),但是在我看来,要说出最后一个句点和句号之间的区别是不可能的,例如美国.
和Hello .