仅从文本中删除未知单词,但保留标点符号和数字
remove only the unknown words from a text but leave punctuation and digits
我有一篇法语文本,其中包含用 space 分隔的单词(例如 répu blique*)。我想从文本中删除这些分隔的单词并将它们附加到列表中,同时在文本中保留标点符号和数字。我的代码适用于附加分隔的单词,但无法将数字保留在文本中。
import nltk
from nltk.tokenize import word_tokenize
import re
with open ('french_text.txt') as tx:
#opening text containing the separated words
#stores the text with the separated words
text = word_tokenize(tx.read().lower())
with open ('Fr-dictionary.txt') as fr: #opens the dictionary
dic = word_tokenize(fr.read().lower()) #stores the first dictionary
pat=re.compile(r'[.?\-",:]+|\d+')
out_file=open("newtext.txt","w") #defining name of output file
valid_words=[ ] #empty list to append the words checked by the dictionary
invalid_words=[ ] #empty list to append the errors found
for word in text:
reg=pat.findall(word)
if reg is True:
valid_words.append(word)
elif word in dic:
valid_words.append(word)#appending to a list the words checked
else:
invalid_words.append(word) #appending the invalid_words
a=' '.join(valid_words) #converting list into a string
print(a) #print converted list
print(invalid_words) #print errors found
out_file.write(a) #writing the output to a file
out_file.close()
因此,使用此代码,我的错误列表中包含数字。
['ments', 'prési', 'répu', 'blique', 'diri', 'geants', '»', 'grand-est', 'elysée', 'emmanuel', 'macron', 'sncf', 'pepy', 'montparnasse', '1er', '2017.', 'geoffroy', 'hasselt', 'afp', 's', 'empare', 'sncf', 'grand-est', '26', 'elysée', 'emmanuel', 'macron', 'sncf', 'saint-dié', 'epinal', '23', '2018', 'etat', 's', 'vosges', '2018']
我认为问题出在正则表达式上。有什么建议么?谢谢!!
问题出在您检查 reg is True
的 if 语句中。您不应该将 is
运算符与 True
一起使用来检查 pat.findall(word)
的结果是否为正(即您有一个匹配的词)。
您可以这样做:
for word in text:
if pat.match(word):
valid_words.append(word)
elif word in dic:
valid_words.append(word)#appending to a list the words checked
else:
invalid_words.append(word) #appending the invalid_words
警告用户:这实际上是一个复杂的问题,因为这完全取决于我们定义的单词:
- 是
l’Académie
一个词,那j’eus
呢?
- 是
gallo-romanes
一个词,还是c'est-à-dire
?
J.-C.
怎么样?
- 和
xiv(e)
(带上标,如 14 世纪)?
- 然后
QDN
或 QQ1
或 LOL
?
这是一个直接解决方案,总结为:
- 将文本分解为 "words" 和 "non-words"(标点符号、空格)
- 根据字典验证"words"
# Adjust this to your locale
WORD = re.compile(r'\w+')
text = "foo bar, baz"
while True:
m = WORD.search(text)
if not m:
if text:
print(f"punctuation: {text!r}")
break
start, end = m.span()
punctuation = text[:start]
word = text[start:end]
text = text[end:]
if punctuation:
print(f"punctuation: {punctuation!r}")
print(f"possible word: {word!r}")
possible word: 'foo'
punctuation: ' '
possible word: 'bar'
punctuation: ', '
possible word: 'baz'
我觉得您正在尝试处理故意拼写错误/分解的单词,例如如果有人试图绕过论坛黑名单规则或言论分析。
那么,更好的方法将是:
- 使用字典识别可能是 "word" 或 "non-word" 的内容
- 然后把正文拆开
如果原始文本是为了避开计算机但人类可读,那么最好的选择是 ML/AI,最有可能是神经网络,例如用于识别图像中的对象的 RNN。
我有一篇法语文本,其中包含用 space 分隔的单词(例如 répu blique*)。我想从文本中删除这些分隔的单词并将它们附加到列表中,同时在文本中保留标点符号和数字。我的代码适用于附加分隔的单词,但无法将数字保留在文本中。
import nltk
from nltk.tokenize import word_tokenize
import re
with open ('french_text.txt') as tx:
#opening text containing the separated words
#stores the text with the separated words
text = word_tokenize(tx.read().lower())
with open ('Fr-dictionary.txt') as fr: #opens the dictionary
dic = word_tokenize(fr.read().lower()) #stores the first dictionary
pat=re.compile(r'[.?\-",:]+|\d+')
out_file=open("newtext.txt","w") #defining name of output file
valid_words=[ ] #empty list to append the words checked by the dictionary
invalid_words=[ ] #empty list to append the errors found
for word in text:
reg=pat.findall(word)
if reg is True:
valid_words.append(word)
elif word in dic:
valid_words.append(word)#appending to a list the words checked
else:
invalid_words.append(word) #appending the invalid_words
a=' '.join(valid_words) #converting list into a string
print(a) #print converted list
print(invalid_words) #print errors found
out_file.write(a) #writing the output to a file
out_file.close()
因此,使用此代码,我的错误列表中包含数字。
['ments', 'prési', 'répu', 'blique', 'diri', 'geants', '»', 'grand-est', 'elysée', 'emmanuel', 'macron', 'sncf', 'pepy', 'montparnasse', '1er', '2017.', 'geoffroy', 'hasselt', 'afp', 's', 'empare', 'sncf', 'grand-est', '26', 'elysée', 'emmanuel', 'macron', 'sncf', 'saint-dié', 'epinal', '23', '2018', 'etat', 's', 'vosges', '2018']
我认为问题出在正则表达式上。有什么建议么?谢谢!!
问题出在您检查 reg is True
的 if 语句中。您不应该将 is
运算符与 True
一起使用来检查 pat.findall(word)
的结果是否为正(即您有一个匹配的词)。
您可以这样做:
for word in text:
if pat.match(word):
valid_words.append(word)
elif word in dic:
valid_words.append(word)#appending to a list the words checked
else:
invalid_words.append(word) #appending the invalid_words
警告用户:这实际上是一个复杂的问题,因为这完全取决于我们定义的单词:
- 是
l’Académie
一个词,那j’eus
呢? - 是
gallo-romanes
一个词,还是c'est-à-dire
? J.-C.
怎么样?- 和
xiv(e)
(带上标,如 14 世纪)? - 然后
QDN
或QQ1
或LOL
?
这是一个直接解决方案,总结为:
- 将文本分解为 "words" 和 "non-words"(标点符号、空格)
- 根据字典验证"words"
# Adjust this to your locale
WORD = re.compile(r'\w+')
text = "foo bar, baz"
while True:
m = WORD.search(text)
if not m:
if text:
print(f"punctuation: {text!r}")
break
start, end = m.span()
punctuation = text[:start]
word = text[start:end]
text = text[end:]
if punctuation:
print(f"punctuation: {punctuation!r}")
print(f"possible word: {word!r}")
possible word: 'foo'
punctuation: ' '
possible word: 'bar'
punctuation: ', '
possible word: 'baz'
我觉得您正在尝试处理故意拼写错误/分解的单词,例如如果有人试图绕过论坛黑名单规则或言论分析。
那么,更好的方法将是:
- 使用字典识别可能是 "word" 或 "non-word" 的内容
- 然后把正文拆开
如果原始文本是为了避开计算机但人类可读,那么最好的选择是 ML/AI,最有可能是神经网络,例如用于识别图像中的对象的 RNN。