Удаление пунктуации из списка строк, которые не являются частью слова - PullRequest
0 голосов
/ 04 октября 2019

Я пишу программу для обнаружения коллокаций биграмм (2 слова, которые появляются вместе чаще, чем случайно, например: хот-дог). Чтобы сделать это правильно, я должен удалить все знаки препинания, которые будут храниться как их собственный элемент, но сохранить знаки пунктуации, которые являются частью слова. Например, биграмма ['US flag'] должна содержать точки в США, но ['US,'] должна быть удалена запятая. Я написал цикл 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`

1 Ответ

0 голосов
/ 04 октября 2019

замена

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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...