如何重构我的词频方法?

时间:2018-10-28 19:11:53

标签: ruby refactoring

这是我的方法<UserControl x:Class="MyCompany.MyAppName.App.View.MyAppView" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:MyCompany.MyAppName.App.View" xmlns:viewModel="clr-namespace:MyCompany.MyAppName.App.ViewModel" xmlns:view="clr-namespace:MyCompany.MyAppName.App.View" xmlns:res="clr-namespace:MyCompany.MyAppName.App.Assets" xmlns:util="clr-namespace:MyCompany.MyAppName.App.Utils" mc:Ignorable="d" x:Name="configuratorControl" d:DesignHeight="600" d:DesignWidth="600" > <UserControl.Resources> <util:PercentageConverter x:Key="percentageConverter"/> <DataTemplate DataType="{x:Type viewModel:ObjectSelectionViewModel}"> <view:ObjectSelectionPageView/> </DataTemplate> <DataTemplate DataType="{x:Type viewModel:CurrentObjectComponentsViewModel}"> <view:CurrentObjectComponentsView/> </DataTemplate> <DataTemplate DataType="{x:Type viewModel:CurrentObjectOptionsViewModel}"> <view:CurrentObjectOptionsView/> </DataTemplate> <DataTemplate DataType="{x:Type viewModel:SageFourViewModel}"> <view:SageFourView/> </DataTemplate> <DataTemplate DataType="{x:Type viewModel:SageThreeViewModel}"> <view:SageThreeView/> </DataTemplate> <DataTemplate DataType="{x:Type viewModel:ObjectViewModel}"> <view:MyNumberView/> </DataTemplate> <Style TargetType="{x:Type Button}"> <Setter Property="Padding" Value="3.5,0" /> <Setter Property="Margin" Value="3.5" /> <Setter Property="MinWidth" Value="80" /> <Setter Property="FontSize" Value="15"/> <Setter Property="FontWeight" Value="Regular"/> </Style> <!-- This Style inherits from the Button style seen above. --> <Style BasedOn="{StaticResource {x:Type Button}}" TargetType="{x:Type Button}" x:Key="moveNextButtonStyle"> <Setter Property="Content" Value="{x:Static res:Strings.MyAppView_Button_MoveNext}" /> <Style.Triggers> <DataTrigger Binding="{Binding Path=IsOnLastPage}" Value="True"> <Setter Property="Content" Value="{x:Static res:Strings.SageThreeView_Confirm}" /> </DataTrigger> <DataTrigger Binding="{Binding Path=IsOnCreateSageThreePage}" Value="True"> <Setter Property="Content" Value="{x:Static res:Strings.MyAppView_Button_CreateSageThree}" /> </DataTrigger> </Style.Triggers> </Style> <Style BasedOn="{StaticResource {x:Type Button}}" TargetType="{x:Type Button}" x:Key="cancelButtonStyle"> <Setter Property="Content" Value="{x:Static res:Strings.MyAppView_Button_Cancel}" /> <Style.Triggers> <DataTrigger Binding="{Binding Path=IsOnLastPage}" Value="True"> <Setter Property="Content" Value="{x:Static res:Strings.MyAppView_Button_ExportPDF}" /> </DataTrigger> </Style.Triggers> </Style> <Style BasedOn="{StaticResource {x:Type Button}}" TargetType="{x:Type Button}" x:Key="movePreviousButtonStyle"> <Setter Property="Content" Value="{x:Static res:Strings.MyAppView_Button_MovePrevious}" /> </Style> <!-- HEADERED CONTENT CONTROL STYLE --> <Style TargetType="{x:Type HeaderedContentControl}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type HeaderedContentControl}"> <StackPanel Margin="2,0"> <Grid Margin="1,1,1,12" RenderTransformOrigin="0.5,0.5"> <Rectangle Fill="{DynamicResource {x:Static SystemColors.AppWorkspaceBrushKey}}" Height="3" Margin="10,-4" Opacity="0.6" RadiusX="8" RadiusY="8" VerticalAlignment="Bottom" /> <ContentPresenter ContentSource="Header" TextBlock.FontSize="22" TextBlock.FontWeight="DemiBold" TextBlock.Foreground="Black" HorizontalAlignment="Center" VerticalAlignment="Center" OpacityMask="Black" /> <Grid.Effect> <DropShadowEffect Opacity="0.1" /> </Grid.Effect> <Grid.RenderTransform> <RotateTransform Angle="0" /> </Grid.RenderTransform> </Grid> <Grid> <Rectangle Fill="{TemplateBinding Background}" /> <ContentPresenter ContentSource="Content" /> </Grid> </StackPanel> </ControlTemplate> </Setter.Value> </Setter> </Style> <DataTemplate x:Key="workflowStepTemplate"> <Border x:Name="bdOuter" BorderBrush="Black" BorderThickness="0,0,1,1" CornerRadius="12" Margin="1,1,1,12" Opacity="0.25" SnapsToDevicePixels="True"> <Border x:Name="bdInner" Background="White" BorderBrush="DarkBlue" BorderThickness="2,2,1,1" CornerRadius="12" Padding="2"> <TextBlock x:Name="txt" Margin="4,0,0,0" FontSize="15" FontWeight="Light" Text="{Binding Path=DisplayName}" /> </Border> </Border> <DataTemplate.Triggers> <DataTrigger Binding="{Binding Path=IsCurrentPage}" Value="True"> <Setter TargetName="txt" Property="FontWeight" Value="SemiBold" /> <Setter TargetName="bdInner" Property="Background" Value="White" /> <Setter TargetName="bdOuter" Property="Opacity" Value="1" /> </DataTrigger> </DataTemplate.Triggers> </DataTemplate> </UserControl.Resources> <Canvas HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="{Binding ActualWidth, ElementName=configuratorControl}" Height="{Binding ActualHeight, ElementName=configuratorControl}"> <Canvas x:Name="searchCanvas" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Panel.ZIndex="3" Width="{Binding ActualWidth, ElementName=configuratorControl}" Height="{Binding ActualHeight, ElementName=configuratorControl}" Visibility="{Binding SearchBoxVisibility}"> <Grid Panel.ZIndex="4" Width="{Binding ActualWidth, ElementName=searchCanvas}" Height="{Binding ActualHeight, ElementName=searchCanvas}"> <StackPanel Panel.ZIndex="4" Orientation="Vertical" Width="270" Height="70" VerticalAlignment="Center" HorizontalAlignment="Center" > <StackPanel Orientation="Horizontal" > <TextBlock Margin="5" FontSize="15" Text="Serial Number:" Width="100" Height="25" TextAlignment="Center" VerticalAlignment="Center" HorizontalAlignment="Center" /> <TextBox Text="{Binding MyNumber, UpdateSourceTrigger=PropertyChanged}" Margin="5" Width="150" Height="25" /> </StackPanel> <DockPanel HorizontalAlignment="Stretch"> <Button Margin="5" Content="Dismiss" Width="100" HorizontalAlignment="Left" Command="{Binding DismissSearchDraftCommand}"/> <Button Margin="5" Content="Search" Width="100" HorizontalAlignment="Right" Command="{Binding StartSearchDraftCommand}"/> </DockPanel> </StackPanel> <Rectangle Panel.ZIndex="3" Fill="LightBlue" Width="300" Height="100" /> </Grid> <Rectangle Panel.ZIndex="2" Fill="LightGray" Opacity="0.4" Canvas.Left="0" Canvas.Top="0" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="{Binding ActualWidth, ElementName=configuratorControl}" Height="{Binding ActualHeight, ElementName=configuratorControl}" /> </Canvas> <Grid Background="#11000000" Margin="1" Panel.ZIndex="2" IsEnabled="{Binding GridResultsEnabled}" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Height="{Binding ActualHeight, ElementName=configuratorControl, Converter={StaticResource percentageConverter}, ConverterParameter=99.5}" Width="{Binding ActualWidth, ElementName=configuratorControl, Converter={StaticResource percentageConverter}, ConverterParameter=99.5}"> <Grid.BitmapEffect> <BlurBitmapEffect Radius="{Binding GridBoxBlur}" KernelType="Box" /> </Grid.BitmapEffect> <Grid.ColumnDefinitions> <ColumnDefinition Width="220" /> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="*" /> <RowDefinition Height="60" /> </Grid.RowDefinitions> <!-- Workflow step listing --> <HeaderedContentControl Header="{x:Static res:Strings.MyAppView_HeaderSteps}"> <ItemsControl ItemsSource="{Binding Path=Pages}" ItemTemplate="{StaticResource workflowStepTemplate}" /> </HeaderedContentControl> <Button FontSize="15" Style="{StaticResource HyperLinkButtonStyle}" Margin="20,20,20,140" VerticalAlignment="Bottom" HorizontalAlignment="Center" Content="{x:Static res:Strings.MyAppView_Button_Search_Full}" Command="{Binding Path=OpenSearchFullCommand}"/> <Button FontSize="15" Style="{StaticResource HyperLinkButtonStyle}" Margin="20,20,20,170" VerticalAlignment="Bottom" HorizontalAlignment="Center" Content="{x:Static res:Strings.MyAppView_Button_Search_Draft}" Command="{Binding Path=OpenSearchDraftCommand}"/> <Button Margin="20,295,20,20" Command="{Binding Path=StartAgainCommand}" Content="{x:Static res:Strings.SageThreeView_StartAgain}" VerticalAlignment="Top" /> <Image Grid.Column="0" Grid.Row="0" Source="..\Assets\SplashLogo.png" HorizontalAlignment="Center" VerticalAlignment="Bottom" Stretch="None" Margin="20,20,20,20"/> <!-- CURRENT PAGE AREA --> <Border Background="White" Grid.Column="1" Grid.Row="0"> <ScrollViewer> <HeaderedContentControl Content="{Binding Path=CurrentPage}" Header="{Binding Path=CurrentPage.DisplayName}" /> </ScrollViewer> </Border> <Border Grid.Column="0" Grid.Row="1" Background="LightGray" Grid.ColumnSpan="2"> <Grid > <Grid.ColumnDefinitions> <ColumnDefinition Width="Auto" /> <ColumnDefinition Width="*" /> <ColumnDefinition Width="Auto" /> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="*" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <TextBlock Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="5" Margin="4" FontSize="15" Text="{Binding Path=SageThreeStatus}" VerticalAlignment="Center" Visibility="{Binding Path=ShowSageThreeStatus}" /> <!-- NAVIGATION BUTTONS --> <Grid Grid.Column="2" Grid.Row="0" Grid.IsSharedSizeScope="True" HorizontalAlignment="Right" > <Grid.ColumnDefinitions> <ColumnDefinition SharedSizeGroup="Buttons" /> <ColumnDefinition SharedSizeGroup="Buttons" /> <ColumnDefinition SharedSizeGroup="Buttons" /> <ColumnDefinition SharedSizeGroup="Buttons" /> </Grid.ColumnDefinitions> <Button Grid.Column="1" Grid.Row="0" Command="{Binding Path=MovePreviousCommand}" Style="{StaticResource movePreviousButtonStyle}" /> <Button Grid.Column="2" Grid.Row="0" Command="{Binding Path=MoveNextCommand}" Style="{StaticResource moveNextButtonStyle}" /> <Button Grid.Column="3" Grid.Row="0" Command="{Binding Path=CancelCommand}" Style="{StaticResource cancelButtonStyle}" /> </Grid> </Grid> </Border> </Grid> </Canvas> </UserControl>

word_frequency

效果很好,但我认为我可以做得更好。鲁波科普说我的台词太长了,我同意,但这是我最好的。有人可以解释我如何做得更好吗?

2 个答案:

答案 0 :(得分:2)

如果您只分解主要部分,那将是很好的。 most_common_words似乎仍然很微妙,您可以解释您要尝试做的事情,以了解在那里还能做些什么。

您还可以使用frequencies,并查看方法参数中的模式,此处的OOP方法会更好。

def join_file(file_name)
  File.open(file_name).read.downcase.strip.split.join(' ')
end

def frequencies(text)
  text.split.each_with_object(Hash.new(0)) { |word, hash| hash[word] += 1 }
end

def opened_file_string(file_name)
  join_file(file_name).gsub(/[^a-zA-Z \'$]/, '').gsub(/'s/, '').split
end

def opened_stop_file_string(file_name)
  @opened_stop_file_string ||= join_file(file_name).gsub(/[^a-zA-Z \']/, '').gsub(/'s/, '').split
end

def in_stop_file_string?(file_name, word)
  opened_stop_file_string(file_name).include?(word)
end

def filtered_array(file_name, stop_words_file_name)
  opened_file_string(file_name).reject do |word|
    in_stop_file_string?(stop_words_file_name, word)
  end
end

def frequencies_in_filtered_array(file_name, stop_words_file_name)
  frequencies(filtered_array(file_name, stop_words_file_name)).sort_by { |_, value| value }
end

def most_common_words(file_name, stop_words_file_name, number_of_word)
  frequencies_in_filtered_array(file_name.to_s, stop_words_file_name.to_s).reverse[0...number_of_word].to_h
end

答案 1 :(得分:1)

这比较干净,使用多行方法链接等。

def frequencies(text)
  words = text.split
  the_frequencies = Hash.new(0)
  words.each do |word|
    the_frequencies[word] += 1
  end
  the_frequencies
end

def pre_process_file(file_name)
  File.open(file_name.to_s)
      .read.downcase.strip.split.join(" ")
      .gsub(/[^a-zA-Z \'$]/, "")
      .gsub(/'s/, "")
      .split
end

def most_common_words(file_name, stop_words_file_name, number_of_word)
  # TODO: return hash of occurences of number_of_word most frequent words
  opened_file_string = pre_process_file(file_name)
  opened_stop_file_string = pre_process_file(stop_words_file_name)
  # declarar variables de file_name stop words.
  filtered_array = opened_file_string
                    .reject { |n| opened_stop_file_string.include? n }

  the_frequencies = Hash.new(0)
  filtered_array.each { |word| the_frequencies[word] += 1 }
  the_frequencies
    .sort_by { |_k, value| value }
    .reverse[0..number_of_word - 1]
    .to_h
end
相关问题