- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试对大型文本文件中最常用的词进行排名 - - 爱丽丝梦游仙境(公共(public)领域)。这是爱丽丝梦游仙境 Dropbox和 Pastebin .它按预期运行,有 1818 个“the”实例和 940 个“and”实例。
但现在在我最新的脚本迭代中,我试图过滤掉最常用的词,例如“and”、“there”、“the”、“that”、“to”、“a”等等。任何搜索算法都会寻找像这样的词(在 SEO 术语中称为 stop words)并将它们从查询中排除。我为此任务导入的 Python 库是 nltk.corpus .
当我生成停用词列表并调用过滤器时,“the”和“of”的所有实例都按预期过滤掉了,但它没有捕获“and”或“you”。我不清楚为什么。
我已经尝试通过手动和显式添加出现在输出中不应该出现的词来加强停用词列表。我添加了“said”、“you”、“that”等,但它们仍然出现在文本文件中最常用的前 10 个词中。
这是我的脚本:
from collections import Counter
from nltk.corpus import stopwords
import re
def open_file():
with open('Alice.txt') as f:
text = f.read().lower()
return text
def main(text):
stoplist = stopwords.words('english') # Bring in the default English NLTK stop words
stoplist.extend(["said", "i", "it", "you", "and","that",])
# print(stoplist)
clean = [word for word in text.split() if word not in stoplist]
clean_text = ' '.join(clean)
words = re.findall('\w+', clean_text)
top_10 = Counter(words).most_common(10)
for word,count in top_10:
print(f'{word!r:<4} {"-->":^4} {count:>4}')
if __name__ == "__main__":
text = open_file()
main(text)
这是我的实际输出:
$ python script8.py
'alice' --> 403
'i' --> 283
'it' --> 205
's' --> 184
'little' --> 128
'you' --> 115
'and' --> 107
'one' --> 106
'gutenberg' --> 93
'that' --> 92
我期望的是“我”、“它”和“你”的所有实例都被排除在这个列表之外,但它们仍然出现,我不清楚为什么。
最佳答案
您的代码执行此操作:
首先,您使用 text.split()
在空白处拆分文本。但是生成的“单词”列表仍然包含标点符号,例如 as,
、head!'
和 'i
(请注意 '
用作引号和撇号)。
然后您排除所有在 stopwords
中匹配的“词”。这将排除 i
但不排除 'i
。
接下来您使用空格重新连接所有剩余的单词。
然后您使用 '\w+'
正则表达式搜索字母序列(不包括标点符号):因此 'i
将匹配为 我
。这就是 i
和 s
出现在前 10 名中的原因。
有几种方法可以解决这个问题。例如,您可以使用 re.split()
来拆分不仅仅是空格:
def main(text):
stoplist = stopwords.words('english')
stoplist.extend(["said"]) # stoplist already includes "i", "it", "you"
clean = [word for word in re.split(r"\W+", text) if word not in stoplist]
top_10 = Counter(clean).most_common(10)
for word,count in top_10:
print(f'{word!r:<4} {"-->":^4} {count:>4}')
输出:
'alice' --> 403
'little' --> 128
'one' --> 106
'gutenberg' --> 93
'know' --> 88
'project' --> 87
'like' --> 85
'would' --> 83
'went' --> 83
'could' --> 78
请注意,这是分别处理带连字符的短语:so gutenberg-tm
-> gutenberg
, tm
。为了更好地控制这个,你可以关注Jay's。建议看看nltk.tokenize .例如,nltk 分词器知道收缩,所以 don't
-> do
+ n't
。
您还可以通过从文本中删除古腾堡许可条件来改进内容:)
关于python - 从大文本文件中过滤停用词(使用包 : nltk. 语料库),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56436291/
我有以下案例要解决。 在短语中突出显示关键字的 Javascript 方法。 vm.highlightKeywords = (phrase, keywords) => { keywords =
我要匹配文本中的所有美元符号单词。例如,"Hello $VARONE this is $VARTWO"可以匹配$VARONE和$VARTWO。 正则表达式应该是/\$(\w+)/g,但是当我在Dart
在 redux 中,对于将状态作为参数、更改状态并返回新状态的特定操作,您会在 switch 语句中调用什么函数? function reducer(state = DEFAULT_STATE, ac
在 MySQL 5.1 中,我将一个字段命名为“Starting”。但是,每次我使用 SQL 查询时,它都会说无效的 SQL 语法。经过一些谷歌搜索,我发现 STARTING 是一个保留的 SQL 词
我必须使用函数 isIn(secretWord,lettersGuessed) 从列表中找到密码。在下面发布我的代码。 def isWordGuessed(secretWord, lettersGue
一段时间以来,我一直无法找到两个字符串中最长的常用词。首先我想到了用“isspace”函数来做这件事,但不知道如何找到一个常用词。然后我想到了“strcmp”,但到目前为止我只能比较两个字符串。我在想
我目前正在尝试制作一种“单词混合器”:对于两个给定的单词和指定的所需长度,程序应返回这两个单词的“混合”。然而,它可以是任何类型的混合:它可以是第一个单词的前半部分与第二个单词的后半部分相结合,它可以
如果 After 之后(逗号之前)没有 -ing 词,我想匹配它。所以 After 和逗号之间不应该有 -ing 词。 所需的匹配项(粗体): After sitting down, he began
我一直在试验 Stanford NLP 工具包及其词形还原功能。我很惊讶它如何使一些词词形还原。例如: depressing -> depressing depressed -> depressed
js 并尝试根据 [这里] 中的示例代码来做词云:https://github.com/jasondavies/d3-cloud .我想做的是单词的字体大小是基于数组中单词的频率。例如我有 [a,a,
我正在处理一个文本分类问题(在法语语料库上),并且正在试验不同的词嵌入。我对 ConceptNet 提供的内容非常感兴趣,所以我决定试一试。 我无法为我的特定任务找到专门的教程,所以我听取了他们的建议
当我在文本中搜索时,我输入 C-s,然后输入单词,然后一次又一次地输入 C-s,光标前进到找到的单词的下一个位置。问题是,一旦我转到下一个单词,我无法在按钮处编辑迷你缓冲区中的搜索单词,如果我按 Ba
我正在尝试按照以下结构运行这个 maven Hello Word: ├── pom.xml └── src └── Main.java 使用pom.xml设置: 4.0.0
所以,从我可以开始的.. 我正在使用 OCR。该脚本非常适合我的需要。它检测单词的准确性对我来说还可以。 这是结果:附加图像 100% 准确。 from PIL import Image import
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想要改善这个问题吗?更新问题,以便将其作为on-topi
这是细节,但我想知道为什么会这样。 示例代码: Class klasa = Enum.class; for(Type t : klasa.getGenericInterfaces()) Syst
我在用: var header = ""+ "Export HTML to Word Document with JavaScript"; var footer = ""; /
我有一个程序可以像这样将数据打印到控制台(以空格分隔): variable1 value1 variable2 value2 variable3 value3 varialbe4 value4 编辑:
我有一个程序可以像这样将数据打印到控制台(以空格分隔): variable1 value1 variable2 value2 variable3 value3 varialbe4 value4 编辑:
最近我在查看与goliath相关的一些代码时,偶然在Ruby代码中看到了这个词use。 , 中间件等。看起来它不同于include/extend, and require. 有人可以解释为什么存在这个
我是一名优秀的程序员,十分优秀!