我被困住了,需要一点指导.我正在努力使用Grok Learning自己学习Python.下面是问题和示例输出以及我在代码中的位置.我感谢任何有助于我解决此问题的提示.
在语言学中,二元组是句子中的一对相邻单词.句子" 大红球 "有三首大佬:大红色,大红色和红色球.
编写一个程序来读取来自用户的多行输入,其中每一行是一个以空格分隔的单词.然后,您的程序应该计算所有输入句子中每个双字母组合出现的次数.应通过将输入行转换为小写来以不区分大小写的方式处理双字母组.一旦用户停止输入输入,您的程序应打印出多次出现的每个双字母组及其相应的频率.例如:
Run Code Online (Sandbox Code Playgroud)Line: The big red ball Line: The big red ball is near the big red box Line: I am near the box Line: near the: 2 red ball: 2 the big: 3 big red: 3
我的代码并没有走得太远,我真的陷入困境.但这就是我的位置:
words = set()
line = input("Line: ")
while line != '':
words.add(line)
line = input("Line: ")
Run Code Online (Sandbox Code Playgroud)
我甚至这样做了吗?尽量不要导入任何模块,只需使用内置功能.
谢谢,杰夫
让我们从接收句子(带标点符号)的函数开始,并返回找到的所有小写双字母组的列表.
因此,我们首先需要从句子中删除所有非字母数字,将所有字母转换为小写对应字符,然后将空格分隔为单词列表:
import re
def bigrams(sentence):
text = re.sub('\W', ' ', sentence.lower())
words = text.split()
return zip(words, words[1:])
Run Code Online (Sandbox Code Playgroud)
我们将使用标准(内置)re包进行基于正则表达式的非字母数字替换空格,以及内置zip函数来配置连续单词.(我们将单词列表与相同的列表配对,但是移动了一个元素.)
现在我们可以测试一下:
>>> bigrams("The big red ball")
[('the', 'big'), ('big', 'red'), ('red', 'ball')]
>>> bigrams("THE big, red, ball.")
[('the', 'big'), ('big', 'red'), ('red', 'ball')]
>>> bigrams(" THE big,red,ball!!?")
[('the', 'big'), ('big', 'red'), ('red', 'ball')]
Run Code Online (Sandbox Code Playgroud)
接下来,为了计算每个句子中的bigrams,你可以使用collections.Counter.
例如,像这样:
from collections import Counter
counts = Counter()
for line in ["The big red ball", "The big red ball is near the big red box", "I am near the box"]:
counts.update(bigrams(line))
Run Code Online (Sandbox Code Playgroud)
我们得到:
>>> Counter({('the', 'big'): 3, ('big', 'red'): 3, ('red', 'ball'): 2, ('near', 'the'): 2, ('red', 'box'): 1, ('i', 'am'): 1, ('the', 'box'): 1, ('ball', 'is'): 1, ('am', 'near'): 1, ('is', 'near'): 1})
Run Code Online (Sandbox Code Playgroud)
现在我们只需要打印出现不止一次的那些:
for bigr, cnt in counts.items():
if cnt > 1:
print("{0[0]} {0[1]}: {1}".format(bigr, cnt))
Run Code Online (Sandbox Code Playgroud)
全部放在一起,带有一个用户输入循环,而不是固定列表:
import re
from collections import Counter
def bigrams(sentence):
text = re.sub('\W', ' ', sentence.lower())
words = text.split()
return zip(words, words[1:])
counts = Counter()
while True:
line = input("Line: ")
if not line:
break
counts.update(bigrams(line))
for bigr, cnt in counts.items():
if cnt > 1:
print("{0[0]} {0[1]}: {1}".format(bigr, cnt))
Run Code Online (Sandbox Code Playgroud)
输出:
Line: The big red ball
Line: The big red ball is near the big red box
Line: I am near the box
Line:
near the: 2
red ball: 2
big red: 3
the big: 3
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1664 次 |
| 最近记录: |